/ Hex Artifact Content
Login

Artifact c3837ad57cea1351cd824a646836d2bb678f264ae160d691b632d495c8be2f5b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c40: 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1c50: 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44 69  vel==0 );  /* Di
1c60: 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65 6e  sables and re-en
1c70: 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a 20  ables match */. 
1c80: 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d 20     /* A minimum 
1c90: 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20 69 73  of one cursor is
1ca0: 20 72 65 71 75 69 72 65 64 20 69 66 20 61 75 74   required if aut
1cb0: 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75 73  oincrement is us
1cc0: 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20 74 69  ed.    *  See ti
1cd0: 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63 31 66  cket [a696379c1f
1ce0: 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69 66  08866] */.    if
1cf0: 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 21  ( pParse->pAinc!
1d00: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54  =0 && pParse->nT
1d10: 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d 3e  ab==0 ) pParse->
1d20: 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 73 71  nTab = 1;.    sq
1d30: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
1d40: 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b 0a 20  dy(v, pParse);. 
1d50: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
1d60: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
1d70: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65  else{.    pParse
1d80: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
1d90: 52 4f 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ROR;.  }.}../*.*
1da0: 2a 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72  * Run the parser
1db0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
1dc0: 74 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20  tor recursively 
1dd0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65  in order to gene
1de0: 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72  rate.** code for
1df0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
1e00: 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68  nt given onto th
1e10: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61  e end of the pPa
1e20: 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63  rse context.** c
1e30: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
1e40: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68  onstruction.  Wh
1e50: 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73  en the parser is
1e60: 20 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79   run recursively
1e70: 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68  .** this way, th
1e80: 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20  e final OP_Halt 
1e90: 69 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20  is not appended 
1ea0: 61 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61  and other initia
1eb0: 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  lization.** and 
1ec0: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65  finalization ste
1ed0: 70 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62  ps are omitted b
1ee0: 65 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65  ecause those are
1ef0: 20 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65   handling by the
1f00: 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61  .** outermost pa
1f10: 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20  rser..**.** Not 
1f20: 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65  everything is ne
1f30: 73 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61  stable.  This fa
1f40: 63 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e  cility is design
1f50: 65 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20  ed to permit.** 
1f60: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20  INSERT, UPDATE, 
1f70: 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61  and DELETE opera
1f80: 74 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51  tions against SQ
1f90: 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73  LITE_MASTER.  Us
1fa0: 65 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75  e.** care if you
1fb0: 20 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74   decide to try t
1fc0: 6f 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69  o use this routi
1fd0: 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ne for some othe
1fe0: 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76  r purposes..*/.v
1ff0: 6f 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65  oid sqlite3Neste
2000: 64 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50  dParse(Parse *pP
2010: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
2020: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
2030: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
2040: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63   char *zSql;.  c
2050: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
2060: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2070: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2080: 63 68 61 72 20 73 61 76 65 42 75 66 5b 50 41 52  char saveBuf[PAR
2090: 53 45 5f 54 41 49 4c 5f 53 5a 5d 3b 0a 0a 20 20  SE_TAIL_SZ];..  
20a0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
20b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
20c0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73  ert( pParse->nes
20d0: 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65  ted<10 );  /* Ne
20e0: 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c  sting should onl
20f0: 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20  y be of limited 
2100: 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74  depth */.  va_st
2110: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
2120: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
2130: 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a  e3VMPrintf(db, z
2140: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
2150: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
2160: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
2170: 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d  return;   /* A m
2180: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
2190: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  failed */.  }.  
21a0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b  pParse->nested++
21b0: 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42  ;.  memcpy(saveB
21c0: 75 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 28 70  uf, PARSE_TAIL(p
21d0: 50 61 72 73 65 29 2c 20 50 41 52 53 45 5f 54 41  Parse), PARSE_TA
21e0: 49 4c 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74  IL_SZ);.  memset
21f0: 28 50 41 52 53 45 5f 54 41 49 4c 28 70 50 61 72  (PARSE_TAIL(pPar
2200: 73 65 29 2c 20 30 2c 20 50 41 52 53 45 5f 54 41  se), 0, PARSE_TA
2210: 49 4c 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  IL_SZ);.  sqlite
2220: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
2230: 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73  e, zSql, &zErrMs
2240: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
2250: 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
2260: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2270: 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d  e(db, zSql);.  m
2280: 65 6d 63 70 79 28 50 41 52 53 45 5f 54 41 49 4c  emcpy(PARSE_TAIL
2290: 28 70 50 61 72 73 65 29 2c 20 73 61 76 65 42 75  (pParse), saveBu
22a0: 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a  f, PARSE_TAIL_SZ
22b0: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73  );.  pParse->nes
22c0: 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51  ted--;.}..#if SQ
22d0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
22e0: 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52  TICATION./*.** R
22f0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a 54  eturn TRUE if zT
2300: 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65  able is the name
2310: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 74   of the system t
2320: 61 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73  able that stores
2330: 20 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20   the.** list of 
2340: 75 73 65 72 73 20 61 6e 64 20 74 68 65 69 72 20  users and their 
2350: 61 63 63 65 73 73 20 63 72 65 64 65 6e 74 69 61  access credentia
2360: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
2370: 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28  e3UserAuthTable(
2380: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2390: 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  le){.  return sq
23a0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54  lite3_stricmp(zT
23b0: 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75 73  able, "sqlite_us
23c0: 65 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  er")==0;.}.#endi
23d0: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  f../*.** Locate 
23e0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
23f0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
2400: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
2410: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
2420: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
2430: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
2440: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
2450: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
2460: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2470: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
2480: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
2490: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
24a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
24b0: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
24c0: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
24d0: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
24e0: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
24f0: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
2500: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
2510: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
2520: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
2530: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
2540: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
2550: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
2560: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2570: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
2580: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
2590: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
25a0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
25b0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
25c0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
25d0: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
25e0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
25f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
2600: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2610: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
2620: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
2630: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
2640: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  ;..  /* All mute
2650: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2660: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2670: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2680: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
2690: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
26a0: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
26b0: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
26c0: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69 66  texes(db) );.#if
26d0: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
26e0: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f 2a  HENTICATION.  /*
26f0: 20 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e 20   Only the admin 
2700: 75 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20  user is allowed 
2710: 74 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  to know that the
2720: 20 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62   sqlite_user tab
2730: 6c 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20 2a  le.  ** exists *
2740: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68  /.  if( db->auth
2750: 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48  .authLevel<UAUTH
2760: 5f 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74 65  _Admin && sqlite
2770: 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 7a  3UserAuthTable(z
2780: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
2790: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
27a0: 6e 64 69 66 0a 20 20 77 68 69 6c 65 28 31 29 7b  ndif.  while(1){
27b0: 0a 20 20 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  .    for(i=OMIT_
27c0: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
27d0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
27e0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
27f0: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
2800: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
2810: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69 66  MAIN */.      if
2820: 28 20 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 7c  ( zDatabase==0 |
2830: 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  | sqlite3StrICmp
2840: 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e  (zDatabase, db->
2850: 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29  aDb[j].zDbSName)
2860: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
2870: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
2880: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
2890: 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  , j, 0) );.     
28a0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
28b0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b  shFind(&db->aDb[
28c0: 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  j].pSchema->tblH
28d0: 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ash, zName);.   
28e0: 20 20 20 20 20 69 66 28 20 70 20 29 20 72 65 74       if( p ) ret
28f0: 75 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20  urn p;.      }. 
2900: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4e 6f 74 20     }.    /* Not 
2910: 66 6f 75 6e 64 2e 20 20 49 66 20 74 68 65 20 6e  found.  If the n
2920: 61 6d 65 20 77 65 20 77 65 72 65 20 6c 6f 6f 6b  ame we were look
2930: 69 6e 67 20 66 6f 72 20 77 61 73 20 74 65 6d 70  ing for was temp
2940: 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20  .sqlite_master. 
2950: 20 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67     ** then chang
2960: 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 73 71  e the name to sq
2970: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
2980: 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
2990: 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
29a0: 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c  e3StrICmp(zName,
29b0: 20 4d 41 53 54 45 52 5f 4e 41 4d 45 29 21 3d 30   MASTER_NAME)!=0
29c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
29d0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
29e0: 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d  p(zDatabase, db-
29f0: 3e 61 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[1].zDbSName
2a00: 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
2a10: 20 20 7a 4e 61 6d 65 20 3d 20 54 45 4d 50 5f 4d    zName = TEMP_M
2a20: 41 53 54 45 52 5f 4e 41 4d 45 3b 0a 20 20 7d 0a  ASTER_NAME;.  }.
2a30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2a40: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
2a50: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
2a60: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
2a70: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
2a80: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
2a90: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
2aa0: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
2ab0: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
2ac0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
2ad0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
2ae0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
2af0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
2b00: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c  f not found.  Al
2b10: 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65  so leave an.** e
2b20: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
2b30: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
2b40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
2b50: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
2b60: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73  is routine and s
2b70: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2b80: 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
2b90: 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73  * routine leaves
2ba0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2bb0: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
2bc0: 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71  rMsg where.** sq
2bd0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29  lite3FindTable()
2be0: 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61   does not..*/.Ta
2bf0: 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  ble *sqlite3Loca
2c00: 74 65 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  teTable(.  Parse
2c10: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2c20: 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20    /* context in 
2c30: 77 68 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20  which to report 
2c40: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 33 32 20  errors */.  u32 
2c50: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2c60: 20 20 20 2f 2a 20 4c 4f 43 41 54 45 5f 56 49 45     /* LOCATE_VIE
2c70: 57 20 6f 72 20 4c 4f 43 41 54 45 5f 4e 4f 45 52  W or LOCATE_NOER
2c80: 52 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  R */.  const cha
2c90: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  r *zName,     /*
2ca0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
2cb0: 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  le we are lookin
2cc0: 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  g for */.  const
2cd0: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20   char *zDbase   
2ce0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2cf0: 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68   database.  Migh
2d00: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
2d10: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f    Table *p;..  /
2d20: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
2d30: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
2d40: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2d50: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
2d60: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
2d70: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
2d80: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
2d90: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
2da0: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
2db0: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
2dc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2dd0: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
2de0: 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
2df0: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  e->db, zName, zD
2e00: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
2e10: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
2e20: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 66 6c 61 67  har *zMsg = flag
2e30: 73 20 26 20 4c 4f 43 41 54 45 5f 56 49 45 57 20  s & LOCATE_VIEW 
2e40: 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22  ? "no such view"
2e50: 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c   : "no such tabl
2e60: 65 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e";.#ifndef SQLI
2e70: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2e80: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 73 71 6c  ABLE.    if( sql
2e90: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 70  ite3FindDbName(p
2ea0: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 44 62 61 73  Parse->db, zDbas
2eb0: 65 29 3c 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  e)<1 ){.      /*
2ec0: 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 74 68 65   If zName is the
2ed0: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
2ee0: 20 61 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   a table in the 
2ef0: 73 63 68 65 6d 61 20 63 72 65 61 74 65 64 20 75  schema created u
2f00: 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 43 52  sing.      ** CR
2f10: 45 41 54 45 2c 20 74 68 65 6e 20 63 68 65 63 6b  EATE, then check
2f20: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 69 73   to see if it is
2f30: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
2f40: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
2f50: 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20  at.      ** can 
2f60: 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20  be an eponymous 
2f70: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 2a  virtual table. *
2f80: 2f 0a 20 20 20 20 20 20 4d 6f 64 75 6c 65 20 2a  /.      Module *
2f90: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29  pMod = (Module*)
2fa0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2fb0: 26 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4d 6f  &pParse->db->aMo
2fc0: 64 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  dule, zName);.  
2fd0: 20 20 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20      if( pMod==0 
2fe0: 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  && sqlite3_strni
2ff0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67  cmp(zName, "prag
3000: 6d 61 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20  ma_", 7)==0 ){. 
3010: 20 20 20 20 20 20 20 70 4d 6f 64 20 3d 20 73 71         pMod = sq
3020: 6c 69 74 65 33 50 72 61 67 6d 61 56 74 61 62 52  lite3PragmaVtabR
3030: 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2d 3e  egister(pParse->
3040: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
3050: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4d    }.      if( pM
3060: 6f 64 20 26 26 20 73 71 6c 69 74 65 33 56 74 61  od && sqlite3Vta
3070: 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 49  bEponymousTableI
3080: 6e 69 74 28 70 50 61 72 73 65 2c 20 70 4d 6f 64  nit(pParse, pMod
3090: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
30a0: 75 72 6e 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61  urn pMod->pEpoTa
30b0: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
30c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
30d0: 28 66 6c 61 67 73 20 26 20 4c 4f 43 41 54 45 5f  (flags & LOCATE_
30e0: 4e 4f 45 52 52 29 3d 3d 30 20 29 7b 0a 20 20 20  NOERR)==0 ){.   
30f0: 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b     if( zDbase ){
3100: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3110: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3120: 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d   "%s: %s.%s", zM
3130: 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d  sg, zDbase, zNam
3140: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
3150: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3160: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3170: 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c   "%s: %s", zMsg,
3180: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
3190: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
31a0: 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
31b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
31c0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
31d0: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
31e0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 2a   identified by *
31f0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
3200: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
3210: 64 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  d sqlite3LocateT
3220: 61 62 6c 65 28 29 2e 20 54 68 65 20 64 69 66 66  able(). The diff
3230: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a  erence between.*
3240: 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  * sqlite3LocateT
3250: 61 62 6c 65 28 29 20 61 6e 64 20 74 68 69 73 20  able() and this 
3260: 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 61 74  function is that
3270: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
3280: 65 73 74 72 69 63 74 73 0a 2a 2a 20 74 68 65 20  estricts.** the 
3290: 73 65 61 72 63 68 20 74 6f 20 73 63 68 65 6d 61  search to schema
32a0: 20 28 70 2d 3e 70 53 63 68 65 6d 61 29 20 69 66   (p->pSchema) if
32b0: 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e   it is not NULL.
32c0: 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79 20   p->pSchema may 
32d0: 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  be.** non-NULL i
32e0: 66 20 69 74 20 69 73 20 70 61 72 74 20 6f 66 20  f it is part of 
32f0: 61 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65  a view or trigge
3300: 72 20 70 72 6f 67 72 61 6d 20 64 65 66 69 6e 69  r program defini
3310: 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c  tion. See.** sql
3320: 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 29  ite3FixSrcList()
3330: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
3340: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c  .Table *sqlite3L
3350: 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 0a  ocateTableItem(.
3360: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3370: 20 0a 20 20 75 33 32 20 66 6c 61 67 73 2c 0a 20   .  u32 flags,. 
3380: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
3390: 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e  item *p.){.  con
33a0: 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  st char *zDb;.  
33b0: 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65  assert( p->pSche
33c0: 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74  ma==0 || p->zDat
33d0: 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66  abase==0 );.  if
33e0: 28 20 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  ( p->pSchema ){.
33f0: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
3400: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
3410: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
3420: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
3430: 7a 44 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  zDb = pParse->db
3440: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
3450: 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ame;.  }else{.  
3460: 20 20 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61    zDb = p->zData
3470: 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  base;.  }.  retu
3480: 72 6e 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  rn sqlite3Locate
3490: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 66 6c  Table(pParse, fl
34a0: 61 67 73 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a  ags, p->zName, z
34b0: 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  Db);.}../*.** Lo
34c0: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
34d0: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
34e0: 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20  t describes .** 
34f0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
3500: 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  ex given the nam
3510: 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a  e of that index.
3520: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20  ** and the name 
3530: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
3540: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
3550: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75  e index..** Retu
3560: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
3570: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
3580: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
3590: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
35a0: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
35b0: 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74  e.** table and t
35c0: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
35d0: 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72  g index is retur
35e0: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
35f0: 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63  ng.** for duplic
3600: 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  ate index names 
3610: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
3620: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a  earch order is.*
3630: 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  * TEMP first, th
3640: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
3650: 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  y auxiliary data
3660: 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75  bases added.** u
3670: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
3680: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65  command..*/.Inde
3690: 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  x *sqlite3FindIn
36a0: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
36b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
36c0: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
36d0: 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  zDb){.  Index *p
36e0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
36f0: 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20   /* All mutexes 
3700: 61 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  are required for
3710: 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20   schema access. 
3720: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f   Make sure we ho
3730: 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73  ld them. */.  as
3740: 73 65 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20  sert( zDb!=0 || 
3750: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
3760: 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
3770: 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  );.  for(i=OMIT_
3780: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
3790: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  b; i++){.    int
37a0: 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31   j = (i<2) ? i^1
37b0: 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68   : i;  /* Search
37c0: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49   TEMP before MAI
37d0: 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20  N */.    Schema 
37e0: 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  *pSchema = db->a
37f0: 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  Db[j].pSchema;. 
3800: 20 20 20 61 73 73 65 72 74 28 20 70 53 63 68 65     assert( pSche
3810: 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44  ma );.    if( zD
3820: 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  b && sqlite3StrI
3830: 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62  Cmp(zDb, db->aDb
3840: 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29 20 29 20  [j].zDbSName) ) 
3850: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
3860: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
3870: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
3880: 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20   j, 0) );.    p 
3890: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
38a0: 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  d(&pSchema->idxH
38b0: 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ash, zName);.   
38c0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
38d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
38e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d  }../*.** Reclaim
38f0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64   the memory used
3900: 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a   by an index.*/.
3910: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
3920: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
3930: 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 23 69  b, Index *p){.#i
3940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3950: 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69  T_ANALYZE.  sqli
3960: 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61  te3DeleteIndexSa
3970: 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a 23 65  mples(db, p);.#e
3980: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78  ndif.  sqlite3Ex
3990: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
39a0: 70 50 61 72 74 49 64 78 57 68 65 72 65 29 3b 0a  pPartIdxWhere);.
39b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
39c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 61  tDelete(db, p->a
39d0: 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  ColExpr);.  sqli
39e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
39f0: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66 28  >zColAff);.  if(
3a00: 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20 29 20   p->isResized ) 
3a10: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3a20: 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e 61 7a 43  , (void *)p->azC
3a30: 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  oll);.#ifdef SQL
3a40: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
3a50: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 71 6c 69  _OR_STAT4.  sqli
3a60: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f  te3_free(p->aiRo
3a70: 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  wEst);.#endif.  
3a80: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3a90: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  , p);.}../*.** F
3aa0: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c  or the index cal
3ab0: 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69  led zIdxName whi
3ac0: 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  ch is found in t
3ad0: 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c  he database iDb,
3ae0: 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20  .** unlike that 
3af0: 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54  index from its T
3b00: 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65  able then remove
3b10: 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a   the index from.
3b20: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  ** the index has
3b30: 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65  h table and free
3b40: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75   all memory stru
3b50: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
3b60: 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  d.** with the in
3b70: 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  dex..*/.void sql
3b80: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
3b90: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  eteIndex(sqlite3
3ba0: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
3bb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e  onst char *zIdxN
3bc0: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
3bd0: 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20 2a 70  Index;.  Hash *p
3be0: 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28  Hash;..  assert(
3bf0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3c00: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3c10: 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d   0) );.  pHash =
3c20: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70   &db->aDb[iDb].p
3c30: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b  Schema->idxHash;
3c40: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
3c50: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  te3HashInsert(pH
3c60: 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30  ash, zIdxName, 0
3c70: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
3c80: 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69  pIndex) ){.    i
3c90: 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  f( pIndex->pTabl
3ca0: 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65  e->pIndex==pInde
3cb0: 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  x ){.      pInde
3cc0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
3cd0: 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  x = pIndex->pNex
3ce0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
3cf0: 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
3d00: 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61      /* Justifica
3d10: 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29  tion of ALWAYS()
3d20: 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d 75 73  ;  The index mus
3d30: 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69 73 74  t be on the list
3d40: 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64   of.      ** ind
3d50: 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ices. */.      p
3d60: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
3d70: 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  e->pIndex;.     
3d80: 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
3d90: 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70  ) && p->pNext!=p
3da0: 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e  Index ){ p = p->
3db0: 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20 20 69  pNext; }.      i
3dc0: 66 28 20 41 4c 57 41 59 53 28 70 20 26 26 20 70  f( ALWAYS(p && p
3dd0: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29  ->pNext==pIndex)
3de0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   ){.        p->p
3df0: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
3e00: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
3e10: 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65    }.    freeInde
3e20: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
3e30: 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c   }.  db->flags |
3e40: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
3e50: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
3e60: 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20 74 68   Look through th
3e70: 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20 64  e list of open d
3e80: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 69 6e  atabase files in
3e90: 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64 20 69   db->aDb[] and i
3ea0: 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20 62 65  f.** any have be
3eb0: 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d 6f 76  en closed, remov
3ec0: 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20  e them from the 
3ed0: 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63 61 74  list.  Reallocat
3ee0: 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61 44 62  e the.** db->aDb
3ef0: 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  [] structure to 
3f00: 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65 2c 20  a smaller size, 
3f10: 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a  if possible..**.
3f20: 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68 65 20  ** Entry 0 (the 
3f30: 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73 65 29  "main" database)
3f40: 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28 74 68   and entry 1 (th
3f50: 65 20 22 74 65 6d 70 22 20 64 61 74 61 62 61 73  e "temp" databas
3f60: 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65 72 20  e).** are never 
3f70: 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 62  candidates for b
3f80: 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64 2e 0a  eing collapsed..
3f90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
3fa0: 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41  ollapseDatabaseA
3fb0: 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62  rray(sqlite3 *db
3fc0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
3fd0: 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62   for(i=j=2; i<db
3fe0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
3ff0: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
4000: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
4010: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
4020: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
4030: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
4040: 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 3b 0a 20 20  b->zDbSName);.  
4050: 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d      pDb->zDbSNam
4060: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  e = 0;.      con
4070: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
4080: 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20   if( j<i ){.    
4090: 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64    db->aDb[j] = d
40a0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d  b->aDb[i];.    }
40b0: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
40c0: 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69  db->nDb = j;.  i
40d0: 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26  f( db->nDb<=2 &&
40e0: 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44   db->aDb!=db->aD
40f0: 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d  bStatic ){.    m
4100: 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61  emcpy(db->aDbSta
4110: 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a  tic, db->aDb, 2*
4120: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30  sizeof(db->aDb[0
4130: 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ]));.    sqlite3
4140: 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61  DbFree(db, db->a
4150: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
4160: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
4170: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
4180: 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20  eset the schema 
4190: 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
41a0: 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e 20 20   at index iDb.  
41b0: 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65 0a 2a  Also reset the.*
41c0: 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 0a 2a  * TEMP schema..*
41d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
41e0: 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c  setOneSchema(sql
41f0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
4200: 62 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20  b){.  Db *pDb;. 
4210: 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d   assert( iDb<db-
4220: 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  >nDb );..  /* Ca
4230: 73 65 20 31 3a 20 20 52 65 73 65 74 20 74 68 65  se 1:  Reset the
4240: 20 73 69 6e 67 6c 65 20 73 63 68 65 6d 61 20 69   single schema i
4250: 64 65 6e 74 69 66 69 65 64 20 62 79 20 69 44 62  dentified by iDb
4260: 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d   */.  pDb = &db-
4270: 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 61 73 73  >aDb[iDb];.  ass
4280: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
4290: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
42a0: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 61 73 73  iDb, 0) );.  ass
42b0: 65 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d  ert( pDb->pSchem
42c0: 61 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  a!=0 );.  sqlite
42d0: 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62  3SchemaClear(pDb
42e0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 20 20 2f  ->pSchema);..  /
42f0: 2a 20 49 66 20 61 6e 79 20 64 61 74 61 62 61 73  * If any databas
4300: 65 20 6f 74 68 65 72 20 74 68 61 6e 20 54 45 4d  e other than TEM
4310: 50 20 69 73 20 72 65 73 65 74 2c 20 74 68 65 6e  P is reset, then
4320: 20 61 6c 73 6f 20 72 65 73 65 74 20 54 45 4d 50   also reset TEMP
4330: 0a 20 20 2a 2a 20 73 69 6e 63 65 20 54 45 4d 50  .  ** since TEMP
4340: 20 6d 69 67 68 74 20 62 65 20 68 6f 6c 64 69 6e   might be holdin
4350: 67 20 74 72 69 67 67 65 72 73 20 74 68 61 74 20  g triggers that 
4360: 72 65 66 65 72 65 6e 63 65 20 74 61 62 6c 65 73  reference tables
4370: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68   in the.  ** oth
4380: 65 72 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  er database..  *
4390: 2f 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20 29  /.  if( iDb!=1 )
43a0: 7b 0a 20 20 20 20 70 44 62 20 3d 20 26 64 62 2d  {.    pDb = &db-
43b0: 3e 61 44 62 5b 31 5d 3b 0a 20 20 20 20 61 73 73  >aDb[1];.    ass
43c0: 65 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d  ert( pDb->pSchem
43d0: 61 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  a!=0 );.    sqli
43e0: 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70  te3SchemaClear(p
43f0: 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Db->pSchema);.  
4400: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }.  return;.}../
4410: 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73  *.** Erase all s
4420: 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f  chema informatio
4430: 6e 20 66 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63  n from all attac
4440: 68 65 64 20 64 61 74 61 62 61 73 65 73 20 28 69  hed databases (i
4450: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69  ncluding.** "mai
4460: 6e 22 20 61 6e 64 20 22 74 65 6d 70 22 29 20 66  n" and "temp") f
4470: 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
4480: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
4490: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
44a0: 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f  ResetAllSchemasO
44b0: 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69  fConnection(sqli
44c0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
44d0: 69 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  i;.  sqlite3Btre
44e0: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
44f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
4500: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  nDb; i++){.    D
4510: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
4520: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
4530: 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  b->pSchema ){.  
4540: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
4550: 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68  aClear(pDb->pSch
4560: 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ema);.    }.  }.
4570: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
4580: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
4590: 6e 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 56  nges;.  sqlite3V
45a0: 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62  tabUnlockList(db
45b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
45c0: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20  eLeaveAll(db);. 
45d0: 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65   sqlite3Collapse
45e0: 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62  DatabaseArray(db
45f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
4600: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4610: 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74  ed when a commit
4620: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
4630: 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
4640: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
4650: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62  lite3 *db){.  db
4660: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
4670: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
4680: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
4690: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
46a0: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ed for the colum
46b0: 6e 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62  n names of a tab
46c0: 6c 65 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a  le or view (the.
46d0: 2a 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20  ** Table.aCol[] 
46e0: 61 72 72 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20  array)..*/.void 
46f0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c  sqlite3DeleteCol
4700: 75 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65 33  umnNames(sqlite3
4710: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
4720: 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ble){.  int i;. 
4730: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
4740: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21   assert( pTable!
4750: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f  =0 );.  if( (pCo
4760: 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  l = pTable->aCol
4770: 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  )!=0 ){.    for(
4780: 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  i=0; i<pTable->n
4790: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
47a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
47b0: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
47c0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  >zName);.      s
47d0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
47e0: 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74  (db, pCol->pDflt
47f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4800: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
4810: 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  >zColl);.    }. 
4820: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4830: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f  (db, pTable->aCo
4840: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
4850: 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f   Remove the memo
4860: 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ry data structur
4870: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
4880: 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  th the given.** 
4890: 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67  Table.  No chang
48a0: 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64  es are made to d
48b0: 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74  isk by this rout
48c0: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ine..**.** This 
48d0: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c  routine just del
48e0: 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74  etes the data st
48f0: 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65  ructure.  It doe
4900: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20  s not unlink.** 
4910: 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73  the table data s
4920: 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
4930: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42  e hash table.  B
4940: 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72  ut it does destr
4950: 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72  oy.** memory str
4960: 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69  uctures of the i
4970: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
4980: 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74  gn keys associat
4990: 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20  ed with .** the 
49a0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
49b0: 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 69 73   db parameter is
49c0: 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69   optional.  It i
49d0: 73 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20  s needed if the 
49e0: 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a  Table object .**
49f0: 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73   contains lookas
4a00: 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61  ide memory.  (Ta
4a10: 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 74  ble objects in t
4a20: 68 65 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74  he schema do not
4a30: 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64   use.** lookasid
4a40: 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f  e memory, but so
4a50: 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 54 61 62  me ephemeral Tab
4a60: 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20  le objects do.) 
4a70: 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20 70 61   Or the.** db pa
4a80: 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20 75  rameter can be u
4a90: 73 65 64 20 77 69 74 68 20 64 62 2d 3e 70 6e 42  sed with db->pnB
4aa0: 79 74 65 73 46 72 65 65 64 20 74 6f 20 6d 65 61  ytesFreed to mea
4ab0: 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a  sure the memory.
4ac0: 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 54  ** used by the T
4ad0: 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  able object..*/.
4ae0: 73 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49  static void SQLI
4af0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 64 65 6c 65  TE_NOINLINE dele
4b00: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
4b10: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
4b20: 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  le){.  Index *pI
4b30: 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  ndex, *pNext;.  
4b40: 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 6e 4c  TESTONLY( int nL
4b50: 6f 6f 6b 61 73 69 64 65 3b 20 29 20 2f 2a 20 55  ookaside; ) /* U
4b60: 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 6c 6f  sed to verify lo
4b70: 6f 6b 61 73 69 64 65 20 6e 6f 74 20 75 73 65 64  okaside not used
4b80: 20 66 6f 72 20 73 63 68 65 6d 61 20 2a 2f 0a 0a   for schema */..
4b90: 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
4ba0: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  number of outsta
4bb0: 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20  nding lookaside 
4bc0: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20 73  allocations in s
4bd0: 63 68 65 6d 61 20 54 61 62 6c 65 73 0a 20 20 2a  chema Tables.  *
4be0: 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  * prior to doing
4bf0: 20 61 6e 79 20 66 72 65 65 28 29 20 6f 70 65 72   any free() oper
4c00: 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20 73  ations.  Since s
4c10: 63 68 65 6d 61 20 54 61 62 6c 65 73 20 64 6f 20  chema Tables do 
4c20: 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f  not use.  ** loo
4c30: 6b 61 73 69 64 65 2c 20 74 68 69 73 20 6e 75 6d  kaside, this num
4c40: 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63  ber should not c
4c50: 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 54 45 53 54  hange. */.  TEST
4c60: 4f 4e 4c 59 28 20 6e 4c 6f 6f 6b 61 73 69 64 65  ONLY( nLookaside
4c70: 20 3d 20 28 64 62 20 26 26 20 28 70 54 61 62 6c   = (db && (pTabl
4c80: 65 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  e->tabFlags & TF
4c90: 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 29 20  _Ephemeral)==0) 
4ca0: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
4cb0: 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6c             db->l
4cc0: 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 3a 20  ookaside.nOut : 
4cd0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  0 );..  /* Delet
4ce0: 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73  e all indices as
4cf0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
4d00: 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66  is table. */.  f
4d10: 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62  or(pIndex = pTab
4d20: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  le->pIndex; pInd
4d30: 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74  ex; pIndex=pNext
4d40: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
4d50: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
4d60: 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
4d70: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c  ->pSchema==pTabl
4d80: 65 2d 3e 70 53 63 68 65 6d 61 0a 20 20 20 20 20  e->pSchema.     
4d90: 20 20 20 20 7c 7c 20 28 49 73 56 69 72 74 75 61      || (IsVirtua
4da0: 6c 28 70 54 61 62 6c 65 29 20 26 26 20 70 49 6e  l(pTable) && pIn
4db0: 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51  dex->idxType!=SQ
4dc0: 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50  LITE_IDXTYPE_APP
4dd0: 44 45 46 29 20 29 3b 0a 20 20 20 20 69 66 28 20  DEF) );.    if( 
4de0: 28 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e  (db==0 || db->pn
4df0: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26  BytesFreed==0) &
4e00: 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  & !IsVirtual(pTa
4e10: 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68  ble) ){.      ch
4e20: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64  ar *zName = pInd
4e30: 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20  ex->zName; .    
4e40: 20 20 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64    TESTONLY ( Ind
4e50: 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c  ex *pOld = ) sql
4e60: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 0a  ite3HashInsert(.
4e70: 20 20 20 20 20 20 20 20 20 26 70 49 6e 64 65 78           &pIndex
4e80: 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
4e90: 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20  sh, zName, 0.   
4ea0: 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
4eb0: 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c  rt( db==0 || sql
4ec0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
4ed0: 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65  eld(db, 0, pInde
4ee0: 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  x->pSchema) );. 
4ef0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c       assert( pOl
4f00: 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c  d==pIndex || pOl
4f10: 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  d==0 );.    }.  
4f20: 20 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20    freeIndex(db, 
4f30: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20  pIndex);.  }..  
4f40: 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 66 6f  /* Delete any fo
4f50: 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74 61 63  reign keys attac
4f60: 68 65 64 20 74 6f 20 74 68 69 73 20 74 61 62 6c  hed to this tabl
4f70: 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46  e. */.  sqlite3F
4f80: 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62  kDelete(db, pTab
4f90: 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  le);..  /* Delet
4fa0: 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
4fb0: 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20  cture itself..  
4fc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  */.  sqlite3Dele
4fd0: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62  teColumnNames(db
4fe0: 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c  , pTable);.  sql
4ff0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5000: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Table->zName);. 
5010: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5020: 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41  b, pTable->zColA
5030: 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ff);.  sqlite3Se
5040: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
5050: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b  Table->pSelect);
5060: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
5070: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  stDelete(db, pTa
5080: 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 69  ble->pCheck);.#i
5090: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
50a0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
50b0: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61   sqlite3VtabClea
50c0: 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 23  r(db, pTable);.#
50d0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44  endif.  sqlite3D
50e0: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
50f0: 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
5100: 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69 64  that no lookasid
5110: 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75 73 65  e memory was use
5120: 64 20 62 79 20 73 63 68 65 6d 61 20 74 61 62 6c  d by schema tabl
5130: 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
5140: 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c 7c  nLookaside==0 ||
5150: 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 64 62 2d   nLookaside==db-
5160: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20  >lookaside.nOut 
5170: 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
5180: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  3DeleteTable(sql
5190: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
51a0: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 2f 2a 20 44  *pTable){.  /* D
51b0: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
51c0: 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65   table until the
51d0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
51e0: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a   reaches zero. *
51f0: 2f 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 20  /.  if( !pTable 
5200: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5210: 28 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42  ((!db || db->pnB
5220: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26  ytesFreed==0) &&
5230: 20 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 54 61 62   (--pTable->nTab
5240: 52 65 66 29 3e 30 29 20 29 20 72 65 74 75 72 6e  Ref)>0) ) return
5250: 3b 0a 20 20 64 65 6c 65 74 65 54 61 62 6c 65 28  ;.  deleteTable(
5260: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a  db, pTable);.}..
5270: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68  ./*.** Unlink th
5280: 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72  e given table fr
5290: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
52a0: 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74  es and the delet
52b0: 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73  e the.** table s
52c0: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c  tructure with al
52d0: 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e  l its indices an
52e0: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a  d foreign keys..
52f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55  */.void sqlite3U
5300: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61  nlinkAndDeleteTa
5310: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
5320: 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20   int iDb, const 
5330: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b  char *zTabName){
5340: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44  .  Table *p;.  D
5350: 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72  b *pDb;..  asser
5360: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
5370: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
5380: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
5390: 20 61 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d   assert( zTabNam
53a0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
53b0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
53c0: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
53d0: 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
53e0: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20   zTabName[0]==0 
53f0: 29 3b 20 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67  );  /* Zero-leng
5400: 74 68 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 61  th table names a
5410: 72 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20  re allowed */.  
5420: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
5430: 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  Db];.  p = sqlit
5440: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44  e3HashInsert(&pD
5450: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
5460: 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 30  ash, zTabName, 0
5470: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  );.  sqlite3Dele
5480: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a  teTable(db, p);.
5490: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
54a0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
54b0: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  ges;.}../*.** Gi
54c0: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74  ven a token, ret
54d0: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
54e0: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  t consists of th
54f0: 65 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a  e text of that.*
5500: 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20  * token.  Space 
5510: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
5520: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
5530: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
5540: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
5550: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
5560: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
5570: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  ** function..**.
5580: 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e  ** Any quotation
5590: 20 6d 61 72 6b 73 20 28 65 78 3a 20 20 22 6e 61   marks (ex:  "na
55a0: 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61  me", 'name', [na
55b0: 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20  me], or `name`) 
55c0: 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64  that.** surround
55d0: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
55e0: 20 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76   token are remov
55f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73  ed..**.** Tokens
5600: 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74 20   are often just 
5610: 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68  pointers into th
5620: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74  e original SQL t
5630: 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72  ext and so.** ar
5640: 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69  e not \000 termi
5650: 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f  nated and are no
5660: 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54  t persistent.  T
5670: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
5680: 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65  ng.** is \000 te
5690: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20  rminated and is 
56a0: 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63  persistent..*/.c
56b0: 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65  har *sqlite3Name
56c0: 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65  FromToken(sqlite
56d0: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
56e0: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
56f0: 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  ame;.  if( pName
5700: 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
5710: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
5720: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d  (db, (char*)pNam
5730: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
5740: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
5750: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  ote(zName);.  }e
5760: 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  lse{.    zName =
5770: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5780: 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zName;.}../*.**
5790: 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65   Open the sqlite
57a0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74  _master table st
57b0: 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65  ored in database
57c0: 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a   number iDb for.
57d0: 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20  ** writing. The 
57e0: 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  table is opened 
57f0: 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a  using cursor 0..
5800: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f  */.void sqlite3O
5810: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50  penMasterTable(P
5820: 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62  arse *p, int iDb
5830: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
5840: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29  qlite3GetVdbe(p)
5850: 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  ;.  sqlite3Table
5860: 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53  Lock(p, iDb, MAS
5870: 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53  TER_ROOT, 1, MAS
5880: 54 45 52 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c  TER_NAME);.  sql
5890: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
58a0: 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  t(v, OP_OpenWrit
58b0: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
58c0: 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66  T, iDb, 5);.  if
58d0: 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a  ( p->nTab==0 ){.
58e0: 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b      p->nTab = 1;
58f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  .  }.}../*.** Pa
5900: 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f  rameter zName po
5910: 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65  ints to a nul-te
5920: 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72 20  rminated buffer 
5930: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
5940: 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61  ame.** of a data
5950: 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  base ("main", "t
5960: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
5970: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
5980: 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  db). This.** fun
5990: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
59a0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
59b0: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
59c0: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a   db->aDb[], or.*
59d0: 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  * -1 if the name
59e0: 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66  d db cannot be f
59f0: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
5a00: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73  ite3FindDbName(s
5a10: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
5a20: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
5a30: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20    int i = -1;   
5a40: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
5a50: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66  e number */.  if
5a60: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44  ( zName ){.    D
5a70: 62 20 2a 70 44 62 3b 0a 20 20 20 20 66 6f 72 28  b *pDb;.    for(
5a80: 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70  i=(db->nDb-1), p
5a90: 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20  Db=&db->aDb[i]; 
5aa0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d  i>=0; i--, pDb--
5ab0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
5ac0: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
5ad0: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a  pDb->zDbSName, z
5ae0: 4e 61 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20  Name) ) break;. 
5af0: 20 20 20 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69       /* "main" i
5b00: 73 20 61 6c 77 61 79 73 20 61 6e 20 61 63 63 65  s always an acce
5b10: 70 74 61 62 6c 65 20 61 6c 69 61 73 20 66 6f 72  ptable alias for
5b20: 20 74 68 65 20 70 72 69 6d 61 72 79 20 64 61 74   the primary dat
5b30: 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 65  abase.      ** e
5b40: 76 65 6e 20 69 66 20 69 74 20 68 61 73 20 62 65  ven if it has be
5b50: 65 6e 20 72 65 6e 61 6d 65 64 20 75 73 69 6e 67  en renamed using
5b60: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
5b70: 5f 4d 41 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a  _MAINDBNAME. */.
5b80: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20 26        if( i==0 &
5b90: 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  & 0==sqlite3_str
5ba0: 69 63 6d 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61  icmp("main", zNa
5bb0: 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  me) ) break;.   
5bc0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5bd0: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  i;.}../*.** The 
5be0: 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e  token *pName con
5bf0: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
5c00: 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69  f a database (ei
5c10: 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a  ther "main" or.*
5c20: 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  * "temp" or the 
5c30: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
5c40: 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f  hed db). This ro
5c50: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
5c60: 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68  e.** index of th
5c70: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
5c80: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
5c90: 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  r -1 if the name
5ca0: 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d db .** does no
5cb0: 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  t exist..*/.int 
5cc0: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71  sqlite3FindDb(sq
5cd0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e  lite3 *db, Token
5ce0: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *pName){.  int 
5cf0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d10: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
5d20: 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ber */.  char *z
5d30: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5d50: 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61   Name we are sea
5d60: 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  rching for */.  
5d70: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
5d80: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
5d90: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73   pName);.  i = s
5da0: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
5db0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73  (db, zName);.  s
5dc0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5dd0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
5de0: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74  n i;.}../* The t
5df0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20  able or view or 
5e00: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20  trigger name is 
5e10: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
5e20: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
5e30: 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20  s.** pName1 and 
5e40: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
5e50: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
5e60: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
5e70: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
5e80: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
5e90: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a  xx.yyy (...);.**
5ea0: 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31   .** Then pName1
5eb0: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
5ec0: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
5ed0: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
5ee0: 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74  hand if.** the t
5ef0: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
5f00: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5f10: 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52  , i.e.:.**.** CR
5f20: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
5f30: 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ..);.**.** Then 
5f40: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
5f50: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
5f60: 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54  2 is ""..**.** T
5f70: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
5f80: 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70   the *ppUnqual p
5f90: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
5fa0: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
5fb0: 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65  ame1 or.** pName
5fc0: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
5fd0: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
5fe0: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
5ff0: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
6000: 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69  database "xxx" i
6010: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
6020: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
6030: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
6040: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
6050: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
6060: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
6070: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
6080: 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20  pName1,      /* 
6090: 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65  The "xxx" in the
60a0: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
60b0: 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f  or "xxx" */.  To
60c0: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
60d0: 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69    /* The "yyy" i
60e0: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
60f0: 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  yyy" */.  Token 
6100: 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a  **pUnqual     /*
6110: 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61   Write the unqua
6120: 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61  lified object na
6130: 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  me here */.){.  
6140: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
6150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
6160: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
6170: 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
6180: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
6190: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73  arse->db;..  ass
61a0: 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 29  ert( pName2!=0 )
61b0: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e  ;.  if( pName2->
61c0: 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  n>0 ){.    if( d
61d0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b  b->init.busy ) {
61e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
61f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6200: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
6210: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
6220: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a   -1;.    }.    *
6230: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32  pUnqual = pName2
6240: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
6250: 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e  te3FindDb(db, pN
6260: 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69  ame1);.    if( i
6270: 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  Db<0 ){.      sq
6280: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6290: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64  arse, "unknown d
62a0: 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61  atabase %T", pNa
62b0: 6d 65 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75  me1);.      retu
62c0: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn -1;.    }.  }
62d0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
62e0: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
62f0: 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75  0 || db->init.bu
6300: 73 79 20 7c 7c 20 28 64 62 2d 3e 66 6c 61 67 73  sy || (db->flags
6310: 20 26 20 53 51 4c 49 54 45 5f 56 61 63 75 75 6d   & SQLITE_Vacuum
6320: 29 21 3d 30 29 3b 0a 20 20 20 20 69 44 62 20 3d  )!=0);.    iDb =
6330: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20   db->init.iDb;. 
6340: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
6350: 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame1;.  }.  retu
6360: 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn iDb;.}../*.**
6370: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
6380: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69   used to check i
6390: 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72 69  f the UTF-8 stri
63a0: 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65  ng zName is a le
63b0: 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69  gal.** unqualifi
63c0: 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65  ed name for a ne
63d0: 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  w schema object 
63e0: 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76  (table, index, v
63f0: 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65  iew or.** trigge
6400: 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72  r). All names ar
6410: 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74  e legal except t
6420: 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e 20  hose that begin 
6430: 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a  with the string.
6440: 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e  ** "sqlite_" (in
6450: 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72   upper, lower or
6460: 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54 68   mixed case). Th
6470: 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  is portion of th
6480: 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  e namespace.** i
6490: 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  s reserved for i
64a0: 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a  nternal use..*/.
64b0: 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
64c0: 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65  ObjectName(Parse
64d0: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
64e0: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
64f0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d  if( !pParse->db-
6500: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50  >init.busy && pP
6510: 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
6520: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70  .          && (p
6530: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
6540: 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53   & SQLITE_WriteS
6550: 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20  chema)==0.      
6560: 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
6570: 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c  3StrNICmp(zName,
6580: 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29   "sqlite_", 7) )
6590: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
65a0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
65b0: 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72  bject name reser
65c0: 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ved for internal
65d0: 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65   use: %s", zName
65e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
65f0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
6600: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6610: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
6620: 75 72 6e 20 74 68 65 20 50 52 49 4d 41 52 59 20  urn the PRIMARY 
6630: 4b 45 59 20 69 6e 64 65 78 20 6f 66 20 61 20 74  KEY index of a t
6640: 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  able.*/.Index *s
6650: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
6660: 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61  Index(Table *pTa
6670: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 0a  b){.  Index *p;.
6680: 20 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70 49    for(p=pTab->pI
6690: 6e 64 65 78 3b 20 70 20 26 26 20 21 49 73 50 72  ndex; p && !IsPr
66a0: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 29  imaryKeyIndex(p)
66b0: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a  ; p=p->pNext){}.
66c0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
66d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
66e0: 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
66f0: 70 49 64 78 20 74 68 61 74 20 63 6f 72 72 65 73  pIdx that corres
6700: 70 6f 6e 64 73 20 74 6f 20 74 61 62 6c 65 0a 2a  ponds to table.*
6710: 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20  * column iCol.  
6720: 52 65 74 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74  Return -1 if not
6730: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73   found..*/.i16 s
6740: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
6750: 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78 2c  dex(Index *pIdx,
6760: 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e   i16 iCol){.  in
6770: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
6780: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
6790: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
67a0: 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  Col==pIdx->aiCol
67b0: 75 6d 6e 5b 69 5d 20 29 20 72 65 74 75 72 6e 20  umn[i] ) return 
67c0: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
67d0: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  -1;.}../*.** Beg
67e0: 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20  in constructing 
67f0: 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72  a new table repr
6800: 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65  esentation in me
6810: 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a  mory.  This is.*
6820: 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73  * the first of s
6830: 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f  everal action ro
6840: 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20  utines that get 
6850: 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e  called in respon
6860: 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54  se.** to a CREAT
6870: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
6880: 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61  t.  In particula
6890: 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  r, this routine 
68a0: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74  is called.** aft
68b0: 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73  er seeing tokens
68c0: 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54   "CREATE" and "T
68d0: 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61  ABLE" and the ta
68e0: 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73  ble name. The is
68f0: 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20  Temp.** flag is 
6900: 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c  true if the tabl
6910: 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
6920: 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69  ed in the auxili
6930: 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ary database.** 
6940: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
6950: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
6960: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
6970: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65   is normally the
6980: 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68   case.** when th
6990: 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d  e "TEMP" or "TEM
69a0: 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20  PORARY" keyword 
69b0: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
69c0: 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20  n.** CREATE and 
69d0: 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TABLE..**.** The
69e0: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
69f0: 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  d is initialized
6a00: 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72   and put in pPar
6a10: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a  se->pNewTable..*
6a20: 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65  * As more of the
6a30: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
6a40: 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
6a50: 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63  d, additional ac
6a60: 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73  tion.** routines
6a70: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
6a80: 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f  to add more info
6a90: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
6aa0: 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68  record..** At th
6ab0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
6ac0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
6ad0: 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33  ent, the sqlite3
6ae0: 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69  EndTable() routi
6af0: 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
6b00: 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
6b10: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20  construction of 
6b20: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65  the new table re
6b30: 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  cord..*/.void sq
6b40: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
6b50: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6b60: 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f  ,   /* Parser co
6b70: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
6b80: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46   *pName1,   /* F
6b90: 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65  irst part of the
6ba0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
6bb0: 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  le or view */.  
6bc0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
6bd0: 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
6be0: 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  of the name of t
6bf0: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
6c00: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
6c10: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
6c20: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
6c30: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
6c40: 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20  isView,      /* 
6c50: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
6c60: 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20  a VIEW */.  int 
6c70: 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20  isVirtual,   /* 
6c80: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
6c90: 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65 20  a VIRTUAL table 
6ca0: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20  */.  int noErr  
6cb0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
6cc0: 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72  ing if table alr
6cd0: 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
6ce0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  {.  Table *pTabl
6cf0: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  e;.  char *zName
6d00: 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d   = 0; /* The nam
6d10: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
6d20: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  le */.  sqlite3 
6d30: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
6d40: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
6d50: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
6d60: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
6d70: 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
6d80: 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54   table in */.  T
6d90: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20  oken *pName;    
6da0: 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
6db0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
6dc0: 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20   to create */.. 
6dd0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
6de0: 73 79 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e  sy && db->init.n
6df0: 65 77 54 6e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20  ewTnum==1 ){.   
6e00: 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
6e10: 3a 20 20 50 61 72 73 69 6e 67 20 74 68 65 20 73  :  Parsing the s
6e20: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 6f 72 20  qlite_master or 
6e30: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
6e40: 65 72 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20  er schema */.   
6e50: 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e   iDb = db->init.
6e60: 69 44 62 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  iDb;.    zName =
6e70: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
6e80: 28 64 62 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  (db, SCHEMA_TABL
6e90: 45 28 69 44 62 29 29 3b 0a 20 20 20 20 70 4e 61  E(iDb));.    pNa
6ea0: 6d 65 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d  me = pName1;.  }
6eb0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
6ec0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
6ed0: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
6ee0: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
6ef0: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
6f00: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
6f10: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
6f20: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 21 4f  turn;.    if( !O
6f30: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
6f40: 54 65 6d 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e  Temp && pName2->
6f50: 6e 3e 30 20 26 26 20 69 44 62 21 3d 31 20 29 7b  n>0 && iDb!=1 ){
6f60: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 63 72 65  .      /* If cre
6f70: 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62  ating a temp tab
6f80: 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79  le, the name may
6f90: 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65   not be qualifie
6fa0: 64 2e 20 55 6e 6c 65 73 73 20 0a 20 20 20 20 20  d. Unless .     
6fb0: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
6fc0: 20 6e 61 6d 65 20 69 73 20 22 74 65 6d 70 22 20   name is "temp" 
6fd0: 61 6e 79 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20  anyway.  */.    
6fe0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6ff0: 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f  g(pParse, "tempo
7000: 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20  rary table name 
7010: 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66  must be unqualif
7020: 69 65 64 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ied");.      ret
7030: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
7040: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
7050: 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62 20  && isTemp ) iDb 
7060: 3d 20 31 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  = 1;.    zName =
7070: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
7080: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
7090: 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
70a0: 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e  sNameToken = *pN
70b0: 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ame;.  if( zName
70c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
70d0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
70e0: 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
70f0: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
7100: 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ame) ){.    goto
7110: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
7120: 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  or;.  }.  if( db
7130: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20  ->init.iDb==1 ) 
7140: 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e  isTemp = 1;.#ifn
7150: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7160: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
7170: 61 73 73 65 72 74 28 20 69 73 54 65 6d 70 3d 3d  assert( isTemp==
7180: 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d 31 20 29  0 || isTemp==1 )
7190: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 56 69  ;.  assert( isVi
71a0: 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d  ew==0 || isView=
71b0: 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20 20 73 74  =1 );.  {.    st
71c0: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 43  atic const u8 aC
71d0: 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ode[] = {.      
71e0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
71f0: 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 4c  ABLE,.       SQL
7200: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
7210: 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51  TABLE,.       SQ
7220: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
7230: 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,.       SQLITE_
7240: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
7250: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68 61 72  .    };.    char
7260: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
7270: 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
7280: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
7290: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
72a0: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
72b0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65  CHEMA_TABLE(isTe
72c0: 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  mp), 0, zDb) ){.
72d0: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
72e0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
72f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56    }.    if( !isV
7300: 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65  irtual && sqlite
7310: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
7320: 65 2c 20 28 69 6e 74 29 61 43 6f 64 65 5b 69 73  e, (int)aCode[is
7330: 54 65 6d 70 2b 32 2a 69 73 56 69 65 77 5d 2c 0a  Temp+2*isView],.
7340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7360: 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 2c         zName, 0,
7370: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
7380: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7390: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  error;.    }.  }
73a0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61  .#endif..  /* Ma
73b0: 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20  ke sure the new 
73c0: 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20  table name does 
73d0: 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  not collide with
73e0: 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a   an existing.  *
73f0: 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
7400: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d   name in the sam
7410: 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73 73  e database.  Iss
7420: 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ue an error mess
7430: 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64  age if.  ** it d
7440: 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70 74 69  oes. The excepti
7450: 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73 74 61  on is if the sta
7460: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72  tement being par
7470: 73 65 64 20 77 61 73 20 70 61 73 73 65 64 0a 20  sed was passed. 
7480: 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65   ** to an sqlite
7490: 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29  3_declare_vtab()
74a0: 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63   call. In that c
74b0: 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c  ase only the col
74c0: 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61  umn names.  ** a
74d0: 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65  nd types will be
74e0: 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20   used, so there 
74f0: 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65  is no need to te
7500: 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65  st for namespace
7510: 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73  .  ** collisions
7520: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e  ..  */.  if( !IN
7530: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b  _DECLARE_VTAB ){
7540: 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  .    char *zDb =
7550: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
7560: 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  bSName;.    if( 
7570: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
7580: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
7590: 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  rse) ){.      go
75a0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
75b0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
75c0: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  pTable = sqlite3
75d0: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
75e0: 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69  ame, zDb);.    i
75f0: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
7600: 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b     if( !noErr ){
7610: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7620: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7630: 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61   "table %T alrea
7640: 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d  dy exists", pNam
7650: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
7660: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7670: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
7680: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
7690: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
76a0: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
76b0: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
76c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
76d0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
76e0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ror;.    }.    i
76f0: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
7700: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  dex(db, zName, z
7710: 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Db)!=0 ){.      
7720: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7730: 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
7740: 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64  s already an ind
7750: 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  ex named %s", zN
7760: 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
7770: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
7780: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  or;.    }.  }.. 
7790: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
77a0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
77b0: 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
77c0: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ;.  if( pTable==
77d0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
77e0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
77f0: 64 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  d );.    pParse-
7800: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
7810: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 70 50 61  EM_BKPT;.    pPa
7820: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
7830: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
7840: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
7850: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
7860: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
7870: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
7880: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20  able->pSchema = 
7890: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
78a0: 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  hema;.  pTable->
78b0: 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 23 69 66  nTabRef = 1;.#if
78c0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
78d0: 4c 54 5f 52 4f 57 45 53 54 0a 20 20 70 54 61 62  LT_ROWEST.  pTab
78e0: 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  le->nRowLogEst =
78f0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 53   sqlite3LogEst(S
7900: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 4f  QLITE_DEFAULT_RO
7910: 57 45 53 54 29 3b 0a 23 65 6c 73 65 0a 20 20 70  WEST);.#else.  p
7920: 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73  Table->nRowLogEs
7930: 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
7940: 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
7950: 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
7960: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
7970: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
7980: 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72 73  le==0 );.  pPars
7990: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70  e->pNewTable = p
79a0: 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Table;..  /* If 
79b0: 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 67 69  this is the magi
79c0: 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  c sqlite_sequenc
79d0: 65 20 74 61 62 6c 65 20 75 73 65 64 20 62 79 20  e table used by 
79e0: 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20  autoincrement,. 
79f0: 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 20   ** then record 
7a00: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  a pointer to thi
7a10: 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d  s table in the m
7a20: 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
7a30: 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74  ucture.  ** so t
7a40: 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e 20 66  hat INSERT can f
7a50: 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 65 61  ind the table ea
7a60: 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  sily..  */.#ifnd
7a70: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
7a80: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69  UTOINCREMENT.  i
7a90: 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74  f( !pParse->nest
7aa0: 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a 4e 61  ed && strcmp(zNa
7ab0: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75  me, "sqlite_sequ
7ac0: 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ence")==0 ){.   
7ad0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7ae0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
7af0: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
7b00: 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65     pTable->pSche
7b10: 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20 70 54  ma->pSeqTab = pT
7b20: 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  able;.  }.#endif
7b30: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
7b40: 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65  erating the code
7b50: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72   that will inser
7b60: 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  t the table reco
7b70: 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65  rd into.  ** the
7b80: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
7b90: 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70  able.  Note in p
7ba0: 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77  articular that w
7bb0: 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a  e must go ahead.
7bc0: 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74    ** and allocat
7bd0: 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  e the record num
7be0: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
7bf0: 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65  e entry now.  Be
7c00: 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52  fore any.  ** PR
7c10: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
7c20: 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65  QUE keywords are
7c30: 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20   parsed.  Those 
7c40: 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61  keywords will ca
7c50: 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  use.  ** indices
7c60: 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61   to be created a
7c70: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  nd the table rec
7c80: 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65  ord must come be
7c90: 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69  fore the .  ** i
7ca0: 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20  ndices.  Hence, 
7cb0: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
7cc0: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
7cd0: 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
7ce0: 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f  d.  ** now..  */
7cf0: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
7d00: 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73 71  .busy && (v = sq
7d10: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
7d20: 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  rse))!=0 ){.    
7d30: 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 20 20 69  int addr1;.    i
7d40: 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20  nt fileFormat;. 
7d50: 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72 65 67     int reg1, reg
7d60: 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 2f 2a 20  2, reg3;.    /* 
7d70: 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73 20 61 6e 20  nullRow[] is an 
7d80: 4f 50 5f 52 65 63 6f 72 64 20 65 6e 63 6f 64 69  OP_Record encodi
7d90: 6e 67 20 6f 66 20 61 20 72 6f 77 20 63 6f 6e 74  ng of a row cont
7da0: 61 69 6e 69 6e 67 20 35 20 4e 55 4c 4c 73 20 2a  aining 5 NULLs *
7db0: 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
7dc0: 73 74 20 63 68 61 72 20 6e 75 6c 6c 52 6f 77 5b  st char nullRow[
7dd0: 5d 20 3d 20 7b 20 36 2c 20 30 2c 20 30 2c 20 30  ] = { 6, 0, 0, 0
7de0: 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 73 71  , 0, 0 };.    sq
7df0: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
7e00: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
7e10: 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64   1, iDb);..#ifnd
7e20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
7e30: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
7e40: 69 66 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b  if( isVirtual ){
7e50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7e60: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56  beAddOp0(v, OP_V
7e70: 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65  Begin);.    }.#e
7e80: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
7e90: 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  the file format 
7ea0: 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20  and encoding in 
7eb0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 76  the database hav
7ec0: 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c 20  e not been set, 
7ed0: 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 6d  .    ** set them
7ee0: 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   now..    */.   
7ef0: 20 72 65 67 31 20 3d 20 70 50 61 72 73 65 2d 3e   reg1 = pParse->
7f00: 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61  regRowid = ++pPa
7f10: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
7f20: 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e 72 65  eg2 = pParse->re
7f30: 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65  gRoot = ++pParse
7f40: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33  ->nMem;.    reg3
7f50: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
7f60: 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
7f70: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52  beAddOp3(v, OP_R
7f80: 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  eadCookie, iDb, 
7f90: 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49 4c 45  reg3, BTREE_FILE
7fa0: 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73 71  _FORMAT);.    sq
7fb0: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
7fc0: 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  ee(v, iDb);.    
7fd0: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
7fe0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
7ff0: 49 66 2c 20 72 65 67 33 29 3b 20 56 64 62 65 43  If, reg3); VdbeC
8000: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
8010: 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62  fileFormat = (db
8020: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
8030: 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21  _LegacyFileFmt)!
8040: 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  =0 ?.           
8050: 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54         1 : SQLIT
8060: 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41  E_MAX_FILE_FORMA
8070: 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  T;.    sqlite3Vd
8080: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
8090: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
80a0: 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  TREE_FILE_FORMAT
80b0: 2c 20 66 69 6c 65 46 6f 72 6d 61 74 29 3b 0a 20  , fileFormat);. 
80c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
80d0: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f  dOp3(v, OP_SetCo
80e0: 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45  okie, iDb, BTREE
80f0: 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20  _TEXT_ENCODING, 
8100: 45 4e 43 28 64 62 29 29 3b 0a 20 20 20 20 73 71  ENC(db));.    sq
8110: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
8120: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20  e(v, addr1);..  
8130: 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63    /* This just c
8140: 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68  reates a place-h
8150: 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20  older record in 
8160: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
8170: 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  r table..    ** 
8180: 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74  The record creat
8190: 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  ed does not cont
81a0: 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74  ain anything yet
81b0: 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65  .  It will be re
81c0: 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79  placed.    ** by
81d0: 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20   the real entry 
81e0: 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  in code generate
81f0: 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54  d at sqlite3EndT
8200: 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  able()..    **. 
8210: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
8220: 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72  for the new entr
8230: 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  y is left in reg
8240: 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65  ister pParse->re
8250: 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54  gRowid..    ** T
8260: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
8270: 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ber of the new t
8280: 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20  able is left in 
8290: 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52  reg pParse->regR
82a0: 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  oot..    ** The 
82b0: 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70  rowid and root p
82c0: 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65  age number value
82d0: 73 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  s are needed by 
82e0: 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20  the code that.  
82f0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54    ** sqlite3EndT
8300: 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  able will genera
8310: 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21  te..    */.#if !
8320: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8330: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
8340: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8350: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
8360: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 7c      if( isView |
8370: 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20  | isVirtual ){. 
8380: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8390: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
83a0: 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a  eger, 0, reg2);.
83b0: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
83c0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70 50 61  .    {.      pPa
83d0: 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20 3d  rse->addrCrTab =
83e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
83f0: 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54  p2(v, OP_CreateT
8400: 61 62 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29  able, iDb, reg2)
8410: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
8420: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
8430: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  le(pParse, iDb);
8440: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8450: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
8460: 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b  Rowid, 0, reg1);
8470: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8480: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f  AddOp4(v, OP_Blo
8490: 62 2c 20 36 2c 20 72 65 67 33 2c 20 30 2c 20 6e  b, 6, reg3, 0, n
84a0: 75 6c 6c 52 6f 77 2c 20 50 34 5f 53 54 41 54 49  ullRow, P4_STATI
84b0: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  C);.    sqlite3V
84c0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
84d0: 49 6e 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c  Insert, 0, reg3,
84e0: 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69   reg1);.    sqli
84f0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
8500: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
8510: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8520: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43  beAddOp0(v, OP_C
8530: 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lose);.  }..  /*
8540: 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72   Normal (non-err
8550: 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20  or) return. */. 
8560: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49   return;..  /* I
8570: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
8580: 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20  s, we jump here 
8590: 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  */.begin_table_e
85a0: 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44  rror:.  sqlite3D
85b0: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
85c0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
85d0: 2a 20 53 65 74 20 70 72 6f 70 65 72 74 69 65 73  * Set properties
85e0: 20 6f 66 20 61 20 74 61 62 6c 65 20 63 6f 6c 75   of a table colu
85f0: 6d 6e 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  mn based on the 
8600: 28 6d 61 67 69 63 61 6c 29 0a 2a 2a 20 6e 61 6d  (magical).** nam
8610: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  e of the column.
8620: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .*/.#if SQLITE_E
8630: 4e 41 42 4c 45 5f 48 49 44 44 45 4e 5f 43 4f 4c  NABLE_HIDDEN_COL
8640: 55 4d 4e 53 0a 76 6f 69 64 20 73 71 6c 69 74 65  UMNS.void sqlite
8650: 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65  3ColumnPropertie
8660: 73 46 72 6f 6d 4e 61 6d 65 28 54 61 62 6c 65 20  sFromName(Table 
8670: 2a 70 54 61 62 2c 20 43 6f 6c 75 6d 6e 20 2a 70  *pTab, Column *p
8680: 43 6f 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  Col){.  if( sqli
8690: 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 70 43 6f  te3_strnicmp(pCo
86a0: 6c 2d 3e 7a 4e 61 6d 65 2c 20 22 5f 5f 68 69 64  l->zName, "__hid
86b0: 64 65 6e 5f 5f 22 2c 20 31 30 29 3d 3d 30 20 29  den__", 10)==0 )
86c0: 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46  {.    pCol->colF
86d0: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
86e0: 48 49 44 44 45 4e 3b 0a 20 20 7d 65 6c 73 65 20  HIDDEN;.  }else 
86f0: 69 66 28 20 70 54 61 62 20 26 26 20 70 43 6f 6c  if( pTab && pCol
8700: 21 3d 70 54 61 62 2d 3e 61 43 6f 6c 20 26 26 20  !=pTab->aCol && 
8710: 28 70 43 6f 6c 5b 2d 31 5d 2e 63 6f 6c 46 6c 61  (pCol[-1].colFla
8720: 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49 44  gs & COLFLAG_HID
8730: 44 45 4e 29 20 29 7b 0a 20 20 20 20 70 54 61 62  DEN) ){.    pTab
8740: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
8750: 5f 4f 4f 4f 48 69 64 64 65 6e 3b 0a 20 20 7d 0a  _OOOHidden;.  }.
8760: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
8770: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
8780: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
8790: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
87a0: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a  onstructed..**.*
87b0: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
87c0: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
87d0: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f  once for each co
87e0: 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  lumn declaration
87f0: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
8800: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
8810: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
8820: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
8830: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
8840: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
8850: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
8860: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
8870: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
8880: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8890: 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20  AddColumn(Parse 
88a0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
88b0: 70 4e 61 6d 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  pName, Token *pT
88c0: 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ype){.  Table *p
88d0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
88e0: 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 54  r *z;.  char *zT
88f0: 79 70 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  ype;.  Column *p
8900: 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Col;.  sqlite3 *
8910: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8920: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
8930: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
8940: 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20  0 ) return;.#if 
8950: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
8960: 4e 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b  N.  if( p->nCol+
8970: 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  1>db->aLimit[SQL
8980: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
8990: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
89a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
89b0: 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
89c0: 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e  ns on %s", p->zN
89d0: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
89e0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a  ;.  }.#endif.  z
89f0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8a00: 6f 63 52 61 77 28 64 62 2c 20 70 4e 61 6d 65 2d  ocRaw(db, pName-
8a10: 3e 6e 20 2b 20 70 54 79 70 65 2d 3e 6e 20 2b 20  >n + pType->n + 
8a20: 32 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  2);.  if( z==0 )
8a30: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 63 70   return;.  memcp
8a40: 79 28 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70  y(z, pName->z, p
8a50: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 4e  Name->n);.  z[pN
8a60: 61 6d 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73  ame->n] = 0;.  s
8a70: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29  qlite3Dequote(z)
8a80: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
8a90: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
8aa0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
8ab0: 72 69 63 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c  ricmp(z, p->aCol
8ac0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
8ad0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8ae0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8af0: 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e  duplicate column
8b00: 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a   name: %s", z);.
8b10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
8b20: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
8b30: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
8b40: 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43    }.  if( (p->nC
8b50: 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a  ol & 0x7)==0 ){.
8b60: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77      Column *aNew
8b70: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c  ;.    aNew = sql
8b80: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
8b90: 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f  ,p->aCol,(p->nCo
8ba0: 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  l+8)*sizeof(p->a
8bb0: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  Col[0]));.    if
8bc0: 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
8bd0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
8be0: 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72  (db, z);.      r
8bf0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
8c00: 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b   p->aCol = aNew;
8c10: 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70  .  }.  pCol = &p
8c20: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b  ->aCol[p->nCol];
8c30: 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20  .  memset(pCol, 
8c40: 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  0, sizeof(p->aCo
8c50: 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e  l[0]));.  pCol->
8c60: 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 20 73 71 6c  zName = z;.  sql
8c70: 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72  ite3ColumnProper
8c80: 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 70 2c 20  tiesFromName(p, 
8c90: 70 43 6f 6c 29 3b 0a 20 0a 20 20 69 66 28 20 70  pCol);. .  if( p
8ca0: 54 79 70 65 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20  Type->n==0 ){.  
8cb0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
8cc0: 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69   no type specifi
8cd0: 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65  ed, columns have
8ce0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66   the default aff
8cf0: 69 6e 69 74 79 0a 20 20 20 20 2a 2a 20 27 42 4c  inity.    ** 'BL
8d00: 4f 42 27 2e 20 2a 2f 0a 20 20 20 20 70 43 6f 6c  OB'. */.    pCol
8d10: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
8d20: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
8d30: 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20    pCol->szEst = 
8d40: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
8d50: 7a 54 79 70 65 20 3d 20 7a 20 2b 20 73 71 6c 69  zType = z + sqli
8d60: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2b  te3Strlen30(z) +
8d70: 20 31 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a   1;.    memcpy(z
8d80: 54 79 70 65 2c 20 70 54 79 70 65 2d 3e 7a 2c 20  Type, pType->z, 
8d90: 70 54 79 70 65 2d 3e 6e 29 3b 0a 20 20 20 20 7a  pType->n);.    z
8da0: 54 79 70 65 5b 70 54 79 70 65 2d 3e 6e 5d 20 3d  Type[pType->n] =
8db0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   0;.    sqlite3D
8dc0: 65 71 75 6f 74 65 28 7a 54 79 70 65 29 3b 0a 20  equote(zType);. 
8dd0: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74     pCol->affinit
8de0: 79 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e  y = sqlite3Affin
8df0: 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20 26  ityType(zType, &
8e00: 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a 20 20  pCol->szEst);.  
8e10: 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
8e20: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54   |= COLFLAG_HAST
8e30: 59 50 45 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43  YPE;.  }.  p->nC
8e40: 6f 6c 2b 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e  ol++;.  pParse->
8e50: 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e  constraintName.n
8e60: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
8e70: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
8e80: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
8e90: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
8ea0: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
8eb0: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
8ec0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
8ed0: 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   A "NOT NULL" co
8ee0: 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20  nstraint has.** 
8ef0: 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63  been seen on a c
8f00: 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75  olumn.  This rou
8f10: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f  tine sets the no
8f20: 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a  tNull flag on.**
8f30: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72   the column curr
8f40: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
8f50: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
8f60: 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e  d sqlite3AddNotN
8f70: 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73  ull(Parse *pPars
8f80: 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  e, int onError){
8f90: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70  .  Table *p;.  p
8fa0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
8fb0: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
8fc0: 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f   || NEVER(p->nCo
8fd0: 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  l<1) ) return;. 
8fe0: 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c   p->aCol[p->nCol
8ff0: 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75  -1].notNull = (u
9000: 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 2d 3e  8)onError;.  p->
9010: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48  tabFlags |= TF_H
9020: 61 73 4e 6f 74 4e 75 6c 6c 3b 0a 7d 0a 0a 2f 2a  asNotNull;.}../*
9030: 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c  .** Scan the col
9040: 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54  umn type name zT
9050: 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70  ype (length nTyp
9060: 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  e) and return th
9070: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
9080: 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a  affinity type..*
9090: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
90a0: 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e  e does a case-in
90b0: 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68  dependent search
90c0: 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68   of zType for th
90d0: 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73  e .** substrings
90e0: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
90f0: 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20  g table. If one 
9100: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
9110: 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74  s is.** found, t
9120: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
9130: 20 61 66 66 69 6e 69 74 79 20 69 73 20 72 65 74   affinity is ret
9140: 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20  urned. If zType 
9150: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65  contains.** more
9160: 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65   than one of the
9170: 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74   substrings, ent
9180: 72 69 65 73 20 74 6f 77 61 72 64 20 74 68 65 20  ries toward the 
9190: 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74  top of .** the t
91a0: 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69  able take priori
91b0: 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  ty. For example,
91c0: 20 69 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c   if zType is 'BL
91d0: 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49  OBINT', .** SQLI
91e0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69  TE_AFF_INTEGER i
91f0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
9200: 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20 20 20  * Substring     
9210: 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d  | Affinity.** --
9220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
9240: 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20 20 20  * 'INT'         
9250: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  | SQLITE_AFF_INT
9260: 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20  EGER.** 'CHAR'  
9270: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
9280: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42  FF_TEXT.** 'CLOB
9290: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
92a0: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54  E_AFF_TEXT.** 'T
92b0: 45 58 54 27 20 20 20 20 20 20 20 20 7c 20 53 51  EXT'        | SQ
92c0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
92d0: 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c   'BLOB'        |
92e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
92f0: 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20  .** 'REAL'      
9300: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
9310: 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20  EAL.** 'FLOA'   
9320: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
9330: 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27  F_REAL.** 'DOUB'
9340: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
9350: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20  _AFF_REAL.**.** 
9360: 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73  If none of the s
9370: 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65  ubstrings in the
9380: 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65   above table are
9390: 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54   found,.** SQLIT
93a0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73  E_AFF_NUMERIC is
93b0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68   returned..*/.ch
93c0: 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69  ar sqlite3Affini
93d0: 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61  tyType(const cha
93e0: 72 20 2a 7a 49 6e 2c 20 75 38 20 2a 70 73 7a 45  r *zIn, u8 *pszE
93f0: 73 74 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 30  st){.  u32 h = 0
9400: 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 53  ;.  char aff = S
9410: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
9420: 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  C;.  const char 
9430: 2a 7a 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20 61  *zChar = 0;..  a
9440: 73 73 65 72 74 28 20 7a 49 6e 21 3d 30 20 29 3b  ssert( zIn!=0 );
9450: 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30 5d  .  while( zIn[0]
9460: 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c   ){.    h = (h<<
9470: 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65  8) + sqlite3Uppe
9480: 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29 26  rToLower[(*zIn)&
9490: 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b  0xff];.    zIn++
94a0: 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27  ;.    if( h==(('
94b0: 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36  c'<<24)+('h'<<16
94c0: 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20  )+('a'<<8)+'r') 
94d0: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){             /
94e0: 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20  * CHAR */.      
94f0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
9500: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7a 43 68  _TEXT;.      zCh
9510: 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d 65  ar = zIn;.    }e
9520: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27  lse if( h==(('c'
9530: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
9540: 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b  ('o'<<8)+'b') ){
9550: 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a         /* CLOB *
9560: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
9570: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
9580: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9590: 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c  (('t'<<24)+('e'<
95a0: 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74  <16)+('x'<<8)+'t
95b0: 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54  ') ){       /* T
95c0: 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  EXT */.      aff
95d0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
95e0: 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  XT;.    }else if
95f0: 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b  ( h==(('b'<<24)+
9600: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
9610: 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20  8)+'b')         
9620: 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20   /* BLOB */.    
9630: 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c      && (aff==SQL
9640: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9650: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
9660: 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20  FF_REAL) ){.    
9670: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
9680: 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 69  FF_BLOB;.      i
9690: 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20 29  f( zIn[0]=='(' )
96a0: 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23 69   zChar = zIn;.#i
96b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
96c0: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
96d0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
96e0: 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65  ==(('r'<<24)+('e
96f0: 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b  '<<16)+('a'<<8)+
9700: 27 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'l')          /*
9710: 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20   REAL */.       
9720: 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   && aff==SQLITE_
9730: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
9740: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9750: 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20  E_AFF_REAL;.    
9760: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
9770: 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  f'<<24)+('l'<<16
9780: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20  )+('o'<<8)+'a') 
9790: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41           /* FLOA
97a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
97b0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
97c0: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
97d0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
97e0: 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _REAL;.    }else
97f0: 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32   if( h==(('d'<<2
9800: 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75  4)+('o'<<16)+('u
9810: 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20  '<<8)+'b')      
9820: 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20      /* DOUB */. 
9830: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
9840: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
9850: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
9860: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
9870: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
9880: 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46 46  se if( (h&0x00FF
9890: 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36  FFFF)==(('i'<<16
98a0: 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20  )+('n'<<8)+'t') 
98b0: 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a  ){    /* INT */.
98c0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
98d0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
98e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
98f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
9900: 70 73 7a 45 73 74 20 69 73 20 6e 6f 74 20 4e 55  pszEst is not NU
9910: 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65 73 74  LL, store an est
9920: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66 69 65  imate of the fie
9930: 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a 20 20  ld size.  The.  
9940: 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20 73  ** estimate is s
9950: 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20 74 68  caled so that th
9960: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e 74  e size of an int
9970: 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a 20  eger is 1.  */. 
9980: 20 69 66 28 20 70 73 7a 45 73 74 20 29 7b 0a 20   if( pszEst ){. 
9990: 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 31 3b 20     *pszEst = 1; 
99a0: 20 20 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a    /* default siz
99b0: 65 20 69 73 20 61 70 70 72 6f 78 20 34 20 62 79  e is approx 4 by
99c0: 74 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61  tes */.    if( a
99d0: 66 66 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  ff<SQLITE_AFF_NU
99e0: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69  MERIC ){.      i
99f0: 66 28 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20  f( zChar ){.    
9a00: 20 20 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72      while( zChar
9a10: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [0] ){.         
9a20: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 64 69   if( sqlite3Isdi
9a30: 67 69 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b  git(zChar[0]) ){
9a40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
9a50: 20 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   v = 0;.        
9a60: 20 20 20 20 73 71 6c 69 74 65 33 47 65 74 49 6e      sqlite3GetIn
9a70: 74 33 32 28 7a 43 68 61 72 2c 20 26 76 29 3b 0a  t32(zChar, &v);.
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 76 20 3d 20              v = 
9a90: 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  v/4 + 1;.       
9aa0: 20 20 20 20 20 69 66 28 20 76 3e 32 35 35 20 29       if( v>255 )
9ab0: 20 76 20 3d 20 32 35 35 3b 0a 20 20 20 20 20 20   v = 255;.      
9ac0: 20 20 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20        *pszEst = 
9ad0: 76 3b 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56  v; /* BLOB(k), V
9ae0: 41 52 43 48 41 52 28 6b 29 2c 20 43 48 41 52 28  ARCHAR(k), CHAR(
9af0: 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20  k) -> r=(k/4+1) 
9b00: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  */.            b
9b10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
9b20: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68 61  }.          zCha
9b30: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  r++;.        }. 
9b40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9b50: 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 35 3b      *pszEst = 5;
9b60: 20 20 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54     /* BLOB, TEXT
9b70: 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28  , CLOB -> r=5  (
9b80: 61 70 70 72 6f 78 20 32 30 20 62 79 74 65 73 29  approx 20 bytes)
9b90: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
9ba0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66  .  }.  return af
9bb0: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  f;.}../*.** The 
9bc0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
9bd0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
9be0: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
9bf0: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
9c00: 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  mn.** of the tab
9c10: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
9c20: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
9c30: 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76  .**.** Default v
9c40: 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73  alue expressions
9c50: 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e   must be constan
9c60: 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78 63  t.  Raise an exc
9c70: 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a  eption if this.*
9c80: 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  * is not the cas
9c90: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
9ca0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
9cb0: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
9cc0: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
9cd0: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
9ce0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
9cf0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
9d00: 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61  d sqlite3AddDefa
9d10: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
9d20: 70 50 61 72 73 65 2c 20 45 78 70 72 53 70 61 6e  pParse, ExprSpan
9d30: 20 2a 70 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c   *pSpan){.  Tabl
9d40: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
9d50: 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  pCol;.  sqlite3 
9d60: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9d70: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
9d80: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
9d90: 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f   p!=0 ){.    pCo
9da0: 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d  l = &(p->aCol[p-
9db0: 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69  >nCol-1]);.    i
9dc0: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
9dd0: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
9de0: 69 6f 6e 28 70 53 70 61 6e 2d 3e 70 45 78 70 72  ion(pSpan->pExpr
9df0: 2c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29  , db->init.busy)
9e00: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9e10: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
9e20: 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65  , "default value
9e30: 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20   of column [%s] 
9e40: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22  is not constant"
9e50: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  ,.          pCol
9e60: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ->zName);.    }e
9e70: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
9e80: 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69 73  copy of pExpr is
9e90: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
9ea0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61   the original, a
9eb0: 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73  s pExpr contains
9ec0: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73  .      ** tokens
9ed0: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76   that point to v
9ee0: 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20  olatile memory. 
9ef0: 54 68 65 20 27 73 70 61 6e 27 20 6f 66 20 74 68  The 'span' of th
9f00: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  e expression.   
9f10: 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
9f20: 64 20 62 79 20 70 72 61 67 6d 61 20 74 61 62 6c  d by pragma tabl
9f30: 65 5f 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f  e_info..      */
9f40: 0a 20 20 20 20 20 20 45 78 70 72 20 78 3b 0a 20  .      Expr x;. 
9f50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9f60: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d  Delete(db, pCol-
9f70: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 6d  >pDflt);.      m
9f80: 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69 7a  emset(&x, 0, siz
9f90: 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20 20 78  eof(x));.      x
9fa0: 2e 6f 70 20 3d 20 54 4b 5f 53 50 41 4e 3b 0a 20  .op = TK_SPAN;. 
9fb0: 20 20 20 20 20 78 2e 75 2e 7a 54 6f 6b 65 6e 20       x.u.zToken 
9fc0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
9fd0: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53  up(db, (char*)pS
9fe0: 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20  pan->zStart,.   
9ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a010: 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45   (int)(pSpan->zE
a020: 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61  nd - pSpan->zSta
a030: 72 74 29 29 3b 0a 20 20 20 20 20 20 78 2e 70 4c  rt));.      x.pL
a040: 65 66 74 20 3d 20 70 53 70 61 6e 2d 3e 70 45 78  eft = pSpan->pEx
a050: 70 72 3b 0a 20 20 20 20 20 20 78 2e 66 6c 61 67  pr;.      x.flag
a060: 73 20 3d 20 45 50 5f 53 6b 69 70 3b 0a 20 20 20  s = EP_Skip;.   
a070: 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d     pCol->pDflt =
a080: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
a090: 64 62 2c 20 26 78 2c 20 45 58 50 52 44 55 50 5f  db, &x, EXPRDUP_
a0a0: 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20 73  REDUCE);.      s
a0b0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
a0c0: 20 78 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20   x.u.zToken);.  
a0d0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
a0e0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
a0f0: 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d  pSpan->pExpr);.}
a100: 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77 61 72 64  ../*.** Backward
a110: 73 20 43 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s Compatibility 
a120: 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20 48 69 73  Hack:.** .** His
a130: 74 6f 72 69 63 61 6c 20 76 65 72 73 69 6f 6e 73  torical versions
a140: 20 6f 66 20 53 51 4c 69 74 65 20 61 63 63 65 70   of SQLite accep
a150: 74 65 64 20 73 74 72 69 6e 67 73 20 61 73 20 63  ted strings as c
a160: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 0a 2a  olumn names in.*
a170: 2a 20 69 6e 64 65 78 65 73 20 61 6e 64 20 50 52  * indexes and PR
a180: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
a190: 61 69 6e 74 73 20 61 6e 64 20 69 6e 20 55 4e 49  aints and in UNI
a1a0: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  QUE constraints.
a1b0: 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a    Example:.**.**
a1c0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
a1d0: 45 20 78 79 7a 28 61 2c 62 2c 63 2c 64 2c 65 2c  E xyz(a,b,c,d,e,
a1e0: 50 52 49 4d 41 52 59 20 4b 45 59 28 27 61 27 29  PRIMARY KEY('a')
a1f0: 2c 55 4e 49 51 55 45 28 27 62 27 2c 27 63 27 20  ,UNIQUE('b','c' 
a200: 43 4f 4c 4c 41 54 45 20 74 72 69 6d 29 0a 2a 2a  COLLATE trim).**
a210: 20 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45       CREATE INDE
a220: 58 20 61 62 63 20 4f 4e 20 78 79 7a 28 27 63 27  X abc ON xyz('c'
a230: 2c 27 64 27 20 44 45 53 43 2c 27 65 27 20 43 4f  ,'d' DESC,'e' CO
a240: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 44 45 53  LLATE nocase DES
a250: 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  C);.**.** This i
a260: 73 20 67 6f 6f 66 79 2e 20 20 42 75 74 20 74 6f  s goofy.  But to
a270: 20 70 72 65 73 65 72 76 65 20 62 61 63 6b 77 61   preserve backwa
a280: 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
a290: 79 20 77 65 20 63 6f 6e 74 69 6e 75 65 20 74 6f  y we continue to
a2a0: 0a 2a 2a 20 61 63 63 65 70 74 20 69 74 2e 20 20  .** accept it.  
a2b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
a2c0: 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  s the necessary 
a2d0: 63 6f 6e 76 65 72 73 69 6f 6e 2e 20 20 49 74 20  conversion.  It 
a2e0: 63 6f 6e 76 65 72 74 73 0a 2a 2a 20 74 68 65 20  converts.** the 
a2f0: 65 78 70 72 65 73 73 69 6f 6e 20 67 69 76 65 6e  expression given
a300: 20 69 6e 20 69 74 73 20 61 72 67 75 6d 65 6e 74   in its argument
a310: 20 66 72 6f 6d 20 61 20 54 4b 5f 53 54 52 49 4e   from a TK_STRIN
a320: 47 20 69 6e 74 6f 20 61 20 54 4b 5f 49 44 0a 2a  G into a TK_ID.*
a330: 2a 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  * if the express
a340: 69 6f 6e 20 69 73 20 6a 75 73 74 20 61 20 54 4b  ion is just a TK
a350: 5f 53 54 52 49 4e 47 20 77 69 74 68 20 61 6e 20  _STRING with an 
a360: 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c 41 54 45  optional COLLATE
a370: 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 49 66 20 74   clause..** If t
a380: 68 65 20 65 70 78 72 65 73 73 69 6f 6e 20 69 73  he epxression is
a390: 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20   anything other 
a3a0: 74 68 61 6e 20 54 4b 5f 53 54 52 49 4e 47 2c 20  than TK_STRING, 
a3b0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
a3c0: 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a  s.** unchanged..
a3d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
a3e0: 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64  qlite3StringToId
a3f0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
a400: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e   p->op==TK_STRIN
a410: 47 20 29 7b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  G ){.    p->op =
a420: 20 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c 73 65 20   TK_ID;.  }else 
a430: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
a440: 4c 4c 41 54 45 20 26 26 20 70 2d 3e 70 4c 65 66  LLATE && p->pLef
a450: 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47  t->op==TK_STRING
a460: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 65 66 74   ){.    p->pLeft
a470: 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20  ->op = TK_ID;.  
a480: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67  }.}../*.** Desig
a490: 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59  nate the PRIMARY
a4a0: 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62   KEY for the tab
a4b0: 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20  le.  pList is a 
a4c0: 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a  list of names .*
a4d0: 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61  * of columns tha
a4e0: 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61  t form the prima
a4f0: 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73  ry key.  If pLis
a500: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
a510: 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
a520: 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d  ntly added colum
a530: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  n of the table i
a540: 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  s the primary ke
a550: 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65  y..**.** A table
a560: 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73   can have at mos
a570: 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  t one primary ke
a580: 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65  y.  If the table
a590: 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20   already has.** 
a5a0: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61  a primary key (a
a5b0: 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73  nd this is the s
a5c0: 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65  econd primary ke
a5d0: 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  y) then create a
a5e0: 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n.** error..**.*
a5f0: 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59  * If the PRIMARY
a600: 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e   KEY is on a sin
a610: 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65  gle column whose
a620: 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54   datatype is INT
a630: 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65  EGER,.** then we
a640: 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65   will try to use
a650: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20   that column as 
a660: 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20  the rowid.  Set 
a670: 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a  the Table.iPKey.
a680: 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
a690: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
a6a0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74  truction to be t
a6b0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
a6c0: 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ** INTEGER PRIMA
a6d0: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20  RY KEY column.  
a6e0: 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73  Table.iPKey is s
a6f0: 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72  et to -1 if ther
a700: 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47  e is.** no INTEG
a710: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  ER PRIMARY KEY..
a720: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79  **.** If the key
a730: 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
a740: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
a750: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e  then create a un
a760: 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f  ique.** index fo
a770: 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69  r the key.  No i
a780: 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20  ndex is created 
a790: 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d  for INTEGER PRIM
a7a0: 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69  ARY KEYs..*/.voi
a7b0: 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d  d sqlite3AddPrim
a7c0: 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20  aryKey(.  Parse 
a7d0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
a7e0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
a7f0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
a800: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
a810: 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20   field names to 
a820: 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
a830: 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
a840: 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
a850: 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73  with a uniquenes
a860: 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  s conflict */.  
a870: 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20  int autoInc,    
a880: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
a890: 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b   AUTOINCREMENT k
a8a0: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
a8b0: 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  t */.  int sortO
a8c0: 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49  rder     /* SQLI
a8d0: 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c  TE_SO_ASC or SQL
a8e0: 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29  ITE_SO_DESC */.)
a8f0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
a900: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
a910: 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  ble;.  Column *p
a920: 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Col = 0;.  int i
a930: 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69  Col = -1, i;.  i
a940: 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69 66 28 20  nt nTerm;.  if( 
a950: 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70  pTab==0 ) goto p
a960: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
a970: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62  .  if( pTab->tab
a980: 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72  Flags & TF_HasPr
a990: 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20 20 20  imaryKey ){.    
a9a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
a9b0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
a9c0: 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73  table \"%s\" has
a9d0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70   more than one p
a9e0: 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61  rimary key", pTa
a9f0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
aa00: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
aa10: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62  exit;.  }.  pTab
aa20: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
aa30: 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a  _HasPrimaryKey;.
aa40: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
aa50: 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61  {.    iCol = pTa
aa60: 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20  b->nCol - 1;.   
aa70: 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61   pCol = &pTab->a
aa80: 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 70  Col[iCol];.    p
aa90: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col->colFlags |=
aaa0: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
aab0: 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 31 3b  ;.    nTerm = 1;
aac0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 54  .  }else{.    nT
aad0: 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  erm = pList->nEx
aae0: 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  pr;.    for(i=0;
aaf0: 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a   i<nTerm; i++){.
ab00: 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 45 78        Expr *pCEx
ab10: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
ab20: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73  SkipCollate(pLis
ab30: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
ab40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
ab50: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
ab60: 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f   sqlite3StringTo
ab70: 49 64 28 70 43 45 78 70 72 29 3b 0a 20 20 20 20  Id(pCExpr);.    
ab80: 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70    if( pCExpr->op
ab90: 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20  ==TK_ID ){.     
aba0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
abb0: 43 4e 61 6d 65 20 3d 20 70 43 45 78 70 72 2d 3e  CName = pCExpr->
abc0: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
abd0: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
abe0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
abf0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
ac00: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
ac10: 49 43 6d 70 28 7a 43 4e 61 6d 65 2c 20 70 54 61  ICmp(zCName, pTa
ac20: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
ac30: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
ac40: 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70         pCol = &p
ac50: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b  Tab->aCol[iCol];
ac60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
ac70: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
ac80: 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a  OLFLAG_PRIMKEY;.
ac90: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
aca0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
acb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
acc0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
acd0: 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26 26 20   nTerm==1.   && 
ace0: 70 43 6f 6c 0a 20 20 20 26 26 20 73 71 6c 69 74  pCol.   && sqlit
acf0: 65 33 53 74 72 49 43 6d 70 28 73 71 6c 69 74 65  e3StrICmp(sqlite
ad00: 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c  3ColumnType(pCol
ad10: 2c 22 22 29 2c 20 22 49 4e 54 45 47 45 52 22 29  ,""), "INTEGER")
ad20: 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72 74 4f 72  ==0.   && sortOr
ad30: 64 65 72 21 3d 53 51 4c 49 54 45 5f 53 4f 5f 44  der!=SQLITE_SO_D
ad40: 45 53 43 0a 20 20 29 7b 0a 20 20 20 20 70 54 61  ESC.  ){.    pTa
ad50: 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b  b->iPKey = iCol;
ad60: 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f  .    pTab->keyCo
ad70: 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72  nf = (u8)onError
ad80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 75  ;.    assert( au
ad90: 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f  toInc==0 || auto
ada0: 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54  Inc==1 );.    pT
adb0: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
adc0: 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69  autoInc*TF_Autoi
add0: 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 20 20 69 66  ncrement;.    if
ade0: 28 20 70 4c 69 73 74 20 29 20 70 50 61 72 73 65  ( pList ) pParse
adf0: 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 20 3d  ->iPkSortOrder =
ae00: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72   pList->a[0].sor
ae10: 74 4f 72 64 65 72 3b 0a 20 20 7d 65 6c 73 65 20  tOrder;.  }else 
ae20: 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23  if( autoInc ){.#
ae30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ae40: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
ae50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
ae60: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41 55  rMsg(pParse, "AU
ae70: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f  TOINCREMENT is o
ae80: 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61  nly allowed on a
ae90: 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45  n ".       "INTE
aea0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
aeb0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
aec0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72  e{.    sqlite3Cr
aed0: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
aee0: 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74  , 0, 0, 0, pList
aef0: 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20  , onError, 0,.  
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af10: 20 20 20 20 20 20 20 20 20 30 2c 20 73 6f 72 74           0, sort
af20: 4f 72 64 65 72 2c 20 30 2c 20 53 51 4c 49 54 45  Order, 0, SQLITE
af30: 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59  _IDXTYPE_PRIMARY
af40: 4b 45 59 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  KEY);.    pList 
af50: 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72  = 0;.  }..primar
af60: 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71  y_key_exit:.  sq
af70: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
af80: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
af90: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
afa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
afb0: 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74   new CHECK const
afc0: 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62  raint to the tab
afd0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
afe0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
aff0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b000: 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69  AddCheckConstrai
b010: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
b020: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
b030: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
b040: 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72  Expr *pCheckExpr
b050: 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65    /* The check e
b060: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a  xpression */.){.
b070: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b080: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c  MIT_CHECK.  Tabl
b090: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
b0a0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 73  ->pNewTable;.  s
b0b0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
b0c0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
b0d0: 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41  Tab && !IN_DECLA
b0e0: 52 45 5f 56 54 41 42 0a 20 20 20 26 26 20 21 73  RE_VTAB.   && !s
b0f0: 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 65 61  qlite3BtreeIsRea
b100: 64 6f 6e 6c 79 28 64 62 2d 3e 61 44 62 5b 64 62  donly(db->aDb[db
b110: 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e 70 42 74 29  ->init.iDb].pBt)
b120: 0a 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  .  ){.    pTab->
b130: 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33  pCheck = sqlite3
b140: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
b150: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68  Parse, pTab->pCh
b160: 65 63 6b 2c 20 70 43 68 65 63 6b 45 78 70 72 29  eck, pCheckExpr)
b170: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
b180: 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65  ->constraintName
b190: 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  .n ){.      sqli
b1a0: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
b1b0: 6d 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  me(pParse, pTab-
b1c0: 3e 70 43 68 65 63 6b 2c 20 26 70 50 61 72 73 65  >pCheck, &pParse
b1d0: 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65  ->constraintName
b1e0: 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 1);.    }.  }e
b1f0: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
b200: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
b210: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
b220: 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20   pCheckExpr);.  
b230: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
b240: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  he collation fun
b250: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ction of the mos
b260: 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65  t recently parse
b270: 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a  d table column.*
b280: 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71  * to the CollSeq
b290: 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20   given..*/.void 
b2a0: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74  sqlite3AddCollat
b2b0: 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  eType(Parse *pPa
b2c0: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  rse, Token *pTok
b2d0: 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  en){.  Table *p;
b2e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
b2f0: 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *zColl;        
b300: 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65        /* Dequote
b310: 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74  d name of collat
b320: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ion sequence */.
b330: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
b340: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
b350: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
b360: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
b370: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62   p->nCol-1;.  db
b380: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
b390: 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
b3a0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
b3b0: 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28  , pToken);.  if(
b3c0: 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e   !zColl ) return
b3d0: 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
b3e0: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
b3f0: 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  arse, zColl) ){.
b400: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
b410: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
b420: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69  ee(db, p->aCol[i
b430: 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d  ].zColl);.    p-
b440: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d  >aCol[i].zColl =
b450: 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f   zColl;.  .    /
b460: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
b470: 69 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 22  is declared as "
b480: 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b  <name> PRIMARY K
b490: 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65  EY COLLATE <type
b4a0: 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  >",.    ** then 
b4b0: 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76  an index may hav
b4c0: 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f  e been created o
b4d0: 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65  n this column be
b4e0: 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  fore the.    ** 
b4f0: 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77  collation type w
b500: 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63  as added. Correc
b510: 74 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20  t this if it is 
b520: 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  the case..    */
b530: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d  .    for(pIdx=p-
b540: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
b550: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
b560: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b570: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31  pIdx->nKeyCol==1
b580: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
b590: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
b5a0: 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =i ){.        pI
b5b0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20  dx->azColl[0] = 
b5c0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c  p->aCol[i].zColl
b5d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b5e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
b5f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
b600: 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Coll);.  }.}../*
b610: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
b620: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f  n returns the co
b630: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
b640: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61   for database na
b650: 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63  tive text.** enc
b660: 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64  oding identified
b670: 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a   by the string z
b680: 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61  Name, length nNa
b690: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  me..**.** If the
b6a0: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
b6b0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73  tion sequence is
b6c0: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20   not available, 
b6d0: 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  or not available
b6e0: 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62  .** in the datab
b6f0: 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64  ase native encod
b700: 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69  ing, the collati
b710: 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e  on factory is in
b720: 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75  voked to.** requ
b730: 65 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63  est it. If the c
b740: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
b750: 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79   does not supply
b760: 20 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65   such a sequence
b770: 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71  ,.** and the seq
b780: 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62  uence is availab
b790: 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65  le in another te
b7a0: 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65  xt encoding, the
b7b0: 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74  n that is.** ret
b7c0: 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a  urned instead..*
b7d0: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69  *.** If no versi
b7e0: 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65  ons of the reque
b7f0: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20  sted collations 
b800: 73 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61  sequence are ava
b810: 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e  ilable, or.** an
b820: 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75  other error occu
b830: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
b840: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
b850: 72 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65  r message writte
b860: 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65  n into.** pParse
b870: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
b880: 74 69 6e 65 20 69 73 20 61 20 77 72 61 70 70 65  tine is a wrappe
b890: 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33  r around sqlite3
b8a0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20  FindCollSeq().  
b8b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
b8c0: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c  invokes the coll
b8d0: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 66  ation factory if
b8e0: 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61   the named colla
b8f0: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66  tion cannot be f
b900: 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  ound.** and gene
b910: 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  rates an error m
b920: 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65  essage..**.** Se
b930: 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46  e also: sqlite3F
b940: 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71  indCollSeq(), sq
b950: 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28  lite3GetCollSeq(
b960: 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ).*/.CollSeq *sq
b970: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
b980: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
b990: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
b9a0: 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ame){.  sqlite3 
b9b0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
b9c0: 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43  ;.  u8 enc = ENC
b9d0: 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62  (db);.  u8 initb
b9e0: 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62  usy = db->init.b
b9f0: 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  usy;.  CollSeq *
ba00: 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20  pColl;..  pColl 
ba10: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
ba20: 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e  lSeq(db, enc, zN
ba30: 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a  ame, initbusy);.
ba40: 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20    if( !initbusy 
ba50: 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70  && (!pColl || !p
ba60: 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20  Coll->xCmp) ){. 
ba70: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
ba80: 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61  e3GetCollSeq(pPa
ba90: 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c  rse, enc, pColl,
baa0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20   zName);.  }..  
bab0: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
bac0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
bad0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
bae0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63  increment the sc
baf0: 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a  hema cookie..**.
bb00: 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f  ** The schema co
bb10: 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20  okie is used to 
bb20: 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74  determine when t
bb30: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
bb40: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
bb50: 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61  anges.  After ea
bb60: 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ch schema change
bb70: 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c  , the cookie val
bb80: 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  ue.** changes.  
bb90: 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66  When a process f
bba0: 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73  irst reads the s
bbb0: 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73  chema it records
bbc0: 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20   the.** cookie. 
bbd0: 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65   Thereafter, whe
bbe0: 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f  never it goes to
bbf0: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
bc00: 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63  base,.** it chec
bc10: 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  ks the cookie to
bc20: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
bc30: 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68  chema has not ch
bc40: 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69  anged.** since i
bc50: 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e  t was last read.
bc60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e  .**.** This plan
bc70: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   is not complete
bc80: 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e  ly bullet-proof.
bc90: 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
bca0: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65   for.** the sche
bcb0: 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c  ma to change mul
bcc0: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20  tiple times and 
bcd0: 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  for the cookie t
bce0: 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b  o be.** set back
bcf0: 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e   to prior value.
bd00: 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61    But schema cha
bd10: 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75  nges are infrequ
bd20: 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70  ent.** and the p
bd30: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69  robability of hi
bd40: 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  tting the same c
bd50: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f  ookie value is o
bd60: 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20  nly.** 1 chance 
bd70: 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27  in 2^32.  So we'
bd80: 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a  re safe enough..
bd90: 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  **.** IMPLEMENTA
bda0: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 33 34 32 33 30  TION-OF: R-34230
bdb0: 2d 35 36 30 34 39 20 53 51 4c 69 74 65 20 61 75  -56049 SQLite au
bdc0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69 6e 63 72  tomatically incr
bdd0: 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20 73 63  ements.** the sc
bde0: 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 77 68 65  hema-version whe
bdf0: 6e 65 76 65 72 20 74 68 65 20 73 63 68 65 6d 61  never the schema
be00: 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a 76 6f 69   changes..*/.voi
be10: 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43  d sqlite3ChangeC
be20: 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61  ookie(Parse *pPa
be30: 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  rse, int iDb){. 
be40: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
be50: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
be60: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
be70: 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
be80: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
be90: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
bea0: 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  0) );.  sqlite3V
beb0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
bec0: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
bed0: 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52  BTREE_SCHEMA_VER
bee0: 53 49 4f 4e 2c 20 0a 20 20 20 20 20 20 20 20 20  SION, .         
bef0: 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61             db->a
bf00: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
bf10: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31  >schema_cookie+1
bf20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73  );.}../*.** Meas
bf30: 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ure the number o
bf40: 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65  f characters nee
bf50: 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68  ded to output th
bf60: 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74  e given.** ident
bf70: 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62  ifier.  The numb
bf80: 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  er returned incl
bf90: 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20  udes any quotes 
bfa0: 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73  used.** but does
bfb0: 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65   not include the
bfc0: 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72   null terminator
bfd0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69  ..**.** The esti
bfe0: 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61  mate is conserva
bff0: 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20  tive.  It might 
c000: 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77  be larger that w
c010: 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79  hat is.** really
c020: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
c030: 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67  ic int identLeng
c040: 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  th(const char *z
c050: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f  ){.  int n;.  fo
c060: 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20  r(n=0; *z; n++, 
c070: 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a  z++){.    if( *z
c080: 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a  =='"' ){ n++; }.
c090: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b    }.  return n +
c0a0: 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   2;.}../*.** The
c0b0: 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72   first parameter
c0c0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
c0d0: 20 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65   an output buffe
c0e0: 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a  r. The second .*
c0f0: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  * parameter is a
c100: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
c110: 6e 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74  nteger that cont
c120: 61 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20  ains the offset 
c130: 61 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77  at.** which to w
c140: 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  rite into the ou
c150: 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 69  tput buffer. Thi
c160: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65  s function copie
c170: 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72  s the.** nul-ter
c180: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70  minated string p
c190: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
c1a0: 20 74 68 69 72 64 20 70 61 72 61 6d 65 74 65 72   third parameter
c1b0: 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a  , zSignedIdent,.
c1c0: 2a 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  ** to the specif
c1d0: 69 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68  ied offset in th
c1e0: 65 20 62 75 66 66 65 72 20 61 6e 64 20 75 70 64  e buffer and upd
c1f0: 61 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65  ates *pIdx to re
c200: 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69  fer.** to the fi
c210: 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20 74  rst byte after t
c220: 68 65 20 6c 61 73 74 20 62 79 74 65 20 77 72 69  he last byte wri
c230: 74 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75  tten before retu
c240: 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  rning..** .** If
c250: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67   the string zSig
c260: 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74  nedIdent consist
c270: 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c  s entirely of al
c280: 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63  pha-numeric.** c
c290: 68 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20  haracters, does 
c2a0: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  not begin with a
c2b0: 20 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f   digit and is no
c2c0: 74 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64  t an SQL keyword
c2d0: 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20  ,.** then it is 
c2e0: 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75  copied to the ou
c2f0: 74 70 75 74 20 62 75 66 66 65 72 20 65 78 61 63  tput buffer exac
c300: 74 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74  tly as it is. Ot
c310: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69  herwise,.** it i
c320: 73 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64  s quoted using d
c330: 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f  ouble-quotes..*/
c340: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65  .static void ide
c350: 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69  ntPut(char *z, i
c360: 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a  nt *pIdx, char *
c370: 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20  zSignedIdent){. 
c380: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c390: 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e  zIdent = (unsign
c3a0: 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64  ed char*)zSigned
c3b0: 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20  Ident;.  int i, 
c3c0: 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20  j, needQuote;.  
c3d0: 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f  i = *pIdx;..  fo
c3e0: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
c3f0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; j++){.    if( 
c400: 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28  !sqlite3Isalnum(
c410: 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49  zIdent[j]) && zI
c420: 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62  dent[j]!='_' ) b
c430: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64  reak;.  }.  need
c440: 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49  Quote = sqlite3I
c450: 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d  sdigit(zIdent[0]
c460: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ).            ||
c470: 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43   sqlite3KeywordC
c480: 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d  ode(zIdent, j)!=
c490: 54 4b 5f 49 44 0a 20 20 20 20 20 20 20 20 20 20  TK_ID.          
c4a0: 20 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d    || zIdent[j]!=
c4b0: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0.            ||
c4c0: 20 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28 20 6e 65   j==0;..  if( ne
c4d0: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
c4e0: 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d   = '"';.  for(j=
c4f0: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
c500: 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d  +){.    z[i++] =
c510: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20   zIdent[j];.    
c520: 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27  if( zIdent[j]=='
c530: 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  "' ) z[i++] = '"
c540: 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65  ';.  }.  if( nee
c550: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
c560: 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20  = '"';.  z[i] = 
c570: 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a  0;.  *pIdx = i;.
c580: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
c590: 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  e a CREATE TABLE
c5a0: 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f   statement appro
c5b0: 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67  priate for the g
c5c0: 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20  iven.** table.  
c5d0: 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74  Memory to hold t
c5e0: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73  he text of the s
c5f0: 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61  tatement is obta
c600: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c  ined.** from sql
c610: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
c620: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
c630: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
c640: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
c650: 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62   char *createTab
c660: 6c 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a  leStmt(sqlite3 *
c670: 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20  db, Table *p){. 
c680: 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20   int i, k, n;.  
c690: 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63  char *zStmt;.  c
c6a0: 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70  har *zSep, *zSep
c6b0: 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75  2, *zEnd;.  Colu
c6c0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20  mn *pCol;.  n = 
c6d0: 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20  0;.  for(pCol = 
c6e0: 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c  p->aCol, i=0; i<
c6f0: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  p->nCol; i++, pC
c700: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ol++){.    n += 
c710: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c  identLength(pCol
c720: 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20  ->zName) + 5;.  
c730: 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65  }.  n += identLe
c740: 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  ngth(p->zName);.
c750: 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20    if( n<50 ){ . 
c760: 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20     zSep = "";.  
c770: 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20    zSep2 = ",";. 
c780: 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20     zEnd = ")";. 
c790: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70   }else{.    zSep
c7a0: 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a   = "\n  ";.    z
c7b0: 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a  Sep2 = ",\n  ";.
c7c0: 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22      zEnd = "\n)"
c7d0: 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20  ;.  }.  n += 35 
c7e0: 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a  + 6*p->nCol;.  z
c7f0: 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 44 62  Stmt = sqlite3Db
c800: 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29 3b  MallocRaw(0, n);
c810: 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20  .  if( zStmt==0 
c820: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  ){.    sqlite3Oo
c830: 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
c840: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
c850: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
c860: 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45 41  (n, zStmt, "CREA
c870: 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b  TE TABLE ");.  k
c880: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
c890: 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65  30(zStmt);.  ide
c8a0: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
c8b0: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53   p->zName);.  zS
c8c0: 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a  tmt[k++] = '(';.
c8d0: 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43    for(pCol=p->aC
c8e0: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
c8f0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
c900: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
c910: 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  st char * const 
c920: 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 20  azType[] = {.   
c930: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
c940: 46 46 5f 42 4c 4f 42 20 20 20 20 2a 2f 20 22 22  FF_BLOB    */ ""
c950: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
c960: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20  ITE_AFF_TEXT    
c970: 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20 20  */ " TEXT",.    
c980: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
c990: 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20 4e  F_NUMERIC */ " N
c9a0: 55 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  UM",.        /* 
c9b0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
c9c0: 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20 20  ER */ " INT",.  
c9d0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
c9e0: 41 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20 22  AFF_REAL    */ "
c9f0: 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20 20   REAL".    };.  
ca00: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63    int len;.    c
ca10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
ca20: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ;..    sqlite3_s
ca30: 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53  nprintf(n-k, &zS
ca40: 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20  tmt[k], zSep);. 
ca50: 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53     k += sqlite3S
ca60: 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b  trlen30(&zStmt[k
ca70: 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a  ]);.    zSep = z
ca80: 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50  Sep2;.    identP
ca90: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43  ut(zStmt, &k, pC
caa0: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
cab0: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66  assert( pCol->af
cac0: 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46  finity-SQLITE_AF
cad0: 46 5f 42 4c 4f 42 20 3e 3d 20 30 20 29 3b 0a 20  F_BLOB >= 0 );. 
cae0: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
caf0: 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45  >affinity-SQLITE
cb00: 5f 41 46 46 5f 42 4c 4f 42 20 3c 20 41 72 72 61  _AFF_BLOB < Arra
cb10: 79 53 69 7a 65 28 61 7a 54 79 70 65 29 20 29 3b  ySize(azType) );
cb20: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
cb30: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
cb40: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29  QLITE_AFF_BLOB )
cb50: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
cb60: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
cb70: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
cb80: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
cb90: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
cba0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
cbb0: 52 49 43 20 29 3b 0a 20 20 20 20 74 65 73 74 63  RIC );.    testc
cbc0: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
cbd0: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
cbe0: 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 74  INTEGER );.    t
cbf0: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
cc00: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
cc10: 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20  AFF_REAL );.    
cc20: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 61 7a 54  .    zType = azT
cc30: 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  ype[pCol->affini
cc40: 74 79 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty - SQLITE_AFF_
cc50: 42 4c 4f 42 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d  BLOB];.    len =
cc60: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
cc70: 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 61 73 73  (zType);.    ass
cc80: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ert( pCol->affin
cc90: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
cca0: 42 4c 4f 42 20 0a 20 20 20 20 20 20 20 20 20 20  BLOB .          
ccb0: 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e    || pCol->affin
ccc0: 69 74 79 3d 3d 73 71 6c 69 74 65 33 41 66 66 69  ity==sqlite3Affi
ccd0: 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20  nityType(zType, 
cce0: 30 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  0) );.    memcpy
ccf0: 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70  (&zStmt[k], zTyp
cd00: 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b  e, len);.    k +
cd10: 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65 72  = len;.    asser
cd20: 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20  t( k<=n );.  }. 
cd30: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
cd40: 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d  f(n-k, &zStmt[k]
cd50: 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20  , "%s", zEnd);. 
cd60: 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d   return zStmt;.}
cd70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61  ../*.** Resize a
cd80: 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74  n Index object t
cd90: 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73  o hold N columns
cda0: 20 74 6f 74 61 6c 2e 20 20 52 65 74 75 72 6e 20   total.  Return 
cdb0: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
cdc0: 73 75 63 63 65 73 73 20 61 6e 64 20 53 51 4c 49  success and SQLI
cdd0: 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f  TE_NOMEM on an O
cde0: 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  OM error..*/.sta
cdf0: 74 69 63 20 69 6e 74 20 72 65 73 69 7a 65 49 6e  tic int resizeIn
ce00: 64 65 78 4f 62 6a 65 63 74 28 73 71 6c 69 74 65  dexObject(sqlite
ce10: 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49  3 *db, Index *pI
ce20: 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68  dx, int N){.  ch
ce30: 61 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20 69 6e  ar *zExtra;.  in
ce40: 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70  t nByte;.  if( p
ce50: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20  Idx->nColumn>=N 
ce60: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
ce70: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  OK;.  assert( pI
ce80: 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d 3d 30  dx->isResized==0
ce90: 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 73   );.  nByte = (s
cea0: 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b 20 73  izeof(char*) + s
ceb0: 69 7a 65 6f 66 28 69 31 36 29 20 2b 20 31 29 2a  izeof(i16) + 1)*
cec0: 4e 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 73 71  N;.  zExtra = sq
ced0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
cee0: 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  o(db, nByte);.  
cef0: 69 66 28 20 7a 45 78 74 72 61 3d 3d 30 20 29 20  if( zExtra==0 ) 
cf00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
cf10: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63  MEM_BKPT;.  memc
cf20: 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d  py(zExtra, pIdx-
cf30: 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66 28  >azColl, sizeof(
cf40: 63 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e 43 6f  char*)*pIdx->nCo
cf50: 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn);.  pIdx->a
cf60: 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63  zColl = (const c
cf70: 68 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a 20 20  har**)zExtra;.  
cf80: 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66  zExtra += sizeof
cf90: 28 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d  (char*)*N;.  mem
cfa0: 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78  cpy(zExtra, pIdx
cfb0: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65  ->aiColumn, size
cfc0: 6f 66 28 69 31 36 29 2a 70 49 64 78 2d 3e 6e 43  of(i16)*pIdx->nC
cfd0: 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e  olumn);.  pIdx->
cfe0: 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a  aiColumn = (i16*
cff0: 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72  )zExtra;.  zExtr
d000: 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29  a += sizeof(i16)
d010: 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78  *N;.  memcpy(zEx
d020: 74 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f 72 74  tra, pIdx->aSort
d030: 4f 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e 43 6f  Order, pIdx->nCo
d040: 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn);.  pIdx->a
d050: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
d060: 29 7a 45 78 74 72 61 3b 0a 20 20 70 49 64 78 2d  )zExtra;.  pIdx-
d070: 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20  >nColumn = N;.  
d080: 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 20  pIdx->isResized 
d090: 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
d0a0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
d0b0: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 74  * Estimate the t
d0c0: 6f 74 61 6c 20 72 6f 77 20 77 69 64 74 68 20 66  otal row width f
d0d0: 6f 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  or a table..*/.s
d0e0: 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d  tatic void estim
d0f0: 61 74 65 54 61 62 6c 65 57 69 64 74 68 28 54 61  ateTableWidth(Ta
d100: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 75 6e  ble *pTab){.  un
d110: 73 69 67 6e 65 64 20 77 54 61 62 6c 65 20 3d 20  signed wTable = 
d120: 30 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d  0;.  const Colum
d130: 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 69 6e  n *pTabCol;.  in
d140: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61  t i;.  for(i=pTa
d150: 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43 6f 6c  b->nCol, pTabCol
d160: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30  =pTab->aCol; i>0
d170: 3b 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b  ; i--, pTabCol++
d180: 29 7b 0a 20 20 20 20 77 54 61 62 6c 65 20 2b 3d  ){.    wTable +=
d190: 20 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b   pTabCol->szEst;
d1a0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d  .  }.  if( pTab-
d1b0: 3e 69 50 4b 65 79 3c 30 20 29 20 77 54 61 62 6c  >iPKey<0 ) wTabl
d1c0: 65 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 54  e++;.  pTab->szT
d1d0: 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  abRow = sqlite3L
d1e0: 6f 67 45 73 74 28 77 54 61 62 6c 65 2a 34 29 3b  ogEst(wTable*4);
d1f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  .}../*.** Estima
d200: 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20 73  te the average s
d210: 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 66 6f 72  ize of a row for
d220: 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74   an index..*/.st
d230: 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61  atic void estima
d240: 74 65 49 6e 64 65 78 57 69 64 74 68 28 49 6e 64  teIndexWidth(Ind
d250: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73  ex *pIdx){.  uns
d260: 69 67 6e 65 64 20 77 49 6e 64 65 78 20 3d 20 30  igned wIndex = 0
d270: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  ;.  int i;.  con
d280: 73 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20  st Column *aCol 
d290: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
d2a0: 61 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aCol;.  for(i=0;
d2b0: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
d2c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31 36 20  ; i++){.    i16 
d2d0: 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  x = pIdx->aiColu
d2e0: 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  mn[i];.    asser
d2f0: 74 28 20 78 3c 70 49 64 78 2d 3e 70 54 61 62 6c  t( x<pIdx->pTabl
d300: 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 77  e->nCol );.    w
d310: 49 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f 20 31  Index += x<0 ? 1
d320: 20 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69   : aCol[pIdx->ai
d330: 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74  Column[i]].szEst
d340: 3b 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73 7a  ;.  }.  pIdx->sz
d350: 49 64 78 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  IdxRow = sqlite3
d360: 4c 6f 67 45 73 74 28 77 49 6e 64 65 78 2a 34 29  LogEst(wIndex*4)
d370: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  ;.}../* Return t
d380: 72 75 65 20 69 66 20 76 61 6c 75 65 20 78 20 69  rue if value x i
d390: 73 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66 20 74  s found any of t
d3a0: 68 65 20 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e  he first nCol en
d3b0: 74 72 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b 5d  tries of aiCol[]
d3c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
d3d0: 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69  asColumn(const i
d3e0: 31 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e  16 *aiCol, int n
d3f0: 43 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77  Col, int x){.  w
d400: 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30  hile( nCol-- > 0
d410: 20 29 20 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f   ) if( x==*(aiCo
d420: 6c 2b 2b 29 20 29 20 72 65 74 75 72 6e 20 31 3b  l++) ) return 1;
d430: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
d440: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
d450: 6e 65 20 72 75 6e 73 20 61 74 20 74 68 65 20 65  ne runs at the e
d460: 6e 64 20 6f 66 20 70 61 72 73 69 6e 67 20 61 20  nd of parsing a 
d470: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
d480: 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20 68  tement that.** h
d490: 61 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  as a WITHOUT ROW
d4a0: 49 44 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  ID clause.  The 
d4b0: 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
d4c0: 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76 65 72  ine is to conver
d4d0: 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72 6e  t both.** intern
d4e0: 61 6c 20 73 63 68 65 6d 61 20 64 61 74 61 20 73  al schema data s
d4f0: 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 74 68  tructures and th
d500: 65 20 67 65 6e 65 72 61 74 65 64 20 56 44 42 45  e generated VDBE
d510: 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20 74 68   code so that th
d520: 65 79 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f 70  ey.** are approp
d530: 72 69 61 74 65 20 66 6f 72 20 61 20 57 49 54 48  riate for a WITH
d540: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20  OUT ROWID table 
d550: 69 6e 73 74 65 61 64 20 6f 66 20 61 20 72 6f 77  instead of a row
d560: 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68 61  id table..** Cha
d570: 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a  nges include:.**
d580: 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 53 65 74  .**     (1)  Set
d590: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   all columns of 
d5a0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d5b0: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f  schema object to
d5c0: 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a   be NOT NULL..**
d5d0: 20 20 20 20 20 28 32 29 20 20 43 6f 6e 76 65 72       (2)  Conver
d5e0: 74 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 54  t the OP_CreateT
d5f0: 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f  able into an OP_
d600: 43 72 65 61 74 65 49 6e 64 65 78 2e 20 20 54 68  CreateIndex.  Th
d610: 65 72 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20  ere is.**       
d620: 20 20 20 6e 6f 20 72 6f 77 69 64 20 62 74 72 65     no rowid btre
d630: 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20  e for a WITHOUT 
d640: 52 4f 57 49 44 2e 20 20 49 6e 73 74 65 61 64 2c  ROWID.  Instead,
d650: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a   the canonical.*
d660: 2a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20  *          data 
d670: 73 74 6f 72 61 67 65 20 69 73 20 61 20 63 6f 76  storage is a cov
d680: 65 72 69 6e 67 20 69 6e 64 65 78 20 62 74 72 65  ering index btre
d690: 65 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 42  e..**     (3)  B
d6a0: 79 70 61 73 73 20 74 68 65 20 63 72 65 61 74 69  ypass the creati
d6b0: 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  on of the sqlite
d6c0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e  _master table en
d6d0: 74 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  try.**          
d6e0: 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59 20  for the PRIMARY 
d6f0: 4b 45 59 20 61 73 20 74 68 65 20 70 72 69 6d 61  KEY as the prima
d700: 72 79 20 6b 65 79 20 69 6e 64 65 78 20 69 73 20  ry key index is 
d710: 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  now.**          
d720: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
d730: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
d740: 74 61 62 6c 65 20 65 6e 74 72 79 20 6f 66 20 74  table entry of t
d750: 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e  he table itself.
d760: 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53 65 74  .**     (4)  Set
d770: 20 74 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d 20   the Index.tnum 
d780: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
d790: 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  EY Index object 
d7a0: 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
d7b0: 20 20 20 73 63 68 65 6d 61 20 74 6f 20 74 68 65     schema to the
d7c0: 20 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20 74   rootpage from t
d7d0: 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a  he main table..*
d7e0: 2a 20 20 20 20 20 28 35 29 20 20 41 64 64 20 61  *     (5)  Add a
d7f0: 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  ll table columns
d800: 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20   to the PRIMARY 
d810: 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  KEY Index object
d820: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f 20  .**          so 
d830: 74 68 61 74 20 74 68 65 20 50 52 49 4d 41 52 59  that the PRIMARY
d840: 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72 69   KEY is a coveri
d850: 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20 73  ng index.  The s
d860: 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20 20  urplus.**       
d870: 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70     columns are p
d880: 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e 6e  art of KeyInfo.n
d890: 58 46 69 65 6c 64 20 61 6e 64 20 61 72 65 20 6e  XField and are n
d8a0: 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20  ot used for.**  
d8b0: 20 20 20 20 20 20 20 20 73 6f 72 74 69 6e 67 20          sorting 
d8c0: 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e 69  or lookup or uni
d8d0: 71 75 65 6e 65 73 73 20 63 68 65 63 6b 73 2e 0a  queness checks..
d8e0: 2a 2a 20 20 20 20 20 28 36 29 20 20 52 65 70 6c  **     (6)  Repl
d8f0: 61 63 65 20 74 68 65 20 72 6f 77 69 64 20 74 61  ace the rowid ta
d900: 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d 61  il on all automa
d910: 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  tically generate
d920: 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20 20 20  d UNIQUE.**     
d930: 20 20 20 20 20 69 6e 64 69 63 65 73 20 77 69 74       indices wit
d940: 68 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  h the PRIMARY KE
d950: 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a  Y columns..**.**
d960: 20 46 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62   For virtual tab
d970: 6c 65 73 2c 20 6f 6e 6c 79 20 28 31 29 20 69 73  les, only (1) is
d980: 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73   performed..*/.s
d990: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 76 65  tatic void conve
d9a0: 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64  rtToWithoutRowid
d9b0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
d9c0: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
d9d0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  ){.  Index *pIdx
d9e0: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 0a  ;.  Index *pPk;.
d9f0: 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e 74    int nPk;.  int
da00: 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33   i, j;.  sqlite3
da10: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
da20: 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  b;.  Vdbe *v = p
da30: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20  Parse->pVdbe;.. 
da40: 20 2f 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 50   /* Mark every P
da50: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
da60: 6e 20 61 73 20 4e 4f 54 20 4e 55 4c 4c 20 28 65  n as NOT NULL (e
da70: 78 63 65 70 74 20 66 6f 72 20 69 6d 70 6f 73 74  xcept for impost
da80: 65 72 20 74 61 62 6c 65 73 29 0a 20 20 2a 2f 0a  er tables).  */.
da90: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
daa0: 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29 7b  imposterTable ){
dab0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
dac0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
dad0: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61  {.      if( (pTa
dae0: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c  b->aCol[i].colFl
daf0: 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52  ags & COLFLAG_PR
db00: 49 4d 4b 45 59 29 21 3d 30 20 29 7b 0a 20 20 20  IMKEY)!=0 ){.   
db10: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
db20: 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 4f 45 5f  i].notNull = OE_
db30: 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Abort;.      }. 
db40: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
db50: 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 72 61  he remaining tra
db60: 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 20 6f 6e 6c  nsformations onl
db70: 79 20 61 70 70 6c 79 20 74 6f 20 62 2d 74 72 65  y apply to b-tre
db80: 65 20 74 61 62 6c 65 73 2c 20 6e 6f 74 20 74 6f  e tables, not to
db90: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  .  ** virtual ta
dba0: 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 49 4e  bles */.  if( IN
dbb0: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20  _DECLARE_VTAB ) 
dbc0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 43 6f  return;..  /* Co
dbd0: 6e 76 65 72 74 20 74 68 65 20 4f 50 5f 43 72 65  nvert the OP_Cre
dbe0: 61 74 65 54 61 62 6c 65 20 6f 70 63 6f 64 65 20  ateTable opcode 
dbf0: 74 68 61 74 20 77 6f 75 6c 64 20 6e 6f 72 6d 61  that would norma
dc00: 6c 6c 79 20 63 72 65 61 74 65 20 74 68 65 0a 20  lly create the. 
dc10: 20 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 66 6f   ** root-page fo
dc20: 72 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f  r the table into
dc30: 20 61 6e 20 4f 50 5f 43 72 65 61 74 65 49 6e 64   an OP_CreateInd
dc40: 65 78 20 6f 70 63 6f 64 65 2e 20 20 54 68 65 20  ex opcode.  The 
dc50: 69 6e 64 65 78 0a 20 20 2a 2a 20 63 72 65 61 74  index.  ** creat
dc60: 65 64 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ed will become t
dc70: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
dc80: 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ndex..  */.  if(
dc90: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54   pParse->addrCrT
dca0: 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
dcb0: 28 20 76 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ( v );.    sqlit
dcc0: 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f  e3VdbeChangeOpco
dcd0: 64 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64  de(v, pParse->ad
dce0: 64 72 43 72 54 61 62 2c 20 4f 50 5f 43 72 65 61  drCrTab, OP_Crea
dcf0: 74 65 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20  teIndex);.  }.. 
dd00: 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 50   /* Locate the P
dd10: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
dd20: 2e 20 20 4f 72 2c 20 69 66 20 74 68 69 73 20 74  .  Or, if this t
dd30: 61 62 6c 65 20 77 61 73 20 6f 72 69 67 69 6e 61  able was origina
dd40: 6c 6c 79 0a 20 20 2a 2a 20 61 6e 20 49 4e 54 45  lly.  ** an INTE
dd50: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
dd60: 74 61 62 6c 65 2c 20 63 72 65 61 74 65 20 61 20  table, create a 
dd70: 6e 65 77 20 50 52 49 4d 41 52 59 20 4b 45 59 20  new PRIMARY KEY 
dd80: 69 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a 20 20 69  index. .  */.  i
dd90: 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d  f( pTab->iPKey>=
dda0: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  0 ){.    ExprLis
ddb0: 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 54 6f  t *pList;.    To
ddc0: 6b 65 6e 20 69 70 6b 54 6f 6b 65 6e 3b 0a 20 20  ken ipkToken;.  
ddd0: 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e    sqlite3TokenIn
dde0: 69 74 28 26 69 70 6b 54 6f 6b 65 6e 2c 20 70 54  it(&ipkToken, pT
ddf0: 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69  ab->aCol[pTab->i
de00: 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  PKey].zName);.  
de10: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
de20: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
de30: 70 50 61 72 73 65 2c 20 30 2c 20 0a 20 20 20 20  pParse, 0, .    
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
de50: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
de60: 62 2c 20 54 4b 5f 49 44 2c 20 26 69 70 6b 54 6f  b, TK_ID, &ipkTo
de70: 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 69 66  ken, 0));.    if
de80: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
de90: 75 72 6e 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  urn;.    pList->
dea0: 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
deb0: 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74   pParse->iPkSort
dec0: 4f 72 64 65 72 3b 0a 20 20 20 20 61 73 73 65 72  Order;.    asser
ded0: 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  t( pParse->pNewT
dee0: 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20  able==pTab );.  
def0: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49    sqlite3CreateI
df00: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20  ndex(pParse, 0, 
df10: 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 70 54 61  0, 0, pList, pTa
df20: 62 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c 20 30  b->keyConf, 0, 0
df30: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
df50: 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52  QLITE_IDXTYPE_PR
df60: 49 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20 20 69  IMARYKEY);.    i
df70: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
df80: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
df90: 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50    pPk = sqlite3P
dfa0: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
dfb0: 54 61 62 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  Tab);.    pTab->
dfc0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 7d 65  iPKey = -1;.  }e
dfd0: 6c 73 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73  lse{.    pPk = s
dfe0: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
dff0: 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 0a 20 20  Index(pTab);..  
e000: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 6d 6f    /*.    ** Remo
e010: 76 65 20 61 6c 6c 20 72 65 64 75 6e 64 61 6e 74  ve all redundant
e020: 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
e030: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  e PRIMARY KEY.  
e040: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 68 61  For example, cha
e050: 6e 67 65 0a 20 20 20 20 2a 2a 20 22 50 52 49 4d  nge.    ** "PRIM
e060: 41 52 59 20 4b 45 59 28 61 2c 62 2c 61 2c 62 2c  ARY KEY(a,b,a,b,
e070: 63 2c 62 2c 63 2c 64 29 22 20 69 6e 74 6f 20 6a  c,b,c,d)" into j
e080: 75 73 74 20 22 50 52 49 4d 41 52 59 20 4b 45 59  ust "PRIMARY KEY
e090: 28 61 2c 62 2c 63 2c 64 29 22 2e 20 20 4c 61 74  (a,b,c,d)".  Lat
e0a0: 65 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 61  er.    ** code a
e0b0: 73 73 75 6d 65 73 20 74 68 65 20 50 52 49 4d 41  ssumes the PRIMA
e0c0: 52 59 20 4b 45 59 20 63 6f 6e 74 61 69 6e 73 20  RY KEY contains 
e0d0: 6e 6f 20 72 65 70 65 61 74 65 64 20 63 6f 6c 75  no repeated colu
e0e0: 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mns..    */.    
e0f0: 66 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c 70 50 6b  for(i=j=1; i<pPk
e100: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nKeyCol; i++){
e110: 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 43 6f  .      if( hasCo
e120: 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75  lumn(pPk->aiColu
e130: 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69 43 6f  mn, j, pPk->aiCo
e140: 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20  lumn[i]) ){.    
e150: 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e      pPk->nColumn
e160: 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  --;.      }else{
e170: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69  .        pPk->ai
e180: 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50  Column[j++] = pP
e190: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  k->aiColumn[i];.
e1a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e1b0: 20 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d    pPk->nKeyCol =
e1c0: 20 6a 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   j;.  }.  assert
e1d0: 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20 70 50  ( pPk!=0 );.  pP
e1e0: 6b 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20  k->isCovering = 
e1f0: 31 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  1;.  if( !db->in
e200: 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65  it.imposterTable
e210: 20 29 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e   ) pPk->uniqNotN
e220: 75 6c 6c 20 3d 20 31 3b 0a 20 20 6e 50 6b 20 3d  ull = 1;.  nPk =
e230: 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a   pPk->nKeyCol;..
e240: 20 20 2f 2a 20 42 79 70 61 73 73 20 74 68 65 20    /* Bypass the 
e250: 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  creation of the 
e260: 50 52 49 4d 41 52 59 20 4b 45 59 20 62 74 72 65  PRIMARY KEY btre
e270: 65 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65  e and the sqlite
e280: 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62  _master.  ** tab
e290: 6c 65 20 65 6e 74 72 79 2e 20 54 68 69 73 20 69  le entry. This i
e2a0: 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20  s only required 
e2b0: 69 66 20 63 75 72 72 65 6e 74 6c 79 20 67 65 6e  if currently gen
e2c0: 65 72 61 74 69 6e 67 20 56 44 42 45 0a 20 20 2a  erating VDBE.  *
e2d0: 2a 20 63 6f 64 65 20 66 6f 72 20 61 20 43 52 45  * code for a CRE
e2e0: 41 54 45 20 54 41 42 4c 45 20 28 6e 6f 74 20 77  ATE TABLE (not w
e2f0: 68 65 6e 20 70 61 72 73 69 6e 67 20 6f 6e 65 20  hen parsing one 
e300: 61 73 20 70 61 72 74 20 6f 66 20 72 65 61 64 69  as part of readi
e310: 6e 67 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61  ng.  ** a databa
e320: 73 65 20 73 63 68 65 6d 61 29 2e 20 20 2a 2f 0a  se schema).  */.
e330: 20 20 69 66 28 20 76 20 26 26 20 70 50 6b 2d 3e    if( v && pPk->
e340: 74 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 61 73  tnum>0 ){.    as
e350: 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62  sert( db->init.b
e360: 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  usy==0 );.    sq
e370: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f  lite3VdbeChangeO
e380: 70 63 6f 64 65 28 76 2c 20 70 50 6b 2d 3e 74 6e  pcode(v, pPk->tn
e390: 75 6d 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  um, OP_Goto);.  
e3a0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74  }..  /* The root
e3b0: 20 70 61 67 65 20 6f 66 20 74 68 65 20 50 52 49   page of the PRI
e3c0: 4d 41 52 59 20 4b 45 59 20 69 73 20 74 68 65 20  MARY KEY is the 
e3d0: 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 20  table root page 
e3e0: 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d  */.  pPk->tnum =
e3f0: 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20   pTab->tnum;..  
e400: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 69 6e  /* Update the in
e410: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
e420: 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e  tation of all UN
e430: 49 51 55 45 20 69 6e 64 69 63 65 73 20 62 79 20  IQUE indices by 
e440: 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20 2a 2a 20  converting.  ** 
e450: 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 20  the final rowid 
e460: 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20  column into one 
e470: 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20  or more columns 
e480: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
e490: 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  EY..  */.  for(p
e4a0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
e4b0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
e4c0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  x->pNext){.    i
e4d0: 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 49 73  nt n;.    if( Is
e4e0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
e4f0: 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65  pIdx) ) continue
e500: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b  ;.    for(i=n=0;
e510: 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20   i<nPk; i++){.  
e520: 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75      if( !hasColu
e530: 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  mn(pIdx->aiColum
e540: 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  n, pIdx->nKeyCol
e550: 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
e560: 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d  i]) ) n++;.    }
e570: 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  .    if( n==0 ){
e580: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
e590: 6e 64 65 78 20 69 73 20 61 20 73 75 70 65 72 73  ndex is a supers
e5a0: 65 74 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72  et of the primar
e5b0: 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20 70  y key */.      p
e5c0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70  Idx->nColumn = p
e5d0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  Idx->nKeyCol;.  
e5e0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
e5f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73 69    }.    if( resi
e600: 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62  zeIndexObject(db
e610: 2c 20 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b  , pIdx, pIdx->nK
e620: 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65 74 75 72  eyCol+n) ) retur
e630: 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  n;.    for(i=0, 
e640: 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  j=pIdx->nKeyCol;
e650: 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20   i<nPk; i++){.  
e660: 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75      if( !hasColu
e670: 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  mn(pIdx->aiColum
e680: 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  n, pIdx->nKeyCol
e690: 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
e6a0: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  i]) ){.        p
e6b0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
e6c0: 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
e6d0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 64  [i];.        pId
e6e0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70  x->azColl[j] = p
e6f0: 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  Pk->azColl[i];. 
e700: 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
e710: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
e720: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
e730: 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  umn>=pIdx->nKeyC
e740: 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61 73 73 65  ol+n );.    asse
e750: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
e760: 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  n>=j );.  }..  /
e770: 2a 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20  * Add all table 
e780: 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50  columns to the P
e790: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
e7a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 6b 3c  .  */.  if( nPk<
e7b0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
e7c0: 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65    if( resizeInde
e7d0: 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 50 6b 2c  xObject(db, pPk,
e7e0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 20 72   pTab->nCol) ) r
e7f0: 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69  eturn;.    for(i
e800: 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54 61  =0, j=nPk; i<pTa
e810: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
e820: 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c       if( !hasCol
e830: 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  umn(pPk->aiColum
e840: 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20 20 20 20  n, j, i) ){.    
e850: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 50      assert( j<pP
e860: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  k->nColumn );.  
e870: 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c        pPk->aiCol
e880: 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[j] = i;.    
e890: 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b      pPk->azColl[
e8a0: 6a 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  j] = sqlite3StrB
e8b0: 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 20 20 6a  INARY;.        j
e8c0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
e8d0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
e8e0: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b  k->nColumn==j );
e8f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
e900: 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20  b->nCol==j );.  
e910: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e  }else{.    pPk->
e920: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e  nColumn = pTab->
e930: 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nCol;.  }.}../*.
e940: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e950: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70  is called to rep
e960: 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29  ort the final ")
e970: 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65  " that terminate
e980: 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41  s.** a CREATE TA
e990: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
e9a0: 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73  *.** The table s
e9b0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f 74  tructure that ot
e9c0: 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  her action routi
e9d0: 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62 75  nes have been bu
e9e0: 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64  ilding.** is add
e9f0: 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e  ed to the intern
ea00: 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20  al hash tables, 
ea10: 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f  assuming no erro
ea20: 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72  rs have.** occur
ea30: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e  red..**.** An en
ea40: 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c  try for the tabl
ea50: 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65  e is made in the
ea60: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e   master table on
ea70: 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a   disk, unless.**
ea80: 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
ea90: 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62  rary table or db
eaa0: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20  ->init.busy==1. 
eab0: 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62   When db->init.b
eac0: 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61  usy==1.** it mea
ead0: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
eae0: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
eaf0: 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73  ter table becaus
eb00: 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e  e we just.** con
eb10: 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64 61  nected to the da
eb20: 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75 73  tabase or becaus
eb30: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
eb40: 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a  ter table has.**
eb50: 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65   recently change
eb60: 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20  d, so the entry 
eb70: 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 61  for this table a
eb80: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e  lready exists in
eb90: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  .** the sqlite_m
eba0: 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65  aster table.  We
ebb0: 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20   do not want to 
ebc0: 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e  create it again.
ebd0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53  .**.** If the pS
ebe0: 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69  elect argument i
ebf0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d  s not NULL, it m
ec00: 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 72  eans that this r
ec10: 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61  outine.** was ca
ec20: 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
ec30: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
ec40: 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45   from a .** "CRE
ec50: 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53  ATE TABLE ... AS
ec60: 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61   SELECT ..." sta
ec70: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c  tement.  The col
ec80: 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  umn names of.** 
ec90: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69  the new table wi
eca0: 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65 73  ll match the res
ecb0: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
ecc0: 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ELECT..*/.void s
ecd0: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 0a  qlite3EndTable(.
ece0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
ecf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
ed00: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
ed10: 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20  Token *pCons,   
ed20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27          /* The '
ed30: 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20 74  ,' token after t
ed40: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64  he last column d
ed50: 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  efn. */.  Token 
ed60: 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20  *pEnd,          
ed70: 20 20 2f 2a 20 54 68 65 20 27 29 27 20 62 65 66    /* The ')' bef
ed80: 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69 6e 20 74  ore options in t
ed90: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
eda0: 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70 74 73 2c  */.  u8 tabOpts,
edb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
edc0: 45 78 74 72 61 20 74 61 62 6c 65 20 6f 70 74 69  Extra table opti
edd0: 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20 30 2e 20  ons. Usually 0. 
ede0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
edf0: 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20  lect         /* 
ee00: 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43  Select from a "C
ee10: 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c  REATE ... AS SEL
ee20: 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ECT" */.){.  Tab
ee30: 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  le *p;          
ee40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
ee50: 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  w table */.  sql
ee60: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
ee70: 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61  e->db; /* The da
ee80: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
ee90: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  n */.  int iDb; 
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eeb0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e 20   /* Database in 
eec0: 77 68 69 63 68 20 74 68 65 20 74 61 62 6c 65 20  which the table 
eed0: 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78  lives */.  Index
eee0: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
eef0: 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d 70 6c 69       /* An impli
ef00: 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ed index of the 
ef10: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20  table */..  if( 
ef20: 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65  pEnd==0 && pSele
ef30: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ct==0 ){.    ret
ef40: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
ef50: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
ef60: 69 6c 65 64 20 29 3b 0a 20 20 70 20 3d 20 70 50  iled );.  p = pP
ef70: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
ef80: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
ef90: 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
efa0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
efb0: 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a  || !pSelect );..
efc0: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
efd0: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
efe0: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
eff0: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
f000: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
f010: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
f020: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
f030: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
f040: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
f050: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
f060: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
f070: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
f080: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
f090: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
f0a0: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
f0b0: 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
f0c0: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
f0d0: 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  er.  ** should h
f0e0: 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65  ave been put the
f0f0: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
f100: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
f110: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
f120: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
f130: 65 72 20 69 73 20 31 2c 20 74 68 61 74 20 6d 65  er is 1, that me
f140: 61 6e 73 20 74 68 69 73 20 69 73 20 74 68 65 20  ans this is the 
f150: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20  sqlite_master.  
f160: 2a 2a 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e  ** table itself.
f170: 20 20 53 6f 20 6d 61 72 6b 20 69 74 20 72 65 61    So mark it rea
f180: 64 2d 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  d-only..  */.  i
f190: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
f1a0: 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20   ){.    p->tnum 
f1b0: 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
f1c0: 75 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 74  um;.    if( p->t
f1d0: 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e 74 61 62 46  num==1 ) p->tabF
f1e0: 6c 61 67 73 20 7c 3d 20 54 46 5f 52 65 61 64 6f  lags |= TF_Reado
f1f0: 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  nly;.  }..  /* S
f200: 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  pecial processin
f210: 67 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  g for WITHOUT RO
f220: 57 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20  WID Tables */.  
f230: 69 66 28 20 74 61 62 4f 70 74 73 20 26 20 54 46  if( tabOpts & TF
f240: 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b  _WithoutRowid ){
f250: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62  .    if( (p->tab
f260: 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
f270: 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20  ncrement) ){.   
f280: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
f290: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
f2a0: 20 20 20 20 20 22 41 55 54 4f 49 4e 43 52 45 4d       "AUTOINCREM
f2b0: 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  ENT not allowed 
f2c0: 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  on WITHOUT ROWID
f2d0: 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20   tables");.     
f2e0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
f2f0: 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c     if( (p->tabFl
f300: 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d  ags & TF_HasPrim
f310: 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20  aryKey)==0 ){.  
f320: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f330: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 50 52 49  Msg(pParse, "PRI
f340: 4d 41 52 59 20 4b 45 59 20 6d 69 73 73 69 6e 67  MARY KEY missing
f350: 20 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c 20 70   on table %s", p
f360: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ->zName);.    }e
f370: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61  lse{.      p->ta
f380: 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69 74  bFlags |= TF_Wit
f390: 68 6f 75 74 52 6f 77 69 64 20 7c 20 54 46 5f 4e  houtRowid | TF_N
f3a0: 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20  oVisibleRowid;. 
f3b0: 20 20 20 20 20 63 6f 6e 76 65 72 74 54 6f 57 69       convertToWi
f3c0: 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28  thoutRowidTable(
f3d0: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
f3e0: 7d 0a 20 20 7d 0a 0a 20 20 69 44 62 20 3d 20 73  }.  }..  iDb = s
f3f0: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
f400: 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65  dex(db, p->pSche
f410: 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ma);..#ifndef SQ
f420: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
f430: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d    /* Resolve nam
f440: 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20  es in all CHECK 
f450: 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65  constraint expre
f460: 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ssions..  */.  i
f470: 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a  f( p->pCheck ){.
f480: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
f490: 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28  veSelfReference(
f4a0: 70 50 61 72 73 65 2c 20 70 2c 20 4e 43 5f 49 73  pParse, p, NC_Is
f4b0: 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e 70 43 68  Check, 0, p->pCh
f4c0: 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  eck);.  }.#endif
f4d0: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
f4e0: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20  ITE_OMIT_CHECK) 
f4f0: 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74  */..  /* Estimat
f500: 65 20 74 68 65 20 61 76 65 72 61 67 65 20 72 6f  e the average ro
f510: 77 20 73 69 7a 65 20 66 6f 72 20 74 68 65 20 74  w size for the t
f520: 61 62 6c 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c  able and for all
f530: 20 69 6d 70 6c 69 65 64 20 69 6e 64 69 63 65 73   implied indices
f540: 20 2a 2f 0a 20 20 65 73 74 69 6d 61 74 65 54 61   */.  estimateTa
f550: 62 6c 65 57 69 64 74 68 28 70 29 3b 0a 20 20 66  bleWidth(p);.  f
f560: 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65  or(pIdx=p->pInde
f570: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
f580: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
f590: 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64  estimateIndexWid
f5a0: 74 68 28 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20  th(pIdx);.  }.. 
f5b0: 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69   /* If not initi
f5c0: 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72  alizing, then cr
f5d0: 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f  eate a record fo
f5e0: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a  r the new table.
f5f0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49    ** in the SQLI
f600: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
f610: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
f620: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
f630: 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52  is is a TEMPORAR
f640: 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74  Y table, write t
f650: 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  he entry into th
f660: 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
f670: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
f680: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
f690: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
f6a0: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
f6b0: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69  it.busy ){.    i
f6c0: 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt n;.    Vdbe *
f6d0: 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  v;.    char *zTy
f6e0: 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22  pe;    /* "view"
f6f0: 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20   or "table" */. 
f700: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b     char *zType2;
f710: 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20     /* "VIEW" or 
f720: 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63  "TABLE" */.    c
f730: 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f  har *zStmt;    /
f740: 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52  * Text of the CR
f750: 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52  EATE TABLE or CR
f760: 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d  EATE VIEW statem
f770: 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20  ent */..    v = 
f780: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
f790: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
f7a0: 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
f7b0: 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74  turn;..    sqlit
f7c0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
f7d0: 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20  OP_Close, 0);.. 
f7e0: 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e     /* .    ** In
f7f0: 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 66  itialize zType f
f800: 6f 72 20 74 68 65 20 6e 65 77 20 76 69 65 77 20  or the new view 
f810: 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  or table..    */
f820: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c  .    if( p->pSel
f830: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
f840: 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62  /* A regular tab
f850: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70  le */.      zTyp
f860: 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20  e = "table";.   
f870: 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42     zType2 = "TAB
f880: 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  LE";.#ifndef SQL
f890: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
f8a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
f8b0: 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  * A view */.    
f8c0: 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22    zType = "view"
f8d0: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d  ;.      zType2 =
f8e0: 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a   "VIEW";.#endif.
f8f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
f900: 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41 54   this is a CREAT
f910: 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53 45  E TABLE xx AS SE
f920: 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74  LECT ..., execut
f930: 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20  e the SELECT.   
f940: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f   ** statement to
f950: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65   populate the ne
f960: 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f  w table. The roo
f970: 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  t-page number fo
f980: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77  r the.    ** new
f990: 20 74 61 62 6c 65 20 69 73 20 69 6e 20 72 65 67   table is in reg
f9a0: 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65  ister pParse->re
f9b0: 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  gRoot..    **.  
f9c0: 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45    ** Once the SE
f9d0: 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f  LECT has been co
f9e0: 64 65 64 20 62 79 20 73 71 6c 69 74 65 33 53 65  ded by sqlite3Se
f9f0: 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e  lect(), it is in
fa00: 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62   a.    ** suitab
fa10: 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75 65 72  le state to quer
fa20: 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  y for the column
fa30: 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73   names and types
fa40: 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20   to be used.    
fa50: 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74 61  ** by the new ta
fa60: 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ble..    **.    
fa70: 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63 68  ** A shared-cach
fa80: 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20  e write-lock is 
fa90: 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20  not required to 
faa0: 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77  write to the new
fab0: 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61   table,.    ** a
fac0: 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20  s a schema-lock 
fad0: 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
fae0: 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  y been obtained 
faf0: 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53 69  to create it. Si
fb00: 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68  nce.    ** a sch
fb10: 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65  ema-lock exclude
fb20: 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61  s all other data
fb30: 62 61 73 65 20 75 73 65 72 73 2c 20 74 68 65 20  base users, the 
fb40: 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64  write-lock would
fb50: 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e  .    ** be redun
fb60: 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  dant..    */.   
fb70: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
fb80: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
fb90: 20 64 65 73 74 3b 20 20 20 20 2f 2a 20 57 68 65   dest;    /* Whe
fba0: 72 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 68  re the SELECT sh
fbb0: 6f 75 6c 64 20 73 74 6f 72 65 20 72 65 73 75 6c  ould store resul
fbc0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
fbd0: 72 65 67 59 69 65 6c 64 3b 20 20 20 20 20 20 20  regYield;       
fbe0: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
fbf0: 69 6e 67 20 63 6f 2d 72 6f 75 74 69 6e 65 20 65  ing co-routine e
fc00: 6e 74 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20  ntry-point */.  
fc10: 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b      int addrTop;
fc20: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
fc30: 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  f the co-routine
fc40: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
fc50: 67 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  gRec;         /*
fc60: 20 41 20 72 65 63 6f 72 64 20 74 6f 20 62 65 20   A record to be 
fc70: 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 68 65 20  insert into the 
fc80: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  new table */.   
fc90: 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b     int regRowid;
fca0: 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
fcb0: 6f 66 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  of the next row 
fcc0: 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20  to insert */.   
fcd0: 20 20 20 69 6e 74 20 61 64 64 72 49 6e 73 4c 6f     int addrInsLo
fce0: 6f 70 3b 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66  op;    /* Top of
fcf0: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 69 6e   the loop for in
fd00: 73 65 72 74 69 6e 67 20 72 6f 77 73 20 2a 2f 0a  serting rows */.
fd10: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65        Table *pSe
fd20: 6c 54 61 62 3b 20 20 20 20 20 2f 2a 20 41 20 74  lTab;     /* A t
fd30: 61 62 6c 65 20 74 68 61 74 20 64 65 73 63 72 69  able that descri
fd40: 62 65 73 20 74 68 65 20 53 45 4c 45 43 54 20 72  bes the SELECT r
fd50: 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 20 20 20  esults */..     
fd60: 20 72 65 67 59 69 65 6c 64 20 3d 20 2b 2b 70 50   regYield = ++pP
fd70: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
fd80: 20 20 72 65 67 52 65 63 20 3d 20 2b 2b 70 50 61    regRec = ++pPa
fd90: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
fda0: 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50   regRowid = ++pP
fdb0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
fdc0: 20 20 61 73 73 65 72 74 28 70 50 61 72 73 65 2d    assert(pParse-
fdd0: 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20  >nTab==1);.     
fde0: 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
fdf0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
fe00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fe10: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  3(v, OP_OpenWrit
fe20: 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65  e, 1, pParse->re
fe30: 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20  gRoot, iDb);.   
fe40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
fe50: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
fe60: 5f 50 32 49 53 52 45 47 29 3b 0a 20 20 20 20 20  _P2ISREG);.     
fe70: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
fe80: 32 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  2;.      addrTop
fe90: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
fea0: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31  rrentAddr(v) + 1
feb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fec0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
fed0: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
fee0: 65 67 59 69 65 6c 64 2c 20 30 2c 20 61 64 64 72  egYield, 0, addr
fef0: 54 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Top);.      sqli
ff00: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
ff10: 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72  t(&dest, SRT_Cor
ff20: 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64  outine, regYield
ff30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ff40: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
ff50: 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a  Select, &dest);.
ff60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ff70: 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c  eEndCoroutine(v,
ff80: 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20   regYield);.    
ff90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
ffa0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
ffb0: 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28   - 1);.      if(
ffc0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
ffd0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 70 53  return;.      pS
ffe0: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
fff0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
10000 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
10010 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  );.      if( pSe
10020 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  lTab==0 ) return
10030 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10040 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  p->aCol==0 );.  
10050 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53      p->nCol = pS
10060 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
10070 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65     p->aCol = pSe
10080 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
10090 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
100a0 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  = 0;.      pSelT
100b0 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
100c0 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
100d0 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54  eTable(db, pSelT
100e0 61 62 29 3b 0a 20 20 20 20 20 20 61 64 64 72 49  ab);.      addrI
100f0 6e 73 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  nsLoop = sqlite3
10100 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
10110 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e 69 53 44  _Yield, dest.iSD
10120 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 56 64 62  Parm);.      Vdb
10130 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
10140 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10150 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
10160 52 65 63 6f 72 64 2c 20 64 65 73 74 2e 69 53 64  Record, dest.iSd
10170 73 74 2c 20 64 65 73 74 2e 6e 53 64 73 74 2c 20  st, dest.nSdst, 
10180 72 65 67 52 65 63 29 3b 0a 20 20 20 20 20 20 73  regRec);.      s
10190 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e  qlite3TableAffin
101a0 69 74 79 28 76 2c 20 70 2c 20 30 29 3b 0a 20 20  ity(v, p, 0);.  
101b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
101c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
101d0 6f 77 69 64 2c 20 31 2c 20 72 65 67 52 6f 77 69  owid, 1, regRowi
101e0 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
101f0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
10200 50 5f 49 6e 73 65 72 74 2c 20 31 2c 20 72 65 67  P_Insert, 1, reg
10210 52 65 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Rec, regRowid);.
10220 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10230 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 49 6e 73  eGoto(v, addrIns
10240 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Loop);.      sql
10250 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
10260 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29  (v, addrInsLoop)
10270 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10280 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
10290 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d  Close, 1);.    }
102a0 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
102b0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
102c0 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
102d0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
102e0 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
102f0 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63  .      zStmt = c
10300 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64  reateTableStmt(d
10310 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  b, p);.    }else
10320 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70  {.      Token *p
10330 45 6e 64 32 20 3d 20 74 61 62 4f 70 74 73 20 3f  End2 = tabOpts ?
10340 20 26 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54   &pParse->sLastT
10350 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20  oken : pEnd;.   
10360 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e     n = (int)(pEn
10370 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e  d2->z - pParse->
10380 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20  sNameToken.z);. 
10390 20 20 20 20 20 69 66 28 20 70 45 6e 64 32 2d 3e       if( pEnd2->
103a0 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d  z[0]!=';' ) n +=
103b0 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20   pEnd2->n;.     
103c0 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
103d0 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20  MPrintf(db, .   
103e0 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 25         "CREATE %
103f0 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c  s %.*s", zType2,
10400 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d   n, pParse->sNam
10410 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29  eToken.z.      )
10420 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10430 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72  A slot for the r
10440 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64  ecord has alread
10450 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
10460 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   in the .    ** 
10470 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
10480 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65  ble.  We just ne
10490 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61  ed to update tha
104a0 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a  t slot with all.
104b0 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72      ** the infor
104c0 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c  mation we've col
104d0 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  lected..    */. 
104e0 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
104f0 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
10500 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
10510 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45  s ".         "SE
10520 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d  T type='%s', nam
10530 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25  e=%Q, tbl_name=%
10540 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c  Q, rootpage=#%d,
10550 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20   sql=%Q ".      
10560 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25   "WHERE rowid=#%
10570 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44  d",.      db->aD
10580 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c  b[iDb].zDbSName,
10590 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20   MASTER_NAME,.  
105a0 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20      zType,.     
105b0 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
105c0 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
105d0 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
105e0 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20  ,.      zStmt,. 
105f0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67       pParse->reg
10600 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20  Rowid.    );.   
10610 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
10620 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73  b, zStmt);.    s
10630 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
10640 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
10650 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10660 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
10670 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  ENT.    /* Check
10680 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65   to see if we ne
10690 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
106a0 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
106b0 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a  table for.    **
106c0 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f   keeping track o
106d0 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
106e0 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  keys..    */.   
106f0 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67   if( (p->tabFlag
10700 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
10710 6d 65 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  ment)!=0 ){.    
10720 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
10730 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20  >aDb[iDb];.     
10740 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10750 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
10760 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
10770 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53       if( pDb->pS
10780 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d  chema->pSeqTab==
10790 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
107a0 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
107b0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
107c0 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
107d0 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
107e0 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20  ce(name,seq)",. 
107f0 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 44           pDb->zD
10800 62 53 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29  bSName.        )
10810 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10820 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52  #endif..    /* R
10830 65 70 61 72 73 65 20 65 76 65 72 79 74 68 69 6e  eparse everythin
10840 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20  g to update our 
10850 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74  internal data st
10860 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20  ructures */.    
10870 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61  sqlite3VdbeAddPa
10880 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69  rseSchemaOp(v, i
10890 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73  Db,.           s
108a0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
108b0 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27  , "tbl_name='%q'
108c0 20 41 4e 44 20 74 79 70 65 21 3d 27 74 72 69 67   AND type!='trig
108d0 67 65 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  ger'", p->zName)
108e0 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64  );.  }...  /* Ad
108f0 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74  d the table to t
10900 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
10910 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
10920 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
10930 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
10940 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54 61 62  .busy ){.    Tab
10950 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63  le *pOld;.    Sc
10960 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
10970 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  p->pSchema;.    
10980 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
10990 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
109a0 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
109b0 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
109c0 48 61 73 68 49 6e 73 65 72 74 28 26 70 53 63 68  HashInsert(&pSch
109d0 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d  ema->tblHash, p-
109e0 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a 20 20 20 20  >zName, p);.    
109f0 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20  if( pOld ){.    
10a00 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c    assert( p==pOl
10a10 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  d );  /* Malloc 
10a20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
10a30 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65   inside HashInse
10a40 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 73 71  rt() */.      sq
10a50 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
10a60 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
10a70 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
10a80 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
10a90 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
10aa0 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
10ab0 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65  Changes;..#ifnde
10ac0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
10ad0 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28  TERTABLE.    if(
10ae0 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a   !p->pSelect ){.
10af0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
10b00 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74   *zName = (const
10b10 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e   char *)pParse->
10b20 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20  sNameToken.z;.  
10b30 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20      int nName;. 
10b40 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
10b50 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26  elect && pCons &
10b60 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  & pEnd );.      
10b70 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20  if( pCons->z==0 
10b80 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73  ){.        pCons
10b90 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d   = pEnd;.      }
10ba0 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28  .      nName = (
10bb0 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72  int)((const char
10bc0 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e   *)pCons->z - zN
10bd0 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  ame);.      p->a
10be0 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33  ddColOffset = 13
10bf0 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43 68   + sqlite3Utf8Ch
10c00 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61  arLen(zName, nNa
10c10 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  me);.    }.#endi
10c20 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  f.  }.}..#ifndef
10c30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
10c40 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  W./*.** The pars
10c50 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
10c60 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74  utine in order t
10c70 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56  o create a new V
10c80 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  IEW.*/.void sqli
10c90 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20  te3CreateView(. 
10ca0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
10cb0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
10cc0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
10cd0 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20  Token *pBegin,  
10ce0 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
10cf0 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
10d00 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ns the statement
10d10 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
10d20 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me1,     /* The 
10d30 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
10d40 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
10d50 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
10d60 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
10d70 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
10d80 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
10d90 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
10da0 45 78 70 72 4c 69 73 74 20 2a 70 43 4e 61 6d 65  ExprList *pCName
10db0 73 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 6c  s, /* Optional l
10dc0 69 73 74 20 6f 66 20 76 69 65 77 20 63 6f 6c 75  ist of view colu
10dd0 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 53 65  mn names */.  Se
10de0 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
10df0 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61   /* A SELECT sta
10e00 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c  tement that will
10e10 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
10e20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
10e30 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
10e40 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f  TRUE for a TEMPO
10e50 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69  RARY view */.  i
10e60 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20  nt noErr        
10e70 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72    /* Suppress er
10e80 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66 20  ror messages if 
10e90 56 49 45 57 20 61 6c 72 65 61 64 79 20 65 78 69  VIEW already exi
10ea0 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
10eb0 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  e *p;.  int n;. 
10ec0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
10ed0 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20    Token sEnd;.  
10ee0 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20  DbFixer sFix;.  
10ef0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30  Token *pName = 0
10f00 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73  ;.  int iDb;.  s
10f10 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
10f20 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
10f30 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29  pParse->nVar>0 )
10f40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
10f50 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70  orMsg(pParse, "p
10f60 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f  arameters are no
10f70 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65  t allowed in vie
10f80 77 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 63  ws");.    goto c
10f90 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b  reate_view_fail;
10fa0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
10fb0 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c  artTable(pParse,
10fc0 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
10fd0 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e   isTemp, 1, 0, n
10fe0 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61  oErr);.  p = pPa
10ff0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
11000 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50    if( p==0 || pP
11010 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
11020 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61  o create_view_fa
11030 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54 77 6f  il;.  sqlite3Two
11040 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
11050 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
11060 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20   &pName);.  iDb 
11070 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
11080 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53  oIndex(db, p->pS
11090 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65  chema);.  sqlite
110a0 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20  3FixInit(&sFix, 
110b0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69  pParse, iDb, "vi
110c0 65 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  ew", pName);.  i
110d0 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c  f( sqlite3FixSel
110e0 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65  ect(&sFix, pSele
110f0 63 74 29 20 29 20 67 6f 74 6f 20 63 72 65 61 74  ct) ) goto creat
11100 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20  e_view_fail;..  
11110 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  /* Make a copy o
11120 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c  f the entire SEL
11130 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
11140 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
11150 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77  iew..  ** This w
11160 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68  ill force all th
11170 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76  e Expr.token.z v
11180 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61  alues to be dyna
11190 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c  mically.  ** all
111a0 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68  ocated rather th
111b0 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  an point to the 
111c0 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77  input string - w
111d0 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a  hich means that.
111e0 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70    ** they will p
111f0 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65  ersist after the
11200 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33   current sqlite3
11210 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74  _exec() call ret
11220 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  urns..  */.  p->
11230 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
11240 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
11250 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f  Select, EXPRDUP_
11260 52 45 44 55 43 45 29 3b 0a 20 20 70 2d 3e 70 43  REDUCE);.  p->pC
11270 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  heck = sqlite3Ex
11280 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 43  prListDup(db, pC
11290 4e 61 6d 65 73 2c 20 45 58 50 52 44 55 50 5f 52  Names, EXPRDUP_R
112a0 45 44 55 43 45 29 3b 0a 20 20 69 66 28 20 64 62  EDUCE);.  if( db
112b0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
112c0 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65   goto create_vie
112d0 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f  w_fail;..  /* Lo
112e0 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  cate the end of 
112f0 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20  the CREATE VIEW 
11300 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65  statement.  Make
11310 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20   sEnd point to. 
11320 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a   ** the end..  *
11330 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73  /.  sEnd = pPars
11340 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20  e->sLastToken;. 
11350 20 61 73 73 65 72 74 28 20 73 45 6e 64 2e 7a 5b   assert( sEnd.z[
11360 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  0]!=0 );.  if( s
11370 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b  End.z[0]!=';' ){
11380 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73  .    sEnd.z += s
11390 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e  End.n;.  }.  sEn
113a0 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28  d.n = 0;.  n = (
113b0 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70 42  int)(sEnd.z - pB
113c0 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 61 73 73 65  egin->z);.  asse
113d0 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 7a 20 3d  rt( n>0 );.  z =
113e0 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68   pBegin->z;.  wh
113f0 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70  ile( sqlite3Issp
11400 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e  ace(z[n-1]) ){ n
11410 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d  --; }.  sEnd.z =
11420 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64   &z[n-1];.  sEnd
11430 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73  .n = 1;..  /* Us
11440 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
11450 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76  e() to add the v
11460 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54  iew to the SQLIT
11470 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a  E_MASTER table *
11480 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61  /.  sqlite3EndTa
11490 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26  ble(pParse, 0, &
114a0 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 0a 63 72  sEnd, 0, 0);..cr
114b0 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3a 0a  eate_view_fail:.
114c0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
114d0 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
114e0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
114f0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
11500 70 43 4e 61 6d 65 73 29 3b 0a 20 20 72 65 74 75  pCNames);.  retu
11510 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
11520 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
11530 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
11540 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
11550 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
11560 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
11570 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20  UALTABLE)./*.** 
11580 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
11590 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65  ure pTable is re
115a0 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69  ally a VIEW.  Fi
115b0 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20  ll in the names 
115c0 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  of.** the column
115d0 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e  s of the view in
115e0 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75   the pTable stru
115f0 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74  cture.  Return t
11600 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
11610 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65  errors.  If an e
11620 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61  rror is seen lea
11630 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
11640 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
11650 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
11660 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
11670 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a  umnNames(Parse *
11680 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
11690 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20  Table){.  Table 
116a0 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41  *pSelTab;   /* A
116b0 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d   fake table from
116c0 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74 68   which we get th
116d0 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
116e0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
116f0 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74      /* Copy of t
11700 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  he SELECT that i
11710 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
11720 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72  ew */.  int nErr
11730 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d   = 0;     /* Num
11740 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e  ber of errors en
11750 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69  countered */.  i
11760 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
11770 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20   /* Temporarily 
11780 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72  holds the number
11790 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73 69   of cursors assi
117a0 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  gned */.  sqlite
117b0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
117c0 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  db;  /* Database
117d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20   connection for 
117e0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f  malloc errors */
117f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11800 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
11810 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f 78 61 75  ON.  sqlite3_xau
11820 74 68 20 78 41 75 74 68 3b 20 20 20 20 20 20 20  th xAuth;       
11830 2f 2a 20 53 61 76 65 64 20 78 41 75 74 68 20 70  /* Saved xAuth p
11840 6f 69 6e 74 65 72 20 2a 2f 0a 23 65 6e 64 69 66  ointer */.#endif
11850 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ..  assert( pTab
11860 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  le );..#ifndef S
11870 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
11880 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 73 71  ALTABLE.  if( sq
11890 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e  lite3VtabCallCon
118a0 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61  nect(pParse, pTa
118b0 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ble) ){.    retu
118c0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
118d0 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72  .  }.  if( IsVir
118e0 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72  tual(pTable) ) r
118f0 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
11900 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11910 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41  OMIT_VIEW.  /* A
11920 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d   positive nCol m
11930 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73  eans the columns
11940 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20   names for this 
11950 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c  view are.  ** al
11960 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a  ready known..  *
11970 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
11980 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20  nCol>0 ) return 
11990 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74  0;..  /* A negat
119a0 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70  ive nCol is a sp
119b0 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61  ecial marker mea
119c0 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65  ning that we are
119d0 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20   currently.  ** 
119e0 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74  trying to comput
119f0 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
11a00 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72  es.  If we enter
11a10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
11a20 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69  th.  ** a negati
11a30 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e  ve nCol, it mean
11a40 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69  s two or more vi
11a50 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c  ews form a loop,
11a60 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a   like this:.  **
11a70 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
11a80 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c   VIEW one AS SEL
11a90 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a  ECT * FROM two;.
11aa0 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
11ab0 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45  VIEW two AS SELE
11ac0 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20  CT * FROM one;. 
11ad0 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
11ae0 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61 62 6f  y, the error abo
11af0 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74  ve is now caught
11b00 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69   prior to reachi
11b10 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20  ng this point.. 
11b20 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f 6c 6c   ** But the foll
11b30 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20 73 74  owing test is st
11b40 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61 73  ill important as
11b50 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20 75 70   it does come up
11b60 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c  .  ** in the fol
11b70 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20  lowing:.  ** .  
11b80 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
11b90 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b  BLE main.ex1(a);
11ba0 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
11bb0 20 54 45 4d 50 20 56 49 45 57 20 65 78 31 20 41   TEMP VIEW ex1 A
11bc0 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20  S SELECT a FROM 
11bd0 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45  ex1;.  **     SE
11be0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70  LECT * FROM temp
11bf0 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28  .ex1;.  */.  if(
11c00 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20   pTable->nCol<0 
11c10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
11c20 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11c30 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63 75  view %s is circu
11c40 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20  larly defined", 
11c50 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
11c60 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
11c70 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  }.  assert( pTab
11c80 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a  le->nCol>=0 );..
11c90 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
11ca0 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
11cb0 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d  s we need to com
11cc0 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e  pute the table n
11cd0 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20  ames..  ** Note 
11ce0 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f  that the call to
11cf0 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
11d00 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c  tOfSelect() will
11d10 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a   expand any.  **
11d20 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e   "*" elements in
11d30 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65 74   the results set
11d40 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e 64   of the view and
11d50 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72   will assign cur
11d60 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  sors.  ** to the
11d70 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
11d80 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42   FROM clause.  B
11d90 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e  ut we do not wan
11da0 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a  t these changes.
11db0 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61    ** to be perma
11dc0 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f  nent.  So the co
11dd0 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e  mputation is don
11de0 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74  e on a copy of t
11df0 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73  he SELECT.  ** s
11e00 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
11e10 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
11e20 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
11e30 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29  Table->pSelect )
11e40 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74  ;.  pSel = sqlit
11e50 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
11e60 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c  pTable->pSelect,
11e70 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20   0);.  if( pSel 
11e80 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73  ){.    n = pPars
11e90 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c  e->nTab;.    sql
11ea0 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
11eb0 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
11ec0 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20   pSel->pSrc);.  
11ed0 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
11ee0 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f   -1;.    db->loo
11ef0 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2b  kaside.bDisable+
11f00 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
11f10 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
11f20 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d  TION.    xAuth =
11f30 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20   db->xAuth;.    
11f40 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20  db->xAuth = 0;. 
11f50 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
11f60 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
11f70 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
11f80 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75  el);.    db->xAu
11f90 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73  th = xAuth;.#els
11fa0 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20  e.    pSelTab = 
11fb0 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
11fc0 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
11fd0 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20   pSel);.#endif. 
11fe0 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
11ff0 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 54 61  = n;.    if( pTa
12000 62 6c 65 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20  ble->pCheck ){. 
12010 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20 56       /* CREATE V
12020 49 45 57 20 6e 61 6d 65 28 61 72 67 6c 69 73 74  IEW name(arglist
12030 29 20 41 53 20 2e 2e 2e 0a 20 20 20 20 20 20 2a  ) AS ....      *
12040 2a 20 54 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  * The names of t
12050 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  he columns in th
12060 65 20 74 61 62 6c 65 20 61 72 65 20 74 61 6b 65  e table are take
12070 6e 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20  n from.      ** 
12080 61 72 67 6c 69 73 74 20 77 68 69 63 68 20 69 73  arglist which is
12090 20 73 74 6f 72 65 64 20 69 6e 20 70 54 61 62 6c   stored in pTabl
120a0 65 2d 3e 70 43 68 65 63 6b 2e 20 20 54 68 65 20  e->pCheck.  The 
120b0 70 43 68 65 63 6b 20 66 69 65 6c 64 0a 20 20 20  pCheck field.   
120c0 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 68     ** normally h
120d0 6f 6c 64 73 20 43 48 45 43 4b 20 63 6f 6e 73 74  olds CHECK const
120e0 72 61 69 6e 74 73 20 6f 6e 20 61 6e 20 6f 72 64  raints on an ord
120f0 69 6e 61 72 79 20 74 61 62 6c 65 2c 20 62 75 74  inary table, but
12100 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 20   for.      ** a 
12110 56 49 45 57 20 69 74 20 68 6f 6c 64 73 20 74 68  VIEW it holds th
12120 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
12130 20 6e 61 6d 65 73 2e 0a 20 20 20 20 20 20 2a 2f   names..      */
12140 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
12150 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
12160 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  t(pParse, pTable
12170 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20 20  ->pCheck, .     
12180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12190 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54 61              &pTa
121a0 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  ble->nCol, &pTab
121b0 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20  le->aCol);.     
121c0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
121d0 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 20  ailed==0 .      
121e0 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
121f0 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 54  ==0.       && pT
12200 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c  able->nCol==pSel
12210 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a  ->pEList->nExpr.
12220 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
12230 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
12240 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
12250 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
12260 70 54 61 62 6c 65 2c 20 70 53 65 6c 29 3b 0a 20  pTable, pSel);. 
12270 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
12280 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
12290 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20        /* CREATE 
122a0 56 49 45 57 20 6e 61 6d 65 20 41 53 2e 2e 2e 20  VIEW name AS... 
122b0 20 77 69 74 68 6f 75 74 20 61 6e 20 61 72 67 75   without an argu
122c0 6d 65 6e 74 20 6c 69 73 74 2e 20 20 43 6f 6e 73  ment list.  Cons
122d0 74 72 75 63 74 0a 20 20 20 20 20 20 2a 2a 20 74  truct.      ** t
122e0 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
122f0 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
12300 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
12310 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
12320 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
12330 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
12340 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
12350 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
12360 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
12370 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
12380 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
12390 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
123a0 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
123b0 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
123c0 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
123d0 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
123e0 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
123f0 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
12400 29 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ) );.    }else{.
12410 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43        pTable->nC
12420 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45  ol = 0;.      nE
12430 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rr++;.    }.    
12440 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
12450 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b  le(db, pSelTab);
12460 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
12470 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
12480 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  l);.    db->look
12490 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2d 2d  aside.bDisable--
124a0 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
124b0 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 70   nErr++;.  }.  p
124c0 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e  Table->pSchema->
124d0 73 63 68 65 6d 61 46 6c 61 67 73 20 7c 3d 20 44  schemaFlags |= D
124e0 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a  B_UnresetViews;.
124f0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
12500 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20  _OMIT_VIEW */.  
12510 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
12520 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
12530 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
12540 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
12550 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
12560 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
12570 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12580 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43  MIT_VIEW./*.** C
12590 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
125a0 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79  names from every
125b0 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73   VIEW in databas
125c0 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  e idx..*/.static
125d0 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77   void sqliteView
125e0 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33  ResetAll(sqlite3
125f0 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a   *db, int idx){.
12600 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
12610 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12620 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
12630 64 62 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a 20  db, idx, 0) );. 
12640 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65   if( !DbHasPrope
12650 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
12660 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20  UnresetViews) ) 
12670 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
12680 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
12690 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53  &db->aDb[idx].pS
126a0 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
126b0 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e   i;i=sqliteHashN
126c0 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62  ext(i)){.    Tab
126d0 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
126e0 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
126f0 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
12700 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
12710 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  ite3DeleteColumn
12720 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29 3b  Names(db, pTab);
12730 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  .      pTab->aCo
12740 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 61  l = 0;.      pTa
12750 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
12760 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72   }.  }.  DbClear
12770 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
12780 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
12790 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  s);.}.#else.# de
127a0 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52  fine sqliteViewR
127b0 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e  esetAll(A,B).#en
127c0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
127d0 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_VIEW */../*.*
127e0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
127f0 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
12800 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20   VDBE to adjust 
12810 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
12820 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53  ema.** used by S
12830 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62  QLite when the b
12840 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73  tree layer moves
12850 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61   a table root pa
12860 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d  ge. The.** root-
12870 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
12880 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61  or index in data
12890 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61  base iDb has cha
128a0 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a  nged from iFrom.
128b0 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a  ** to iTo..**.**
128c0 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20   Ticket #1728:  
128d0 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65  The symbol table
128e0 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e   might still con
128f0 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tain information
12900 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e  .** on tables an
12910 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61  d/or indices tha
12920 74 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 73  t are the proces
12930 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74  s of being delet
12940 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72  ed..** If you ar
12950 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f  e unlucky, one o
12960 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20  f those deleted 
12970 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65  indices or table
12980 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20  s might.** have 
12990 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67  the same rootpag
129a0 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  e number as the 
129b0 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e  real table or in
129c0 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62  dex that is.** b
129d0 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20  eing moved.  So 
129e0 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73  we cannot stop s
129f0 65 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 74  earching after t
12a00 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a  he first match .
12a10 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ** because the f
12a20 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74  irst match might
12a30 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74   be for one of t
12a40 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  he deleted indic
12a50 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20  es.** or tables 
12a60 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c  and not the tabl
12a70 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  e/index that is 
12a80 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d  actually being m
12a90 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74  oved..** We must
12aa0 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e   continue loopin
12ab0 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c  g until all tabl
12ac0 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77  es and indices w
12ad0 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d  ith.** rootpage=
12ae0 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e  =iFrom have been
12af0 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61   converted to ha
12b00 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66  ve a rootpage of
12b10 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72   iTo.** in order
12b20 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74   to be certain t
12b30 68 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 72  hat we got the r
12b40 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66  ight one..*/.#if
12b50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12b60 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64  _AUTOVACUUM.void
12b70 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65   sqlite3RootPage
12b80 4d 6f 76 65 64 28 73 71 6c 69 74 65 33 20 2a 64  Moved(sqlite3 *d
12b90 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  b, int iDb, int 
12ba0 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
12bb0 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  .  HashElem *pEl
12bc0 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73  em;.  Hash *pHas
12bd0 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  h;.  Db *pDb;.. 
12be0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12bf0 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
12c00 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
12c10 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
12c20 69 44 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d 20  iDb];.  pHash = 
12c30 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
12c40 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45  blHash;.  for(pE
12c50 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
12c60 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
12c70 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
12c80 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
12c90 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
12ca0 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
12cb0 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
12cc0 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pTab->tnum==iF
12cd0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61  rom ){.      pTa
12ce0 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  b->tnum = iTo;. 
12cf0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68     }.  }.  pHash
12d00 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
12d10 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72  ->idxHash;.  for
12d20 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
12d30 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
12d40 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
12d50 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
12d60 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  )){.    Index *p
12d70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Idx = sqliteHash
12d80 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
12d90 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d   if( pIdx->tnum=
12da0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
12db0 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pIdx->tnum = iTo
12dc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
12dd0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
12de0 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  e code to erase 
12df0 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
12e00 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
12e10 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44  from database iD
12e20 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65  b..** Also write
12e30 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20   code to modify 
12e40 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
12e50 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65  r table and inte
12e60 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69  rnal schema.** i
12e70 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  f a root-page of
12e80 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
12e90 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
12ea0 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73  tree-layer whils
12eb0 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61  t.** erasing iTa
12ec0 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61  ble (this can ha
12ed0 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74  ppen with an aut
12ee0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
12ef0 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  e)..*/ .static v
12f00 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  oid destroyRootP
12f10 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  age(Parse *pPars
12f20 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  e, int iTable, i
12f30 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
12f40 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
12f50 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
12f60 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
12f70 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
12f80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 54 61  );.  assert( iTa
12f90 62 6c 65 3e 31 20 29 3b 0a 20 20 73 71 6c 69 74  ble>1 );.  sqlit
12fa0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
12fb0 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62  OP_Destroy, iTab
12fc0 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20 20  le, r1, iDb);.  
12fd0 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
12fe0 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66  pParse);.#ifndef
12ff0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13000 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f  OVACUUM.  /* OP_
13010 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61  Destroy stores a
13020 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e  n in integer r1.
13030 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72   If this integer
13040 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  .  ** is non-zer
13050 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  o, then it is th
13060 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
13070 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f  er of a table mo
13080 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61  ved to.  ** loca
13090 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65  tion iTable. The
130a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
130b0 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c  modifies the sql
130c0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
130d0 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74   to.  ** reflect
130e0 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   this..  **.  **
130f0 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74   The "#NNN" in t
13100 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63  he SQL is a spec
13110 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ial constant tha
13120 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72  t means whatever
13130 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69   value.  ** is i
13140 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20  n register NNN. 
13150 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75 6c   See grammar rul
13160 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
13170 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53 54  th the TK_REGIST
13180 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f  ER.  ** token fo
13190 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
131a0 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  ormation..  */. 
131b0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
131c0 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
131d0 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
131e0 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20  SET rootpage=%d 
131f0 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f  WHERE #%d AND ro
13200 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20  otpage=#%d",.   
13210 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44    pParse->db->aD
13220 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c  b[iDb].zDbSName,
13230 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 69 54   MASTER_NAME, iT
13240 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23  able, r1, r1);.#
13250 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52  endif.  sqlite3R
13260 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
13270 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a  arse, r1);.}../*
13280 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63  .** Write VDBE c
13290 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62  ode to erase tab
132a0 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20  le pTab and all 
132b0 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63  associated indic
132c0 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43  es on disk..** C
132d0 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  ode to update th
132e0 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
132f0 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72  tables and inter
13300 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e  nal schema defin
13310 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73  itions.** in cas
13320 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65  e a root-page be
13330 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68  longing to anoth
13340 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
13350 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c  d by the btree l
13360 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20  ayer.** is also 
13370 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20  added (this can 
13380 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
13390 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
133a0 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
133b0 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c  void destroyTabl
133c0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
133d0 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23   Table *pTab){.#
133e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
133f0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49  T_AUTOVACUUM.  I
13400 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
13410 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
13420 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
13430 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
13440 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74 72  Schema);.  destr
13450 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
13460 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69  e, pTab->tnum, i
13470 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  Db);.  for(pIdx=
13480 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
13490 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
134a0 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72  Next){.    destr
134b0 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
134c0 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  e, pIdx->tnum, i
134d0 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  Db);.  }.#else. 
134e0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
134f0 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d  ase may be auto-
13500 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28  vacuum capable (
13510 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  if SQLITE_OMIT_A
13520 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69  UTOVACUUM.  ** i
13530 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20  s not defined), 
13540 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72  then it is impor
13550 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f  tant to call OP_
13560 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20  Destroy on the. 
13570 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e   ** table and in
13580 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69  dex root-pages i
13590 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e  n order, startin
135a0 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72  g with the numer
135b0 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72  ically .  ** lar
135c0 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
135d0 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72  umber. This guar
135e0 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65  antees that none
135f0 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   of the root-pag
13600 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65  es.  ** to be de
13610 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63  stroyed is reloc
13620 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ated by an earli
13630 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69  er OP_Destroy. i
13640 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  .e. if the.  ** 
13650 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63  following were c
13660 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oded:.  **.  ** 
13670 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20  OP_Destroy 4 0. 
13680 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f   ** ....  ** OP_
13690 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a  Destroy 5 0.  **
136a0 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70  .  ** and root p
136b0 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74  age 5 happened t
136c0 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74  o be the largest
136d0 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
136e0 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  r in the.  ** da
136f0 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f  tabase, then roo
13700 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62  t page 5 would b
13710 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20  e moved to page 
13720 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22  4 by the .  ** "
13730 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20  OP_Destroy 4 0" 
13740 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73  opcode. The subs
13750 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72  equent "OP_Destr
13760 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69  oy 5 0" would hi
13770 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69  t.  ** a free-li
13780 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  st page..  */.  
13790 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d  int iTab = pTab-
137a0 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65  >tnum;.  int iDe
137b0 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20  stroyed = 0;..  
137c0 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
137d0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
137e0 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20   int iLargest = 
137f0 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73  0;..    if( iDes
13800 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61  troyed==0 || iTa
13810 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a  b<iDestroyed ){.
13820 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
13830 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20   iTab;.    }.   
13840 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
13850 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
13860 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
13870 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20  .      int iIdx 
13880 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20  = pIdx->tnum;.  
13890 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
138a0 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
138b0 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
138c0 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65    if( (iDestroye
138d0 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44  d==0 || (iIdx<iD
138e0 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49  estroyed)) && iI
138f0 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20  dx>iLargest ){. 
13900 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20         iLargest 
13910 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a  = iIdx;.      }.
13920 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c      }.    if( iL
13930 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20  argest==0 ){.   
13940 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
13950 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
13960 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
13970 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
13980 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
13990 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 61 73 73  hema);.      ass
139a0 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
139b0 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e  Db<pParse->db->n
139c0 44 62 20 29 3b 0a 20 20 20 20 20 20 64 65 73 74  Db );.      dest
139d0 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
139e0 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44  se, iLargest, iD
139f0 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72  b);.      iDestr
13a00 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b  oyed = iLargest;
13a10 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
13a20 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  f.}../*.** Remov
13a30 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74  e entries from t
13a40 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20  he sqlite_statN 
13a50 74 61 62 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e  tables (for N in
13a60 20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74   (1,2,3)).** aft
13a70 65 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58 20  er a DROP INDEX 
13a80 6f 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f  or DROP TABLE co
13a90 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  mmand..*/.static
13aa0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65   void sqlite3Cle
13ab0 61 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20 20  arStatTables(.  
13ac0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
13ad0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
13ae0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
13af0 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20  .  int iDb,     
13b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13b10 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   database number
13b20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
13b30 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20   *zType,     /* 
13b40 22 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20 2a  "idx" or "tbl" *
13b50 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
13b60 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61  zName      /* Na
13b70 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20 74  me of index or t
13b80 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  able */.){.  int
13b90 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
13ba0 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61 72   *zDbName = pPar
13bb0 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
13bc0 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 66 6f 72  .zDbSName;.  for
13bd0 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29  (i=1; i<=4; i++)
13be0 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 61 62 5b  {.    char zTab[
13bf0 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  24];.    sqlite3
13c00 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
13c10 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c  (zTab),zTab,"sql
13c20 69 74 65 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a  ite_stat%d",i);.
13c30 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
13c40 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d  indTable(pParse-
13c50 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61  >db, zTab, zDbNa
13c60 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  me) ){.      sql
13c70 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
13c80 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
13c90 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
13ca0 25 73 20 57 48 45 52 45 20 25 73 3d 25 51 22 2c  %s WHERE %s=%Q",
13cb0 0a 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65  .        zDbName
13cc0 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a  , zTab, zType, z
13cd0 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  Name.      );.  
13ce0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
13cf0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
13d00 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a  o drop a table..
13d10 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
13d20 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72  odeDropTable(Par
13d30 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
13d40 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 44 62  e *pTab, int iDb
13d50 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20  , int isView){. 
13d60 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
13d70 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
13d80 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72 20  ->db;.  Trigger 
13d90 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 44 62 20  *pTrigger;.  Db 
13da0 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
13db0 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  iDb];..  v = sql
13dc0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
13dd0 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  se);.  assert( v
13de0 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
13df0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
13e00 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
13e10 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
13e20 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
13e30 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56  LTABLE.  if( IsV
13e40 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
13e50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13e60 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67  ddOp0(v, OP_VBeg
13e70 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  in);.  }.#endif.
13e80 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74  .  /* Drop all t
13e90 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74  riggers associat
13ea0 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
13eb0 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
13ec0 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67 65   Code.  ** is ge
13ed0 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76  nerated to remov
13ee0 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73  e entries from s
13ef0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64  qlite_master and
13f00 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  /or.  ** sqlite_
13f10 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72  temp_master if r
13f20 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  equired..  */.  
13f30 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74  pTrigger = sqlit
13f40 65 33 54 72 69 67 67 65 72 4c 69 73 74 28 70 50  e3TriggerList(pP
13f50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 77  arse, pTab);.  w
13f60 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29  hile( pTrigger )
13f70 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
13f80 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d  rigger->pSchema=
13f90 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c  =pTab->pSchema |
13fa0 7c 20 0a 20 20 20 20 20 20 20 20 70 54 72 69 67  | .        pTrig
13fb0 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62  ger->pSchema==db
13fc0 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
13fd0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
13fe0 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50  ropTriggerPtr(pP
13ff0 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b  arse, pTrigger);
14000 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20  .    pTrigger = 
14010 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b  pTrigger->pNext;
14020 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
14030 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
14040 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d  CREMENT.  /* Rem
14050 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20  ove any entries 
14060 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  of the sqlite_se
14070 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73  quence table ass
14080 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 2a  ociated with.  *
14090 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * the table bein
140a0 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20  g dropped. This 
140b0 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74  is done before t
140c0 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70  he table is drop
140d0 70 65 64 0a 20 20 2a 2a 20 61 74 20 74 68 65 20  ped.  ** at the 
140e0 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20  btree level, in 
140f0 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  case the sqlite_
14100 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e  sequence table n
14110 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76  eeds to.  ** mov
14120 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  e as a result of
14130 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68   the drop (can h
14140 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61  appen in auto-va
14150 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f  cuum mode)..  */
14160 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62  .  if( pTab->tab
14170 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
14180 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  ncrement ){.    
14190 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
141a0 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
141b0 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
141c0 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  .sqlite_sequence
141d0 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
141e0 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53  .      pDb->zDbS
141f0 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
14200 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e  e.    );.  }.#en
14210 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61  dif..  /* Drop a
14220 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ll SQLITE_MASTER
14230 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
14240 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65   entries that re
14250 66 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  fer to the.  ** 
14260 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72  table. The progr
14270 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68  am name loops th
14280 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72  rough the master
14290 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74   table and delet
142a0 65 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f  es.  ** every ro
142b0 77 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  w that refers to
142c0 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20   a table of the 
142d0 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
142e0 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20   one being.  ** 
142f0 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72  dropped. Trigger
14300 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  s are handled se
14310 70 61 72 61 74 65 6c 79 20 62 65 63 61 75 73 65  parately because
14320 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62   a trigger can b
14330 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69  e.  ** created i
14340 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  n the temp datab
14350 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20  ase that refers 
14360 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e  to a table in an
14370 6f 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62  other.  ** datab
14380 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ase..  */.  sqli
14390 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
143a0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44  Parse, .      "D
143b0 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
143c0 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d   WHERE tbl_name=
143d0 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72  %Q and type!='tr
143e0 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70  igger'",.      p
143f0 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41  Db->zDbSName, MA
14400 53 54 45 52 5f 4e 41 4d 45 2c 20 70 54 61 62 2d  STER_NAME, pTab-
14410 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21  >zName);.  if( !
14420 69 73 56 69 65 77 20 26 26 20 21 49 73 56 69 72  isView && !IsVir
14430 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
14440 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70    destroyTable(p
14450 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
14460 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  }..  /* Remove t
14470 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66  he table entry f
14480 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74  rom SQLite's int
14490 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64  ernal schema and
144a0 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65   modify.  ** the
144b0 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a   schema cookie..
144c0 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72    */.  if( IsVir
144d0 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
144e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
144f0 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72  Op4(v, OP_VDestr
14500 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70  oy, iDb, 0, 0, p
14510 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
14520 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
14530 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72  eAddOp4(v, OP_Dr
14540 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c  opTable, iDb, 0,
14550 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   0, pTab->zName,
14560 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 68   0);.  sqlite3Ch
14570 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
14580 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  e, iDb);.  sqlit
14590 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62  eViewResetAll(db
145a0 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , iDb);.}../*.**
145b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
145c0 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68   called to do th
145d0 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50  e work of a DROP
145e0 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
145f0 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68  ..** pName is th
14600 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
14610 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65  ble to be droppe
14620 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
14630 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  e3DropTable(Pars
14640 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
14650 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
14660 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72  sView, int noErr
14670 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
14680 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
14690 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
146a0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
146b0 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d  Db;..  if( db->m
146c0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
146d0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
146e0 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61  p_table;.  }.  a
146f0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
14700 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  Err==0 );.  asse
14710 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
14720 3d 31 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  =1 );.  if( sqli
14730 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
14740 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69  arse) ) goto exi
14750 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
14760 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e  if( noErr ) db->
14770 73 75 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a 20  suppressErr++;. 
14780 20 61 73 73 65 72 74 28 20 69 73 56 69 65 77 3d   assert( isView=
14790 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d 4c 4f  =0 || isView==LO
147a0 43 41 54 45 5f 56 49 45 57 20 29 3b 0a 20 20 70  CATE_VIEW );.  p
147b0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
147c0 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61  ateTableItem(pPa
147d0 72 73 65 2c 20 69 73 56 69 65 77 2c 20 26 70 4e  rse, isView, &pN
147e0 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69 66  ame->a[0]);.  if
147f0 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75  ( noErr ) db->su
14800 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20  ppressErr--;..  
14810 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
14820 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 73     if( noErr ) s
14830 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
14840 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72  NamedSchema(pPar
14850 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  se, pName->a[0].
14860 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
14870 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
14880 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20  able;.  }.  iDb 
14890 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
148a0 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
148b0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73  >pSchema);.  ass
148c0 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
148d0 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20  Db<db->nDb );.. 
148e0 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20 61   /* If pTab is a
148f0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
14900 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75  call ViewGetColu
14910 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73  mnNames() to ens
14920 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69  ure.  ** it is i
14930 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
14940 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
14950 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74 65  (pTab) && sqlite
14960 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
14970 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
14980 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
14990 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
149a0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
149b0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
149c0 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
149d0 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74   code;.    const
149e0 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
149f0 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b  HEMA_TABLE(iDb);
14a00 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
14a10 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
14a20 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
14a30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
14a40 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rg2 = 0;.    if(
14a50 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
14a60 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
14a70 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
14a80 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67  , zDb)){.      g
14a90 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
14aa0 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ble;.    }.    i
14ab0 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
14ac0 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
14ad0 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
14ae0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
14af0 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
14b00 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
14b10 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
14b20 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
14b30 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  IEW;.      }.#if
14b40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14b50 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
14b60 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69    }else if( IsVi
14b70 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
14b80 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
14b90 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a  TE_DROP_VTABLE;.
14ba0 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20 73 71        zArg2 = sq
14bb0 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
14bc0 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e  b, pTab)->pMod->
14bd0 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20  zName;.#endif.  
14be0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
14bf0 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
14c00 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
14c10 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
14c20 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
14c30 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LE;.      }else{
14c40 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
14c50 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c  SQLITE_DROP_TABL
14c60 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
14c70 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14c80 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
14c90 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e  , code, pTab->zN
14ca0 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29  ame, zArg2, zDb)
14cb0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
14cc0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
14cd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
14ce0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
14cf0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
14d00 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  LETE, pTab->zNam
14d10 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
14d20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
14d30 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
14d40 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
14d50 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
14d60 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73  (pTab->zName, "s
14d70 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a  qlite_", 7)==0 .
14d80 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
14d90 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
14da0 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  me, "sqlite_stat
14db0 22 2c 20 31 31 29 21 3d 30 20 29 7b 0a 20 20 20  ", 11)!=0 ){.   
14dc0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
14dd0 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
14de0 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72  %s may not be dr
14df0 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  opped", pTab->zN
14e00 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
14e10 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
14e20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
14e30 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
14e40 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54  /* Ensure DROP T
14e50 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64  ABLE is not used
14e60 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20   on a view, and 
14e70 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74  DROP VIEW is not
14e80 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20   used.  ** on a 
14e90 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
14ea0 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62  ( isView && pTab
14eb0 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
14ec0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14ed0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65  Msg(pParse, "use
14ee0 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64   DROP TABLE to d
14ef0 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c  elete table %s",
14f00 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
14f10 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14f20 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  p_table;.  }.  i
14f30 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54  f( !isView && pT
14f40 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
14f50 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14f60 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
14f70 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c  DROP VIEW to del
14f80 65 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54  ete view %s", pT
14f90 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
14fa0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
14fb0 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  able;.  }.#endif
14fc0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
14fd0 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
14fe0 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
14ff0 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20  e master table. 
15000 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a   ** on disk..  *
15010 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
15020 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
15030 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
15040 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
15050 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
15060 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
15070 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54  qlite3ClearStatT
15080 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44  ables(pParse, iD
15090 62 2c 20 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e  b, "tbl", pTab->
150a0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
150b0 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 70  te3FkDropTable(p
150c0 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54  Parse, pName, pT
150d0 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ab);.    sqlite3
150e0 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 70 50  CodeDropTable(pP
150f0 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44 62 2c  arse, pTab, iDb,
15100 20 69 73 56 69 65 77 29 3b 0a 20 20 7d 0a 0a 65   isView);.  }..e
15110 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a  xit_drop_table:.
15120 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
15130 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65  Delete(db, pName
15140 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
15150 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
15160 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
15170 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  ew foreign key o
15180 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63  n the table.** c
15190 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
151a0 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46  onstruction.  pF
151b0 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65  romCol determine
151c0 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a  s which columns.
151d0 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
151e0 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f  t table point to
151f0 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
15200 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d  .  If pFromCol==
15210 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63  0 then.** connec
15220 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65  t the key to the
15230 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73   last column ins
15240 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74  erted.  pTo is t
15250 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68  he name of.** th
15260 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64  e table referred
15270 20 74 6f 20 28 61 2e 6b 2e 61 20 74 68 65 20 22   to (a.k.a the "
15280 70 61 72 65 6e 74 22 20 74 61 62 6c 65 29 2e 20  parent" table). 
15290 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73   pToCol is a lis
152a0 74 0a 2a 2a 20 6f 66 20 74 61 62 6c 65 73 20 69  t.** of tables i
152b0 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 54 6f  n the parent pTo
152c0 20 74 61 62 6c 65 2e 20 20 66 6c 61 67 73 20 63   table.  flags c
152d0 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69  ontains all.** i
152e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
152f0 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65   the conflict re
15300 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
15310 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  hms specified.**
15320 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54   in the ON DELET
15330 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64  E, ON UPDATE and
15340 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73   ON INSERT claus
15350 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65  es..**.** An FKe
15360 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  y structure is c
15370 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64  reated and added
15380 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
15390 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72  rrently.** under
153a0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e   construction in
153b0 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   the pParse->pNe
153c0 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a  wTable field..**
153d0 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20  .** The foreign 
153e0 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49  key is set for I
153f0 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73  MMEDIATE process
15400 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65  ing.  A subseque
15410 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71  nt call.** to sq
15420 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
15430 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61  nKey() might cha
15440 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45  nge this to DEFE
15450 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  RRED..*/.void sq
15460 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69  lite3CreateForei
15470 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  gnKey(.  Parse *
15480 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
15490 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
154a0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
154b0 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f  pFromCol,  /* Co
154c0 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61  lumns in this ta
154d0 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ble that point t
154e0 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  o other table */
154f0 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20  .  Token *pTo,  
15500 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
15510 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  of the other tab
15520 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
15530 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20   *pToCol,    /* 
15540 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  Columns in the o
15550 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
15560 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
15570 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74       /* Conflict
15580 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
15590 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20  rithms. */.){.  
155a0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
155b0 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65  arse->db;.#ifnde
155c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
155d0 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79  REIGN_KEY.  FKey
155e0 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46   *pFKey = 0;.  F
155f0 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20  Key *pNextTo;.  
15600 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73  Table *p = pPars
15610 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
15620 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  int nByte;.  int
15630 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a   i;.  int nCol;.
15640 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73    char *z;..  as
15650 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a  sert( pTo!=0 );.
15660 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e    if( p==0 || IN
15670 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20  _DECLARE_VTAB ) 
15680 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69  goto fk_end;.  i
15690 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
156a0 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  {.    int iCol =
156b0 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20   p->nCol-1;.    
156c0 69 66 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30  if( NEVER(iCol<0
156d0 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  ) ) goto fk_end;
156e0 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  .    if( pToCol 
156f0 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
15700 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=1 ){.      sql
15710 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15720 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65  rse, "foreign ke
15730 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20  y on %s".       
15740 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72    " should refer
15750 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f  ence only one co
15760 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54  lumn of table %T
15770 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61  ",.         p->a
15780 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c  Col[iCol].zName,
15790 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74   pTo);.      got
157a0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  o fk_end;.    }.
157b0 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20      nCol = 1;.  
157c0 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c  }else if( pToCol
157d0 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
157e0 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78  r!=pFromCol->nEx
157f0 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
15800 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15810 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65  ,.        "numbe
15820 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
15830 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73  foreign key does
15840 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e   not match the n
15850 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20  umber of ".     
15860 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74     "columns in t
15870 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
15880 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ble");.    goto 
15890 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b  fk_end;.  }else{
158a0 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f  .    nCol = pFro
158b0 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  mCol->nExpr;.  }
158c0 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
158d0 66 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f  f(*pFKey) + (nCo
158e0 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65  l-1)*sizeof(pFKe
158f0 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54  y->aCol[0]) + pT
15900 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20  o->n + 1;.  if( 
15910 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
15920 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d  r(i=0; i<pToCol-
15930 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
15940 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c      nByte += sql
15950 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f  ite3Strlen30(pTo
15960 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
15970 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
15980 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65    pFKey = sqlite
15990 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
159a0 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  , nByte );.  if(
159b0 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20   pFKey==0 ){.   
159c0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
159d0 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d  }.  pFKey->pFrom
159e0 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70   = p;.  pFKey->p
159f0 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46  NextFrom = p->pF
15a00 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72  Key;.  z = (char
15a10 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e  *)&pFKey->aCol[n
15a20 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a  Col];.  pFKey->z
15a30 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79  To = z;.  memcpy
15a40 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d  (z, pTo->z, pTo-
15a50 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d  >n);.  z[pTo->n]
15a60 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
15a70 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b  equote(z);.  z +
15a80 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46  = pTo->n+1;.  pF
15a90 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  Key->nCol = nCol
15aa0 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
15ab0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79  ==0 ){.    pFKey
15ac0 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20  ->aCol[0].iFrom 
15ad0 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d  = p->nCol-1;.  }
15ae0 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
15af0 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
15b00 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
15b10 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
15b20 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
15b30 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
15b40 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c  3StrICmp(p->aCol
15b50 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d  [j].zName, pFrom
15b60 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
15b70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
15b80 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
15b90 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20  iFrom = j;.     
15ba0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15bb0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15bc0 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43      if( j>=p->nC
15bd0 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ol ){.        sq
15be0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15bf0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
15c00 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e   "unknown column
15c10 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69   \"%s\" in forei
15c20 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
15c30 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  n", .          p
15c40 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
15c50 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
15c60 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20  to fk_end;.     
15c70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
15c80 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
15c90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
15ca0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
15cb0 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
15cc0 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
15cd0 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
15ce0 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
15cf0 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20  zCol = z;.      
15d00 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c  memcpy(z, pToCol
15d10 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29  ->a[i].zName, n)
15d20 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30  ;.      z[n] = 0
15d30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31  ;.      z += n+1
15d40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
15d50 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
15d60 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41  = 0;.  pFKey->aA
15d70 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28  ction[0] = (u8)(
15d80 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20 20  flags & 0xff);  
15d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20            /* ON 
15da0 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f  DELETE action */
15db0 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f  .  pFKey->aActio
15dc0 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61  n[1] = (u8)((fla
15dd0 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66  gs >> 8 ) & 0xff
15de0 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41  );    /* ON UPDA
15df0 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  TE action */..  
15e00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
15e10 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
15e20 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61  b, 0, p->pSchema
15e30 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d  ) );.  pNextTo =
15e40 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33   (FKey *)sqlite3
15e50 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70  HashInsert(&p->p
15e60 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68  Schema->fkeyHash
15e70 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  , .      pFKey->
15e80 7a 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b  zTo, (void *)pFK
15e90 65 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e  ey.  );.  if( pN
15ea0 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a  extTo==pFKey ){.
15eb0 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
15ec0 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 67 6f 74  ult(db);.    got
15ed0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  o fk_end;.  }.  
15ee0 69 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20  if( pNextTo ){. 
15ef0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 78 74     assert( pNext
15f00 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29  To->pPrevTo==0 )
15f10 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65  ;.    pFKey->pNe
15f20 78 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a  xtTo = pNextTo;.
15f30 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72      pNextTo->pPr
15f40 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20  evTo = pFKey;.  
15f50 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  }..  /* Link the
15f60 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20   foreign key to 
15f70 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65  the table as the
15f80 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f   last step..  */
15f90 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46  .  p->pFKey = pF
15fa0 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30  Key;.  pFKey = 0
15fb0 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c  ;..fk_end:.  sql
15fc0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
15fd0 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  FKey);.#endif /*
15fe0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
15ff0 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
16000 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  Y) */.  sqlite3E
16010 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
16020 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73  , pFromCol);.  s
16030 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
16040 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29  lete(db, pToCol)
16050 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
16060 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
16070 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41  d when an INITIA
16080 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72  LLY IMMEDIATE or
16090 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
160a0 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73  RED.** clause is
160b0 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66   seen as part of
160c0 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64   a foreign key d
160d0 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20  efinition.  The 
160e0 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61  isDeferred.** pa
160f0 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72  rameter is 1 for
16100 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
16110 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e  RED and 0 for IN
16120 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
16130 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69  E..** The behavi
16140 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  or of the most r
16150 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
16160 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61  foreign key is a
16170 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72  djusted.** accor
16180 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  dingly..*/.void 
16190 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
161a0 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50  ignKey(Parse *pP
161b0 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65  arse, int isDefe
161c0 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53  rred){.#ifndef S
161d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
161e0 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a  GN_KEY.  Table *
161f0 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46  pTab;.  FKey *pF
16200 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62  Key;.  if( (pTab
16210 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
16220 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b  able)==0 || (pFK
16230 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79  ey = pTab->pFKey
16240 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
16250 20 61 73 73 65 72 74 28 20 69 73 44 65 66 65 72   assert( isDefer
16260 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65  red==0 || isDefe
16270 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56  rred==1 ); /* EV
16280 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20  : R-30323-21917 
16290 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65  */.  pFKey->isDe
162a0 66 65 72 72 65 64 20 3d 20 28 75 38 29 69 73 44  ferred = (u8)isD
162b0 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a  eferred;.#endif.
162c0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
162d0 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
162e0 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c   erase and refil
162f0 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20  l index *pIdx.  
16300 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20  This is.** used 
16310 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  to initialize a 
16320 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e  newly created in
16330 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70  dex or to recomp
16340 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ute the.** conte
16350 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69  nt of an index i
16360 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20  n response to a 
16370 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e  REINDEX command.
16380 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f  .**.** if memRoo
16390 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67  tPage is not neg
163a0 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20  ative, it means 
163b0 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69  that the index i
163c0 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74  s newly.** creat
163d0 65 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65  ed.  The registe
163e0 72 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d  r specified by m
163f0 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61  emRootPage conta
16400 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20  ins the.** root 
16410 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
16420 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65  he index.  If me
16430 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67  mRootPage is neg
16440 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  ative, then.** t
16450 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  he index already
16460 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74   exists and must
16470 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f   be cleared befo
16480 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65  re being refille
16490 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f  d and.** the roo
164a0 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
164b0 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61   the index is ta
164c0 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d  ken from pIndex-
164d0 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  >tnum..*/.static
164e0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66   void sqlite3Ref
164f0 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a  illIndex(Parse *
16500 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
16510 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f  Index, int memRo
16520 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65  otPage){.  Table
16530 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
16540 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65  >pTable;  /* The
16550 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69   table that is i
16560 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
16570 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iTab = pParse->n
16580 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74  Tab++;     /* Bt
16590 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  ree cursor used 
165a0 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e  for pTab */.  in
165b0 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d  t iIdx = pParse-
165c0 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20  >nTab++;     /* 
165d0 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65  Btree cursor use
165e0 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a  d for pIndex */.
165f0 20 20 69 6e 74 20 69 53 6f 72 74 65 72 3b 20 20    int iSorter;  
16600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16610 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 65   /* Cursor opene
16620 64 20 62 79 20 4f 70 65 6e 53 6f 72 74 65 72 20  d by OpenSorter 
16630 28 69 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20  (if in use) */. 
16640 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
16650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16660 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f  /* Address of to
16670 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  p of loop */.  i
16680 6e 74 20 61 64 64 72 32 3b 20 20 20 20 20 20 20  nt addr2;       
16690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
166a0 20 41 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70   Address to jump
166b0 20 74 6f 20 66 6f 72 20 6e 65 78 74 20 69 74 65   to for next ite
166c0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
166d0 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  tnum;           
166e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
166f0 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78  ot page of index
16700 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 74 49   */.  int iPartI
16710 64 78 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20  dxLabel;        
16720 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20       /* Jump to 
16730 74 68 69 73 20 6c 61 62 65 6c 20 74 6f 20 73 6b  this label to sk
16740 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20 56 64  ip a row */.  Vd
16750 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
16760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16770 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
16780 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  to this virtual 
16790 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79  machine */.  Key
167a0 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20  Info *pKey;     
167b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
167c0 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78  eyInfo for index
167d0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
167e0 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ord;            
167f0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
16800 20 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c   holding assembl
16810 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  ed index record 
16820 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
16830 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
16840 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
16850 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
16860 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71  /.  int iDb = sq
16870 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
16880 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70  ex(db, pIndex->p
16890 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65  Schema);..#ifnde
168a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
168b0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66  THORIZATION.  if
168c0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
168d0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
168e0 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65  E_REINDEX, pInde
168f0 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20  x->zName, 0,.   
16900 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
16910 7a 44 62 53 4e 61 6d 65 20 29 20 29 7b 0a 20 20  zDbSName ) ){.  
16920 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
16930 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69  ndif..  /* Requi
16940 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  re a write-lock 
16950 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  on the table to 
16960 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70 65  perform this ope
16970 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  ration */.  sqli
16980 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
16990 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
169a0 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a  tnum, 1, pTab->z
169b0 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71  Name);..  v = sq
169c0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
169d0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
169e0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
169f0 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20   memRootPage>=0 
16a00 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65  ){.    tnum = me
16a10 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c  mRootPage;.  }el
16a20 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70  se{.    tnum = p
16a30 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d  Index->tnum;.  }
16a40 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  .  pKey = sqlite
16a50 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
16a60 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b  pParse, pIndex);
16a70 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 21  .  assert( pKey!
16a80 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
16a90 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
16aa0 2d 3e 6e 45 72 72 20 29 3b 0a 0a 20 20 2f 2a 20  ->nErr );..  /* 
16ab0 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20  Open the sorter 
16ac0 63 75 72 73 6f 72 20 69 66 20 77 65 20 61 72 65  cursor if we are
16ad0 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a   to use one. */.
16ae0 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72    iSorter = pPar
16af0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71  se->nTab++;.  sq
16b00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
16b10 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  v, OP_SorterOpen
16b20 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70 49  , iSorter, 0, pI
16b30 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28  ndex->nKeyCol, (
16b40 63 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20 20  char*).         
16b50 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
16b60 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
16b70 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  y), P4_KEYINFO);
16b80 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
16b90 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f  table. Loop thro
16ba0 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20  ugh all rows of 
16bb0 74 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65 72  the table, inser
16bc0 74 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20  ting index.  ** 
16bd0 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65  records into the
16be0 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71   sorter. */.  sq
16bf0 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
16c00 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62  Parse, iTab, iDb
16c10 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
16c20 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  ead);.  addr1 = 
16c30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16c40 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
16c50 69 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43 6f  iTab, 0); VdbeCo
16c60 76 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65 67  verage(v);.  reg
16c70 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
16c80 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
16c90 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65  e);..  sqlite3Ge
16ca0 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70  nerateIndexKey(p
16cb0 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69 54 61  Parse,pIndex,iTa
16cc0 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c 26 69  b,regRecord,0,&i
16cd0 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30  PartIdxLabel,0,0
16ce0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16cf0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
16d00 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f 72 74  terInsert, iSort
16d10 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  er, regRecord);.
16d20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
16d30 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61  PartIdxLabel(pPa
16d40 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c 61 62  rse, iPartIdxLab
16d50 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  el);.  sqlite3Vd
16d60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
16d70 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31  ext, iTab, addr1
16d80 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +1); VdbeCoverag
16d90 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
16da0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
16db0 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d  ddr1);.  if( mem
16dc0 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c  RootPage<0 ) sql
16dd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16de0 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d  , OP_Clear, tnum
16df0 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
16e00 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
16e10 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64  P_OpenWrite, iId
16e20 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20  x, tnum, iDb, . 
16e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e40 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c     (char *)pKey,
16e50 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
16e60 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
16e70 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55  eP5(v, OPFLAG_BU
16e80 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50  LKCSR|((memRootP
16e90 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50  age>=0)?OPFLAG_P
16ea0 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61  2ISREG:0));..  a
16eb0 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
16ec0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
16ed0 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f 72 74  orterSort, iSort
16ee0 65 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65  er, 0); VdbeCove
16ef0 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20 49  rage(v);.  if( I
16f00 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e  sUniqueIndex(pIn
16f10 64 65 78 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  dex) ){.    int 
16f20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j2 = sqlite3Vdbe
16f30 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
16f40 20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   3;.    sqlite3V
16f50 64 62 65 47 6f 74 6f 28 76 2c 20 6a 32 29 3b 0a  dbeGoto(v, j2);.
16f60 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
16f70 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
16f80 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
16f90 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
16fa0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70  v, OP_SorterComp
16fb0 61 72 65 2c 20 69 53 6f 72 74 65 72 2c 20 6a 32  are, iSorter, j2
16fc0 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20 20  , regRecord,.   
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fe0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 4b        pIndex->nK
16ff0 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65  eyCol); VdbeCove
17000 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
17010 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72  ite3UniqueConstr
17020 61 69 6e 74 28 70 50 61 72 73 65 2c 20 4f 45 5f  aint(pParse, OE_
17030 41 62 6f 72 74 2c 20 70 49 6e 64 65 78 29 3b 0a  Abort, pIndex);.
17040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
17050 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
17060 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
17070 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
17080 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
17090 72 74 65 72 44 61 74 61 2c 20 69 53 6f 72 74 65  rterData, iSorte
170a0 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 69 49  r, regRecord, iI
170b0 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dx);.  sqlite3Vd
170c0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4c  beAddOp3(v, OP_L
170d0 61 73 74 2c 20 69 49 64 78 2c 20 30 2c 20 2d 31  ast, iIdx, 0, -1
170e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
170f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
17100 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65  Insert, iIdx, re
17110 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
17120 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
17130 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
17140 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
17150 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
17160 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
17170 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
17180 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17190 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 53 6f 72  SorterNext, iSor
171a0 74 65 72 2c 20 61 64 64 72 32 29 3b 20 56 64 62  ter, addr2); Vdb
171b0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
171c0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
171d0 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a  ere(v, addr1);..
171e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
171f0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
17200 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65   iTab);.  sqlite
17210 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
17220 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a  P_Close, iIdx);.
17230 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17240 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
17250 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a   iSorter);.}../*
17260 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68 65 61  .** Allocate hea
17270 70 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  p space to hold 
17280 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  an Index object 
17290 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e  with nCol column
172a0 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61 73  s..**.** Increas
172b0 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  e the allocation
172c0 20 73 69 7a 65 20 74 6f 20 70 72 6f 76 69 64 65   size to provide
172d0 20 61 6e 20 65 78 74 72 61 20 6e 45 78 74 72 61   an extra nExtra
172e0 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38 2d 62   bytes.** of 8-b
172f0 79 74 65 20 61 6c 69 67 6e 65 64 20 73 70 61 63  yte aligned spac
17300 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65  e after the Inde
17310 78 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  x object and ret
17320 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72  urn a.** pointer
17330 20 74 6f 20 74 68 69 73 20 65 78 74 72 61 20 73   to this extra s
17340 70 61 63 65 20 69 6e 20 2a 70 70 45 78 74 72 61  pace in *ppExtra
17350 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  ..*/.Index *sqli
17360 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78  te3AllocateIndex
17370 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c 69 74 65  Object(.  sqlite
17380 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f  3 *db,         /
17390 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
173a0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36 20 6e  ction */.  i16 n
173b0 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
173c0 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
173d0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
173e0 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
173f0 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
17400 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
17410 79 74 65 73 20 6f 66 20 65 78 74 72 61 20 73 70  ytes of extra sp
17420 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f 0a  ace to alloc */.
17430 20 20 63 68 61 72 20 2a 2a 70 70 45 78 74 72 61    char **ppExtra
17440 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
17450 72 20 74 6f 20 74 68 65 20 22 65 78 74 72 61 22  r to the "extra"
17460 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20 20 49   space */.){.  I
17470 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20  ndex *p;        
17480 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
17490 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f   index object */
174a0 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
174b0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
174c0 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 49 6e   of space for In
174d0 64 65 78 20 6f 62 6a 65 63 74 20 2b 20 61 72 72  dex object + arr
174e0 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74 65 20  ays */..  nByte 
174f0 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
17500 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20 20 20  Index)) +       
17510 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
17520 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20  structure  */.  
17530 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73          ROUND8(s
17540 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f  izeof(char*)*nCo
17550 6c 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20  l) +         /* 
17560 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20  Index.azColl    
17570 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f   */.          RO
17580 55 4e 44 38 28 73 69 7a 65 6f 66 28 4c 6f 67 45  UND8(sizeof(LogE
17590 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20  st)*(nCol+1) +  
175a0 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f     /* Index.aiRo
175b0 77 4c 6f 67 45 73 74 20 20 20 2a 2f 0a 20 20 20  wLogEst   */.   
175c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
175d0 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 20 2b  zeof(i16)*nCol +
175e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
175f0 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20  ndex.aiColumn   
17600 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
17610 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e      sizeof(u8)*n
17620 43 6f 6c 29 3b 20 20 20 20 20 20 20 20 20 20 20  Col);           
17630 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74    /* Index.aSort
17640 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d 20 73  Order */.  p = s
17650 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
17660 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b 20 6e  ro(db, nByte + n
17670 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70 20  Extra);.  if( p 
17680 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 45 78  ){.    char *pEx
17690 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29  tra = ((char*)p)
176a0 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49  +ROUND8(sizeof(I
176b0 6e 64 65 78 29 29 3b 0a 20 20 20 20 70 2d 3e 61  ndex));.    p->a
176c0 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63  zColl = (const c
176d0 68 61 72 2a 2a 29 70 45 78 74 72 61 3b 20 70 45  har**)pExtra; pE
176e0 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38 28 73  xtra += ROUND8(s
176f0 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f  izeof(char*)*nCo
17700 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52 6f 77  l);.    p->aiRow
17710 4c 6f 67 45 73 74 20 3d 20 28 4c 6f 67 45 73 74  LogEst = (LogEst
17720 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74 72 61  *)pExtra; pExtra
17730 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73   += sizeof(LogEs
17740 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20  t)*(nCol+1);.   
17750 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28   p->aiColumn = (
17760 69 31 36 2a 29 70 45 78 74 72 61 3b 20 20 20 20  i16*)pExtra;    
17770 20 20 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a     pExtra += siz
17780 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20  eof(i16)*nCol;. 
17790 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72     p->aSortOrder
177a0 20 3d 20 28 75 38 2a 29 70 45 78 74 72 61 3b 0a   = (u8*)pExtra;.
177b0 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d      p->nColumn =
177c0 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b   nCol;.    p->nK
177d0 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31  eyCol = nCol - 1
177e0 3b 0a 20 20 20 20 2a 70 70 45 78 74 72 61 20 3d  ;.    *ppExtra =
177f0 20 28 28 63 68 61 72 2a 29 70 29 20 2b 20 6e 42   ((char*)p) + nB
17800 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  yte;.  }.  retur
17810 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n p;.}../*.** Cr
17820 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78  eate a new index
17830 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c   for an SQL tabl
17840 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65  e.  pName1.pName
17850 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  2 is the name of
17860 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61   the index .** a
17870 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74  nd pTblList is t
17880 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
17890 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
178a0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74  be indexed.  Bot
178b0 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55  h will .** be NU
178c0 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79  LL for a primary
178d0 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78   key or an index
178e0 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
178f0 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a   to satisfy a.**
17900 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
17910 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61  nt.  If pTable a
17920 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55  nd pIndex are NU
17930 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e  LL, use pParse->
17940 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20  pNewTable.** as 
17950 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
17960 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65  indexed.  pParse
17970 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61  ->pNewTable is a
17980 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a   table that is.*
17990 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  * currently bein
179a0 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  g constructed by
179b0 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
179c0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
179d0 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
179e0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
179f0 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73  e indexed.  pLis
17a00 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  t will be NULL i
17a10 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70  f this.** is a p
17a20 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e  rimary key or un
17a30 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20  ique-constraint 
17a40 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
17a50 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a  nt column added.
17a60 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ** to the table 
17a70 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
17a80 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a  construction.  .
17a90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
17aa0 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61  reateIndex(.  Pa
17ab0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
17ac0 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74   /* All informat
17ad0 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70  ion about this p
17ae0 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  arse */.  Token 
17af0 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20  *pName1,     /* 
17b00 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e  First part of in
17b10 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
17b20 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
17b30 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
17b40 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
17b50 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20  index name. May 
17b60 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63  be NULL */.  Src
17b70 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20  List *pTblName, 
17b80 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65  /* Table to inde
17b90 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70  x. Use pParse->p
17ba0 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f  NewTable if 0 */
17bb0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
17bc0 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20  st,   /* A list 
17bd0 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
17be0 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
17bf0 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
17c00 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45   /* OE_Abort, OE
17c10 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c  _Ignore, OE_Repl
17c20 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20  ace, or OE_None 
17c30 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61  */.  Token *pSta
17c40 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43  rt,     /* The C
17c50 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
17c60 20 62 65 67 69 6e 73 20 74 68 69 73 20 73 74 61   begins this sta
17c70 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72  tement */.  Expr
17c80 20 2a 70 50 49 57 68 65 72 65 2c 20 20 20 20 2f   *pPIWhere,    /
17c90 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  * WHERE clause f
17ca0 6f 72 20 70 61 72 74 69 61 6c 20 69 6e 64 69 63  or partial indic
17cb0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  es */.  int sort
17cc0 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f  Order,     /* So
17cd0 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69 6d  rt order of prim
17ce0 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c 69  ary key when pLi
17cf0 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e  st==NULL */.  in
17d00 74 20 69 66 4e 6f 74 45 78 69 73 74 2c 20 20 20  t ifNotExist,   
17d10 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20 69   /* Omit error i
17d20 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  f index already 
17d30 65 78 69 73 74 73 20 2a 2f 0a 20 20 75 38 20 69  exists */.  u8 i
17d40 64 78 54 79 70 65 20 20 20 20 20 20 20 20 20 2f  dxType         /
17d50 2a 20 54 68 65 20 69 6e 64 65 78 20 74 79 70 65  * The index type
17d60 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
17d70 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a  pTab = 0;     /*
17d80 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   Table to be ind
17d90 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  exed */.  Index 
17da0 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f  *pIndex = 0;   /
17db0 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
17dc0 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63  e created */.  c
17dd0 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20  har *zName = 0; 
17de0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
17df0 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  he index */.  in
17e00 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
17e10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17e20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e  characters in zN
17e30 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ame */.  int i, 
17e40 6a 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  j;.  DbFixer sFi
17e50 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  x;        /* For
17e60 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62   assigning datab
17e70 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61  ase names to pTa
17e80 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ble */.  int sor
17e90 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a  tOrderMask;   /*
17ea0 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43   1 to honor DESC
17eb0 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f   in index.  0 to
17ec0 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71   ignore. */.  sq
17ed0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
17ee0 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44  se->db;.  Db *pD
17ef0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b;             /
17f00 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20 74  * The specific t
17f10 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
17f20 74 68 65 20 69 6e 64 65 78 65 64 20 64 61 74 61  the indexed data
17f30 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  base */.  int iD
17f40 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b;             /
17f50 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64  * Index of the d
17f60 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20  atabase that is 
17f70 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
17f80 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  .  Token *pName 
17f90 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  = 0;    /* Unqua
17fa0 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
17fb0 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61  he index to crea
17fc0 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45  te */.  struct E
17fd0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  xprList_item *pL
17fe0 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20  istItem; /* For 
17ff0 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69  looping over pLi
18000 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  st */.  int nExt
18010 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ra = 0;         
18020 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
18030 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
18040 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e  zExtra[] */.  in
18050 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20 20 20  t nExtraCol;    
18060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18070 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
18080 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64  a columns needed
18090 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 74   */.  char *zExt
180a0 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ra = 0;         
180b0 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
180c0 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65 20  space after the 
180d0 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a  Index object */.
180e0 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30    Index *pPk = 0
180f0 3b 20 20 20 20 20 20 2f 2a 20 50 52 49 4d 41 52  ;      /* PRIMAR
18100 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72 20  Y KEY index for 
18110 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
18120 62 6c 65 73 20 2a 2f 0a 0a 20 20 69 66 28 20 64  bles */..  if( d
18130 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18140 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
18150 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  0 ){.    goto ex
18160 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18170 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e 5f 44 45  .  }.  if( IN_DE
18180 43 4c 41 52 45 5f 56 54 41 42 20 26 26 20 69 64  CLARE_VTAB && id
18190 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44  xType!=SQLITE_ID
181a0 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59  XTYPE_PRIMARYKEY
181b0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
181c0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
181d0 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54 45    }.  if( SQLITE
181e0 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
181f0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
18200 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
18210 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18220 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  }..  /*.  ** Fin
18230 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  d the table that
18240 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
18250 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79  d.  Return early
18260 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   if not found.. 
18270 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61   */.  if( pTblNa
18280 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a  me!=0 ){..    /*
18290 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72   Use the two-par
182a0 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20  t index name to 
182b0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61  determine the da
182c0 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74  tabase .    ** t
182d0 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  o search for the
182e0 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68   table. 'Fix' th
182f0 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  e table name to 
18300 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62  this db.    ** b
18310 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70  efore looking up
18320 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
18330 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
18340 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20  Name1 && pName2 
18350 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  );.    iDb = sql
18360 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
18370 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
18380 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
18390 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29  .    if( iDb<0 )
183a0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
183b0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73  e_index;.    ass
183c0 65 72 74 28 20 70 4e 61 6d 65 20 26 26 20 70 4e  ert( pName && pN
183d0 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64  ame->z );..#ifnd
183e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
183f0 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20  EMPDB.    /* If 
18400 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77  the index name w
18410 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20  as unqualified, 
18420 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 61 62  check if the tab
18430 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74  le.    ** is a t
18440 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f  emp table. If so
18450 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
18460 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20  se to 1. Do not 
18470 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  do this.    ** i
18480 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20 61  f initialising a
18490 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
184a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
184b0 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
184c0 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
184d0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f  sqlite3SrcListLo
184e0 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62  okup(pParse, pTb
184f0 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  lName);.      if
18500 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26  ( pName2->n==0 &
18510 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e  & pTab && pTab->
18520 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62  pSchema==db->aDb
18530 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20  [1].pSchema ){. 
18540 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a         iDb = 1;.
18550 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
18560 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74 65  ndif..    sqlite
18570 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20  3FixInit(&sFix, 
18580 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e  pParse, iDb, "in
18590 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  dex", pName);.  
185a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78    if( sqlite3Fix
185b0 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70  SrcList(&sFix, p
185c0 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  TblName) ){.    
185d0 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65    /* Because the
185e0 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63   parser construc
185f0 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d  ts pTblName from
18600 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69   a single identi
18610 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73  fier,.      ** s
18620 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
18630 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e   can never fail.
18640 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
18650 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  (0);.    }.    p
18660 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
18670 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61  ateTableItem(pPa
18680 72 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61 6d  rse, 0, &pTblNam
18690 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73  e->a[0]);.    as
186a0 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
186b0 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54 61  Failed==0 || pTa
186c0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b==0 );.    if( 
186d0 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65  pTab==0 ) goto e
186e0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
186f0 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31  ;.    if( iDb==1
18700 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d   && db->aDb[iDb]
18710 2e 70 53 63 68 65 6d 61 21 3d 70 54 61 62 2d 3e  .pSchema!=pTab->
18720 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
18730 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18740 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
18750 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 72 65       "cannot cre
18760 61 74 65 20 61 20 54 45 4d 50 20 69 6e 64 65 78  ate a TEMP index
18770 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62   on non-TEMP tab
18780 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20  le \"%s\"",.    
18790 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
187a0 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
187b0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
187c0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
187d0 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
187e0 20 29 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33   ) pPk = sqlite3
187f0 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
18800 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pTab);.  }else{.
18810 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
18820 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
18830 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20 29 3b  rt( pStart==0 );
18840 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61 72  .    pTab = pPar
18850 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
18860 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67     if( !pTab ) g
18870 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18880 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20 3d  index;.    iDb =
18890 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
188a0 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
188b0 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
188c0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
188d0 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Db];..  assert( 
188e0 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  pTab!=0 );.  ass
188f0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
18900 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71  r==0 );.  if( sq
18910 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54  lite3StrNICmp(pT
18920 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ab->zName, "sqli
18930 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20  te_", 7)==0 .   
18940 20 20 20 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e      && db->init.
18950 62 75 73 79 3d 3d 30 0a 23 69 66 20 53 51 4c 49  busy==0.#if SQLI
18960 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
18970 43 41 54 49 4f 4e 0a 20 20 20 20 20 20 20 26 26  CATION.       &&
18980 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
18990 54 61 62 6c 65 28 70 54 61 62 2d 3e 7a 4e 61 6d  Table(pTab->zNam
189a0 65 29 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20  e)==0.#endif.   
189b0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
189c0 72 4e 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e  rNICmp(&pTab->zN
189d0 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62  ame[7],"altertab
189e0 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20 20  _",9)!=0 ){.    
189f0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18a00 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
18a10 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
18a20 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  exed", pTab->zNa
18a30 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
18a40 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18a50 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
18a60 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
18a70 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
18a80 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
18a90 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
18aa0 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20   "views may not 
18ab0 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
18ac0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18ad0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
18ae0 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
18af0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
18b00 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69  TABLE.  if( IsVi
18b10 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
18b20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
18b30 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 72 74  sg(pParse, "virt
18b40 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e  ual tables may n
18b50 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
18b60 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
18b70 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
18b80 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20  .#endif..  /*.  
18b90 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  ** Find the name
18ba0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
18bb0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
18bc0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
18bd0 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65  nother.  ** inde
18be0 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20  x or table with 
18bf0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
18c00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
18c10 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65  tion:  If we are
18c20 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d   reading the nam
18c30 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20  es of permanent 
18c40 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65  indices from the
18c50 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73  .  ** sqlite_mas
18c60 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75  ter table (becau
18c70 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
18c80 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68  ocess changed th
18c90 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20  e schema) and.  
18ca0 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  ** one of the in
18cb0 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64  dex names collid
18cc0 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  es with the name
18cd0 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   of a temporary 
18ce0 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e  table or.  ** in
18cf0 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c  dex, then we wil
18d00 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72  l continue to pr
18d10 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78  ocess this index
18d20 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
18d30 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
18d40 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a   that we are.  *
18d50 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  * dealing with a
18d60 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
18d70 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
18d80 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  t.  We have to i
18d90 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f  nvent our.  ** o
18da0 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  wn name..  */.  
18db0 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
18dc0 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
18dd0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
18de0 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , pName);.    if
18df0 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
18e00 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18e10 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dex;.    assert(
18e20 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a   pName->z!=0 );.
18e30 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
18e40 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
18e50 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
18e60 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
18e70 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18e80 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
18e90 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
18ea0 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
18eb0 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
18ec0 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
18ed0 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)!=0 ){.       
18ee0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18ef0 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
18f00 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62  is already a tab
18f10 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  le named %s", zN
18f20 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
18f30 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18f40 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
18f50 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
18f60 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
18f70 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 44 62   zName, pDb->zDb
18f80 53 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  SName)!=0 ){.   
18f90 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69     if( !ifNotExi
18fa0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  st ){.        sq
18fb0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18fc0 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20  arse, "index %s 
18fd0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
18fe0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
18ff0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
19000 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
19010 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20 20 20  busy );.        
19020 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
19030 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
19040 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iDb);.      }.  
19050 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
19060 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
19070 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
19080 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20  nt n;.    Index 
19090 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28  *pLoop;.    for(
190a0 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64  pLoop=pTab->pInd
190b0 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20  ex, n=1; pLoop; 
190c0 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65  pLoop=pLoop->pNe
190d0 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a  xt, n++){}.    z
190e0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
190f0 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74  rintf(db, "sqlit
19100 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25  e_autoindex_%s_%
19110 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  d", pTab->zName,
19120 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61   n);.    if( zNa
19130 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  me==0 ){.      g
19140 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19150 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 0a 20 20  index;.    }..  
19160 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69    /* Automatic i
19170 6e 64 65 78 20 6e 61 6d 65 73 20 67 65 6e 65 72  ndex names gener
19180 61 74 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  ated from within
19190 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
191a0 5f 76 74 61 62 28 29 0a 20 20 20 20 2a 2a 20 6d  _vtab().    ** m
191b0 75 73 74 20 68 61 76 65 20 6e 61 6d 65 73 20 74  ust have names t
191c0 68 61 74 20 61 72 65 20 64 69 73 74 69 6e 63 74  hat are distinct
191d0 20 66 72 6f 6d 20 6e 6f 72 6d 61 6c 20 61 75 74   from normal aut
191e0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6e 61 6d  omatic index nam
191f0 65 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66  es..    ** The f
19200 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
19210 6e 74 20 63 6f 6e 76 65 72 74 73 20 22 73 71 6c  nt converts "sql
19220 69 74 65 33 5f 61 75 74 6f 69 6e 64 65 78 2e 2e  ite3_autoindex..
19230 2e 22 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 22  ." into.    ** "
19240 73 71 6c 69 74 65 33 5f 62 75 74 6f 69 6e 64 65  sqlite3_butoinde
19250 78 2e 2e 2e 22 20 69 6e 20 6f 72 64 65 72 20 74  x..." in order t
19260 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 73  o make the names
19270 20 64 69 73 74 69 6e 63 74 2e 0a 20 20 20 20 2a   distinct..    *
19280 2a 20 54 68 65 20 22 76 74 61 62 5f 65 72 72 2e  * The "vtab_err.
19290 74 65 73 74 22 20 74 65 73 74 20 64 65 6d 6f 6e  test" test demon
192a0 73 74 72 61 74 65 73 20 74 68 65 20 6e 65 65 64  strates the need
192b0 20 6f 66 20 74 68 69 73 20 73 74 61 74 65 6d 65   of this stateme
192c0 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 49  nt. */.    if( I
192d0 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
192e0 20 7a 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a 20 20 7d   zName[7]++;.  }
192f0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
19300 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
19310 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65  o create an inde
19320 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  x..  */.#ifndef 
19330 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
19340 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
19350 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
19360 62 20 3d 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  b = pDb->zDbSNam
19370 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
19380 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
19390 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
193a0 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
193b0 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  iDb), 0, zDb) ){
193c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
193d0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
193e0 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c     }.    i = SQL
193f0 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
19400 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  ;.    if( !OMIT_
19410 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
19420 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52   ) i = SQLITE_CR
19430 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  EATE_TEMP_INDEX;
19440 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
19450 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
19460 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62  , i, zName, pTab
19470 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
19480 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
19490 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
194a0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
194b0 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d  .  /* If pList==
194c0 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  0, it means this
194d0 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
194e0 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72  led to make a pr
194f0 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f  imary.  ** key o
19500 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63  ut of the last c
19510 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74  olumn added to t
19520 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
19530 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a  onstruction..  *
19540 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61  * So create a fa
19550 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c  ke list to simul
19560 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  ate this..  */. 
19570 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
19580 0a 20 20 20 20 54 6f 6b 65 6e 20 70 72 65 76 43  .    Token prevC
19590 6f 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ol;.    sqlite3T
195a0 6f 6b 65 6e 49 6e 69 74 28 26 70 72 65 76 43 6f  okenInit(&prevCo
195b0 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54  l, pTab->aCol[pT
195c0 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d  ab->nCol-1].zNam
195d0 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  e);.    pList = 
195e0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
195f0 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
19600 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
19610 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
19620 64 62 2c 20 54 4b 5f 49 44 2c 20 26 70 72 65 76  db, TK_ID, &prev
19630 43 6f 6c 2c 20 30 29 29 3b 0a 20 20 20 20 69 66  Col, 0));.    if
19640 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
19650 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
19660 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dex;.    assert(
19670 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31   pList->nExpr==1
19680 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   );.    sqlite3E
19690 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72  xprListSetSortOr
196a0 64 65 72 28 70 4c 69 73 74 2c 20 73 6f 72 74 4f  der(pList, sortO
196b0 72 64 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rder);.  }else{.
196c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
196d0 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 70  istCheckLength(p
196e0 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 22 69  Parse, pList, "i
196f0 6e 64 65 78 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ndex");.  }..  /
19700 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
19710 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73   many bytes of s
19720 70 61 63 65 20 61 72 65 20 72 65 71 75 69 72 65  pace are require
19730 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69  d to store expli
19740 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69  citly.  ** speci
19750 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  fied collation s
19760 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20  equence names.. 
19770 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
19780 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
19790 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
197a0 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
197b0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  i].pExpr;.    as
197c0 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29  sert( pExpr!=0 )
197d0 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
197e0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
197f0 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  ){.      nExtra 
19800 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53  += (1 + sqlite3S
19810 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75  trlen30(pExpr->u
19820 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d  .zToken));.    }
19830 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  .  }..  /* .  **
19840 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e   Allocate the in
19850 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a  dex structure. .
19860 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73    */.  nName = s
19870 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
19880 4e 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61 43  Name);.  nExtraC
19890 6f 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e  ol = pPk ? pPk->
198a0 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70  nKeyCol : 1;.  p
198b0 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 41  Index = sqlite3A
198c0 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65  llocateIndexObje
198d0 63 74 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45  ct(db, pList->nE
198e0 78 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c  xpr + nExtraCol,
198f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19910 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e         nName + n
19920 45 78 74 72 61 20 2b 20 31 2c 20 26 7a 45 78 74  Extra + 1, &zExt
19930 72 61 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ra);.  if( db->m
19940 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
19950 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
19960 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
19970 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
19980 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49  YTE_ALIGNMENT(pI
19990 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  ndex->aiRowLogEs
199a0 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  t) );.  assert( 
199b0 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
199c0 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43  MENT(pIndex->azC
199d0 6f 6c 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65 78  oll) );.  pIndex
199e0 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61  ->zName = zExtra
199f0 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e  ;.  zExtra += nN
19a00 61 6d 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70  ame + 1;.  memcp
19a10 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  y(pIndex->zName,
19a20 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29   zName, nName+1)
19a30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  ;.  pIndex->pTab
19a40 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e  le = pTab;.  pIn
19a50 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28  dex->onError = (
19a60 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49  u8)onError;.  pI
19a70 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  ndex->uniqNotNul
19a80 6c 20 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  l = onError!=OE_
19a90 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  None;.  pIndex->
19aa0 69 64 78 54 79 70 65 20 3d 20 69 64 78 54 79 70  idxType = idxTyp
19ab0 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63  e;.  pIndex->pSc
19ac0 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69  hema = db->aDb[i
19ad0 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70  Db].pSchema;.  p
19ae0 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d  Index->nKeyCol =
19af0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
19b00 20 69 66 28 20 70 50 49 57 68 65 72 65 20 29 7b   if( pPIWhere ){
19b10 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
19b20 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65  lveSelfReference
19b30 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e  (pParse, pTab, N
19b40 43 5f 50 61 72 74 49 64 78 2c 20 70 50 49 57 68  C_PartIdx, pPIWh
19b50 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e  ere, 0);.    pIn
19b60 64 65 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  dex->pPartIdxWhe
19b70 72 65 20 3d 20 70 50 49 57 68 65 72 65 3b 0a 20  re = pPIWhere;. 
19b80 20 20 20 70 50 49 57 68 65 72 65 20 3d 20 30 3b     pPIWhere = 0;
19b90 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
19ba0 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
19bb0 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
19bc0 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ) );..  /* Check
19bd0 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 73 68   to see if we sh
19be0 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20  ould honor DESC 
19bf0 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65  requests on inde
19c00 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20  x columns.  */. 
19c10 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
19c20 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  a->file_format>=
19c30 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64  4 ){.    sortOrd
19c40 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f  erMask = -1;   /
19c50 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a  * Honor DESC */.
19c60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72    }else{.    sor
19c70 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20  tOrderMask = 0; 
19c80 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53     /* Ignore DES
19c90 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  C */.  }..  /* A
19ca0 6e 61 6c 79 7a 65 20 74 68 65 20 6c 69 73 74 20  nalyze the list 
19cb0 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  of expressions t
19cc0 68 61 74 20 66 6f 72 6d 20 74 68 65 20 74 65 72  hat form the ter
19cd0 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ms of the index 
19ce0 61 6e 64 0a 20 20 2a 2a 20 72 65 70 6f 72 74 20  and.  ** report 
19cf0 61 6e 79 20 65 72 72 6f 72 73 2e 20 20 49 6e 20  any errors.  In 
19d00 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
19d10 77 68 65 72 65 20 74 68 65 20 65 78 70 72 65 73  where the expres
19d20 73 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 0a  sion is exactly.
19d30 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 63 6f 6c    ** a table col
19d40 75 6d 6e 2c 20 73 74 6f 72 65 20 74 68 61 74 20  umn, store that 
19d50 63 6f 6c 75 6d 6e 20 69 6e 20 61 69 43 6f 6c 75  column in aiColu
19d60 6d 6e 5b 5d 2e 20 20 46 6f 72 20 67 65 6e 65 72  mn[].  For gener
19d70 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a  al expressions,.
19d80 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 20 70 49    ** populate pI
19d90 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 61  ndex->aColExpr a
19da0 6e 64 20 73 74 6f 72 65 20 58 4e 5f 45 58 50 52  nd store XN_EXPR
19db0 20 28 2d 32 29 20 69 6e 20 61 69 43 6f 6c 75 6d   (-2) in aiColum
19dc0 6e 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  n[]..  **.  ** T
19dd0 4f 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72  ODO: Issue a war
19de0 6e 69 6e 67 20 69 66 20 74 77 6f 20 6f 72 20 6d  ning if two or m
19df0 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ore columns of t
19e00 68 65 20 69 6e 64 65 78 20 61 72 65 20 69 64 65  he index are ide
19e10 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 20 54 4f 44  ntical..  ** TOD
19e20 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e 69  O: Issue a warni
19e30 6e 67 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ng if the table 
19e40 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75  primary key is u
19e50 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  sed as part of t
19e60 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6b 65  he.  ** index ke
19e70 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
19e80 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69  0, pListItem=pLi
19e90 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
19ea0 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73  nExpr; i++, pLis
19eb0 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  tItem++){.    Ex
19ec0 70 72 20 2a 70 43 45 78 70 72 3b 20 20 20 20 20  pr *pCExpr;     
19ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19ee0 54 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20 65  The i-th index e
19ef0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
19f00 20 69 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f   int requestedSo
19f10 72 74 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20  rtOrder;        
19f20 2f 2a 20 41 53 43 20 6f 72 20 44 45 53 43 20 6f  /* ASC or DESC o
19f30 6e 20 74 68 65 20 69 2d 74 68 20 65 78 70 72 65  n the i-th expre
19f40 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e  ssion */.    con
19f50 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20  st char *zColl; 
19f60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
19f70 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
19f80 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 73  e name */..    s
19f90 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64  qlite3StringToId
19fa0 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70  (pListItem->pExp
19fb0 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  r);.    sqlite3R
19fc0 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65  esolveSelfRefere
19fd0 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  nce(pParse, pTab
19fe0 2c 20 4e 43 5f 49 64 78 45 78 70 72 2c 20 70 4c  , NC_IdxExpr, pL
19ff0 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  istItem->pExpr, 
1a000 30 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72  0);.    if( pPar
1a010 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
1a020 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1a030 78 3b 0a 20 20 20 20 70 43 45 78 70 72 20 3d 20  x;.    pCExpr = 
1a040 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
1a050 6f 6c 6c 61 74 65 28 70 4c 69 73 74 49 74 65 6d  ollate(pListItem
1a060 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ->pExpr);.    if
1a070 28 20 70 43 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  ( pCExpr->op!=TK
1a080 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
1a090 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73   if( pTab==pPars
1a0a0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a  e->pNewTable ){.
1a0b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a0c0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1a0d0 22 65 78 70 72 65 73 73 69 6f 6e 73 20 70 72 6f  "expressions pro
1a0e0 68 69 62 69 74 65 64 20 69 6e 20 50 52 49 4d 41  hibited in PRIMA
1a0f0 52 59 20 4b 45 59 20 61 6e 64 20 22 0a 20 20 20  RY KEY and ".   
1a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a110 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55 4e               "UN
1a120 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73  IQUE constraints
1a130 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  ");.        goto
1a140 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1a150 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
1a160 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 43    if( pIndex->aC
1a170 6f 6c 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20  olExpr==0 ){.   
1a180 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
1a190 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78  Copy = sqlite3Ex
1a1a0 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4c  prListDup(db, pL
1a1b0 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ist, 0);.       
1a1c0 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70   pIndex->aColExp
1a1d0 72 20 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20 20  r = pCopy;.     
1a1e0 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c     if( !db->mall
1a1f0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
1a200 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1a210 6f 70 79 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  opy!=0 );.      
1a220 20 20 20 20 70 4c 69 73 74 49 74 65 6d 20 3d 20      pListItem = 
1a230 26 70 43 6f 70 79 2d 3e 61 5b 69 5d 3b 0a 20 20  &pCopy->a[i];.  
1a240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1a250 20 20 20 20 20 20 6a 20 3d 20 58 4e 5f 45 58 50        j = XN_EXP
1a260 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  R;.      pIndex-
1a270 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58  >aiColumn[i] = X
1a280 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49  N_EXPR;.      pI
1a290 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  ndex->uniqNotNul
1a2a0 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  l = 0;.    }else
1a2b0 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 43 45 78  {.      j = pCEx
1a2c0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
1a2d0 20 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 30 78     assert( j<=0x
1a2e0 37 66 66 66 20 29 3b 0a 20 20 20 20 20 20 69 66  7fff );.      if
1a2f0 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( j<0 ){.       
1a300 20 6a 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79   j = pTab->iPKey
1a310 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1a320 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ( pTab->aCol[j].
1a330 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20  notNull==0 ){.  
1a340 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e        pIndex->un
1a350 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20  iqNotNull = 0;. 
1a360 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
1a370 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
1a380 20 3d 20 28 69 31 36 29 6a 3b 0a 20 20 20 20 7d   = (i16)j;.    }
1a390 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a  .    zColl = 0;.
1a3a0 20 20 20 20 69 66 28 20 70 4c 69 73 74 49 74 65      if( pListIte
1a3b0 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  m->pExpr->op==TK
1a3c0 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20  _COLLATE ){.    
1a3d0 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20    int nColl;.   
1a3e0 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74     zColl = pList
1a3f0 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a  Item->pExpr->u.z
1a400 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f  Token;.      nCo
1a410 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  ll = sqlite3Strl
1a420 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b  en30(zColl) + 1;
1a430 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
1a440 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a  Extra>=nColl );.
1a450 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 78        memcpy(zEx
1a460 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c  tra, zColl, nCol
1a470 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20  l);.      zColl 
1a480 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20  = zExtra;.      
1a490 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b  zExtra += nColl;
1a4a0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2d 3d  .      nExtra -=
1a4b0 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73   nColl;.    }els
1a4c0 65 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20  e if( j>=0 ){.  
1a4d0 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62      zColl = pTab
1a4e0 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[j].zColl;
1a4f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
1a500 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20  zColl ) zColl = 
1a510 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
1a520 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  ;.    if( !db->i
1a530 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c  nit.busy && !sql
1a540 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
1a550 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  q(pParse, zColl)
1a560 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
1a570 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1a580 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
1a590 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20  ex->azColl[i] = 
1a5a0 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65  zColl;.    reque
1a5b0 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20  stedSortOrder = 
1a5c0 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f  pListItem->sortO
1a5d0 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72  rder & sortOrder
1a5e0 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78  Mask;.    pIndex
1a5f0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1a600 3d 20 28 75 38 29 72 65 71 75 65 73 74 65 64 53  = (u8)requestedS
1a610 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
1a620 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 74   /* Append the t
1a630 61 62 6c 65 20 6b 65 79 20 74 6f 20 74 68 65 20  able key to the 
1a640 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
1a650 2e 20 20 46 6f 72 20 57 49 54 48 4f 55 54 20 52  .  For WITHOUT R
1a660 4f 57 49 44 0a 20 20 2a 2a 20 74 61 62 6c 65 73  OWID.  ** tables
1a670 20 28 77 68 65 6e 20 70 50 6b 21 3d 30 29 20 74   (when pPk!=0) t
1a680 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
1a690 64 65 63 6c 61 72 65 64 20 50 52 49 4d 41 52 59  declared PRIMARY
1a6a0 20 4b 45 59 2e 20 20 46 6f 72 0a 20 20 2a 2a 20   KEY.  For.  ** 
1a6b0 6e 6f 72 6d 61 6c 20 74 61 62 6c 65 73 20 28 77  normal tables (w
1a6c0 68 65 6e 20 70 50 6b 3d 3d 30 29 20 74 68 69 73  hen pPk==0) this
1a6d0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 72 6f 77   will be the row
1a6e0 69 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  id..  */.  if( p
1a6f0 50 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  Pk ){.    for(j=
1a700 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f  0; j<pPk->nKeyCo
1a710 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; j++){.      i
1a720 6e 74 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f  nt x = pPk->aiCo
1a730 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 61  lumn[j];.      a
1a740 73 73 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20  ssert( x>=0 );. 
1a750 20 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75       if( hasColu
1a760 6d 6e 28 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  mn(pIndex->aiCol
1a770 75 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65  umn, pIndex->nKe
1a780 79 43 6f 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20  yCol, x) ){.    
1a790 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c      pIndex->nCol
1a7a0 75 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65  umn--; .      }e
1a7b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  lse{.        pIn
1a7c0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
1a7d0 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 49   = x;.        pI
1a7e0 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20  ndex->azColl[i] 
1a7f0 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d  = pPk->azColl[j]
1a800 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ;.        pIndex
1a810 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1a820 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65  = pPk->aSortOrde
1a830 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b  r[j];.        i+
1a840 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
1a850 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d  .    assert( i==
1a860 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
1a870 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1a880 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1a890 5b 69 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a  [i] = XN_ROWID;.
1a8a0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
1a8b0 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 53  ll[i] = sqlite3S
1a8c0 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 20 20  trBINARY;.  }.  
1a8d0 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f  sqlite3DefaultRo
1a8e0 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 20 20  wEst(pIndex);.  
1a8f0 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  if( pParse->pNew
1a900 54 61 62 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d  Table==0 ) estim
1a910 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49  ateIndexWidth(pI
1a920 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ndex);..  /* If 
1a930 74 68 69 73 20 69 6e 64 65 78 20 63 6f 6e 74 61  this index conta
1a940 69 6e 73 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e  ins every column
1a950 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2c 20 74   of its table, t
1a960 68 65 6e 20 6d 61 72 6b 0a 20 20 2a 2a 20 69 74  hen mark.  ** it
1a970 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69   as a covering i
1a980 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74  ndex */.  assert
1a990 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
1a9a0 20 0a 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d   .      || pTab-
1a9b0 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 73 71 6c 69  >iPKey<0 || sqli
1a9c0 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
1a9d0 28 70 49 6e 64 65 78 2c 20 70 54 61 62 2d 3e 69  (pIndex, pTab->i
1a9e0 50 4b 65 79 29 3e 3d 30 20 29 3b 0a 20 20 69 66  PKey)>=0 );.  if
1a9f0 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 26 26  ( pTblName!=0 &&
1aa00 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
1aa10 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  >=pTab->nCol ){.
1aa20 20 20 20 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f      pIndex->isCo
1aa30 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20  vering = 1;.    
1aa40 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
1aa50 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
1aa60 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e     if( j==pTab->
1aa70 69 50 4b 65 79 20 29 20 63 6f 6e 74 69 6e 75 65  iPKey ) continue
1aa80 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
1aa90 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
1aaa0 28 70 49 6e 64 65 78 2c 6a 29 3e 3d 30 20 29 20  (pIndex,j)>=0 ) 
1aab0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1aac0 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72 69  pIndex->isCoveri
1aad0 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  ng = 0;.      br
1aae0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
1aaf0 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72    if( pTab==pPar
1ab00 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b  se->pNewTable ){
1ab10 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  .    /* This rou
1ab20 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61  tine has been ca
1ab30 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
1ab40 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
1ab50 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65  x as a.    ** re
1ab60 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52  sult of a PRIMAR
1ab70 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
1ab80 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75  clause on a colu
1ab90 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f  mn definition, o
1aba0 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41  r.    ** a PRIMA
1abb0 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
1abc0 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e   clause followin
1abd0 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66  g the column def
1abe0 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  initions..    **
1abf0 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20   i.e. one of:.  
1ac00 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41    **.    ** CREA
1ac10 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49  TE TABLE t(x PRI
1ac20 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20  MARY KEY, y);.  
1ac30 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
1ac40 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45  E t(x, y, UNIQUE
1ac50 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a  (x, y));.    **.
1ac60 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61      ** Either wa
1ac70 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  y, check to see 
1ac80 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  if the table alr
1ac90 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e  eady has such an
1aca0 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a   index. If.    *
1acb0 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68  * so, don't both
1acc0 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73  er creating this
1acd0 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20   one. This only 
1ace0 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a  applies to.    *
1acf0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
1ad00 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e  created indices.
1ad10 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73   Users can do as
1ad20 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a   they wish with.
1ad30 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20      ** explicit 
1ad40 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a  indices..    **.
1ad50 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55      ** Two UNIQU
1ad60 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
1ad70 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
1ad80 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69   considered equi
1ad90 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61  valent.    ** (a
1ada0 6e 64 20 74 68 75 73 20 73 75 70 70 72 65 73 73  nd thus suppress
1adb0 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  ing the second o
1adc0 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68 65 79  ne) even if they
1add0 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
1ade0 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65      ** sort orde
1adf0 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rs..    **.    *
1ae00 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
1ae10 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69  ifferent collati
1ae20 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20  ng sequences or 
1ae30 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  if the columns o
1ae40 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e  f.    ** the con
1ae50 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e  straint occur in
1ae60 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
1ae70 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73  s, then the cons
1ae80 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20  traints are.    
1ae90 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69  ** considered di
1aea0 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20  stinct and both 
1aeb0 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61  result in separa
1aec0 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  te indices..    
1aed0 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
1aee0 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
1aef0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
1af00 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
1af10 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
1af20 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t k;.      asser
1af30 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  t( IsUniqueIndex
1af40 28 70 49 64 78 29 20 29 3b 0a 20 20 20 20 20 20  (pIdx) );.      
1af50 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 64  assert( pIdx->id
1af60 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44  xType!=SQLITE_ID
1af70 58 54 59 50 45 5f 41 50 50 44 45 46 20 29 3b 0a  XTYPE_APPDEF );.
1af80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73        assert( Is
1af90 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64  UniqueIndex(pInd
1afa0 65 78 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  ex) );..      if
1afb0 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21  ( pIdx->nKeyCol!
1afc0 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c  =pIndex->nKeyCol
1afd0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1afe0 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49     for(k=0; k<pI
1aff0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b  dx->nKeyCol; k++
1b000 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
1b010 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20   char *z1;.     
1b020 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1b030 32 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  2;.        asser
1b040 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  t( pIdx->aiColum
1b050 6e 5b 6b 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20  n[k]>=0 );.     
1b060 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
1b070 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78  olumn[k]!=pIndex
1b080 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20  ->aiColumn[k] ) 
1b090 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a  break;.        z
1b0a0 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  1 = pIdx->azColl
1b0b0 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32 20  [k];.        z2 
1b0c0 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
1b0d0 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [k];.        if(
1b0e0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1b0f0 7a 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b  z1, z2) ) break;
1b100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1b110 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79  f( k==pIdx->nKey
1b120 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Col ){.        i
1b130 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
1b140 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  !=pIndex->onErro
1b150 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
1b160 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  * This constrain
1b170 74 20 63 72 65 61 74 65 73 20 74 68 65 20 73 61  t creates the sa
1b180 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20 70 72  me index as a pr
1b190 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20  evious.         
1b1a0 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73   ** constraint s
1b1b0 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65  pecified somewhe
1b1c0 72 65 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  re in the CREATE
1b1d0 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
1b1e0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48  ..          ** H
1b1f0 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f  owever the ON CO
1b200 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61  NFLICT clauses a
1b210 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66  re different. If
1b220 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20   both this .    
1b230 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61        ** constra
1b240 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65 76  int and the prev
1b250 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20  ious equivalent 
1b260 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20  constraint have 
1b270 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20  explicit.       
1b280 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43     ** ON CONFLIC
1b290 54 20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69  T clauses this i
1b2a0 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65  s an error. Othe
1b2b0 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20  rwise, use the. 
1b2c0 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c           ** expl
1b2d0 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64  icitly specified
1b2e0 20 62 65 68 61 76 69 6f 72 20 66 6f 72 20 74 68   behavior for th
1b2f0 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  e index..       
1b300 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1b310 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72  if( !(pIdx->onEr
1b320 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
1b330 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  || pIndex->onErr
1b340 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20  or==OE_Default) 
1b350 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
1b360 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1b370 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
1b380 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63          "conflic
1b390 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54  ting ON CONFLICT
1b3a0 20 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69   clauses specifi
1b3b0 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ed", 0);.       
1b3c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
1b3d0 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
1b3e0 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a  ==OE_Default ){.
1b3f0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
1b400 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64  ->onError = pInd
1b410 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20  ex->onError;.   
1b420 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b430 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
1b440 64 78 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49  dxType==SQLITE_I
1b450 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45  DXTYPE_PRIMARYKE
1b460 59 20 29 20 70 49 64 78 2d 3e 69 64 78 54 79 70  Y ) pIdx->idxTyp
1b470 65 20 3d 20 69 64 78 54 79 70 65 3b 0a 20 20 20  e = idxType;.   
1b480 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1b490 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1b4a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1b4b0 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65    /* Link the ne
1b4c0 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  w Index structur
1b4d0 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61  e to its table a
1b4e0 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a  nd to the other.
1b4f0 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    ** in-memory d
1b500 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
1b510 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65  es. .  */.  asse
1b520 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
1b530 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  ==0 );.  if( db-
1b540 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
1b550 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
1b560 61 73 73 65 72 74 28 20 21 49 4e 5f 44 45 43 4c  assert( !IN_DECL
1b570 41 52 45 5f 56 54 41 42 20 29 3b 0a 20 20 20 20  ARE_VTAB );.    
1b580 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
1b590 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
1b5a0 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53  b, 0, pIndex->pS
1b5b0 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 70 20  chema) );.    p 
1b5c0 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
1b5d0 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63  ert(&pIndex->pSc
1b5e0 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a  hema->idxHash, .
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b600 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78            pIndex
1b610 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 29  ->zName, pIndex)
1b620 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
1b630 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
1b640 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61  pIndex );  /* Ma
1b650 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
1b660 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73  ailed */.      s
1b670 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
1b680 62 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  b);.      goto e
1b690 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1b6a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
1b6b0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
1b6c0 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
1b6d0 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21     if( pTblName!
1b6e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  =0 ){.      pInd
1b6f0 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69  ex->tnum = db->i
1b700 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20  nit.newTnum;.   
1b710 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
1b720 74 68 69 73 20 69 73 20 74 68 65 20 69 6e 69 74  this is the init
1b730 69 61 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58  ial CREATE INDEX
1b740 20 73 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 43   statement (or C
1b750 52 45 41 54 45 20 54 41 42 4c 45 20 69 66 20 74  REATE TABLE if t
1b760 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 73  he.  ** index is
1b770 20 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65   an implied inde
1b780 78 20 66 6f 72 20 61 20 55 4e 49 51 55 45 20 6f  x for a UNIQUE o
1b790 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
1b7a0 6e 73 74 72 61 69 6e 74 29 20 74 68 65 6e 0a 20  nstraint) then. 
1b7b0 20 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20 74 6f   ** emit code to
1b7c0 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e   allocate the in
1b7d0 64 65 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20  dex rootpage on 
1b7e0 64 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e  disk and make an
1b7f0 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
1b800 74 68 65 20 69 6e 64 65 78 20 69 6e 20 74 68 65  the index in the
1b810 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
1b820 61 62 6c 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  able and populat
1b830 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  e the index with
1b840 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20  .  ** content.  
1b850 42 75 74 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74  But, do not do t
1b860 68 69 73 20 69 66 20 77 65 20 61 72 65 20 73 69  his if we are si
1b870 6d 70 6c 79 20 72 65 61 64 69 6e 67 20 74 68 65  mply reading the
1b880 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20   sqlite_master. 
1b890 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 70 61 72   ** table to par
1b8a0 73 65 20 74 68 65 20 73 63 68 65 6d 61 2c 20 6f  se the schema, o
1b8b0 72 20 69 66 20 74 68 69 73 20 69 6e 64 65 78 20  r if this index 
1b8c0 69 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  is the PRIMARY K
1b8d0 45 59 20 69 6e 64 65 78 0a 20 20 2a 2a 20 6f 66  EY index.  ** of
1b8e0 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
1b8f0 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a   table..  **.  *
1b900 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  * If pTblName==0
1b910 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69   it means this i
1b920 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65  ndex is generate
1b930 64 20 61 73 20 61 6e 20 69 6d 70 6c 69 65 64 20  d as an implied 
1b940 50 52 49 4d 41 52 59 20 4b 45 59 0a 20 20 2a 2a  PRIMARY KEY.  **
1b950 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78   or UNIQUE index
1b960 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
1b970 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
1b980 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
1b990 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
1b9a0 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
1b9b0 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
1b9c0 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
1b9d0 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
1b9e0 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
1b9f0 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
1ba00 65 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70  e if( HasRowid(p
1ba10 54 61 62 29 20 7c 7c 20 70 54 62 6c 4e 61 6d 65  Tab) || pTblName
1ba20 21 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20  !=0 ){.    Vdbe 
1ba30 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  *v;.    char *zS
1ba40 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65  tmt;.    int iMe
1ba50 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
1ba60 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c  em;..    v = sql
1ba70 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1ba80 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
1ba90 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
1baa0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20  eate_index;..   
1bab0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1bac0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1bad0 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 20 20  se, 1, iDb);..  
1bae0 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
1baf0 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65  rootpage for the
1bb00 20 69 6e 64 65 78 20 75 73 69 6e 67 20 43 72 65   index using Cre
1bb10 61 74 65 49 6e 64 65 78 2e 20 42 75 74 20 62 65  ateIndex. But be
1bb20 66 6f 72 65 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  fore.    ** doin
1bb30 67 20 73 6f 2c 20 63 6f 64 65 20 61 20 4e 6f 6f  g so, code a Noo
1bb40 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e  p instruction an
1bb50 64 20 73 74 6f 72 65 20 69 74 73 20 61 64 64 72  d store its addr
1bb60 65 73 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 49  ess in .    ** I
1bb70 6e 64 65 78 2e 74 6e 75 6d 2e 20 54 68 69 73 20  ndex.tnum. This 
1bb80 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63  is required in c
1bb90 61 73 65 20 74 68 69 73 20 69 6e 64 65 78 20 69  ase this index i
1bba0 73 20 61 63 74 75 61 6c 6c 79 20 61 20 0a 20 20  s actually a .  
1bbb0 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    ** PRIMARY KEY
1bbc0 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 69   and the table i
1bbd0 73 20 61 63 74 75 61 6c 6c 79 20 61 20 57 49 54  s actually a WIT
1bbe0 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
1bbf0 2e 20 49 6e 20 0a 20 20 20 20 2a 2a 20 74 68 61  . In .    ** tha
1bc00 74 20 63 61 73 65 20 74 68 65 20 63 6f 6e 76 65  t case the conve
1bc10 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64  rtToWithoutRowid
1bc20 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 20  Table() routine 
1bc30 77 69 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20 20  will replace.   
1bc40 20 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69 74   ** the Noop wit
1bc50 68 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70  h a Goto to jump
1bc60 20 6f 76 65 72 20 74 68 65 20 56 44 42 45 20 63   over the VDBE c
1bc70 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 65  ode generated be
1bc80 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 70 49 6e 64  low. */.    pInd
1bc90 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69 74  ex->tnum = sqlit
1bca0 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
1bcb0 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 73 71  OP_Noop);.    sq
1bcc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1bcd0 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65  v, OP_CreateInde
1bce0 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a  x, iDb, iMem);..
1bcf0 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68      /* Gather th
1bd00 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
1bd10 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49 4e  of the CREATE IN
1bd20 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  DEX statement in
1bd30 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53  to.    ** the zS
1bd40 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20  tmt variable.   
1bd50 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61   */.    if( pSta
1bd60 72 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rt ){.      int 
1bd70 6e 20 3d 20 28 69 6e 74 29 28 70 50 61 72 73 65  n = (int)(pParse
1bd80 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d  ->sLastToken.z -
1bd90 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61   pName->z) + pPa
1bda0 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e  rse->sLastToken.
1bdb0 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61  n;.      if( pNa
1bdc0 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20  me->z[n-1]==';' 
1bdd0 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a 20  ) n--;.      /* 
1bde0 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69  A named index wi
1bdf0 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43  th an explicit C
1be00 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
1be10 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a  ement */.      z
1be20 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
1be30 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54  rintf(db, "CREAT
1be40 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c  E%s INDEX %.*s",
1be50 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72  .        onError
1be60 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a  ==OE_None ? "" :
1be70 20 22 20 55 4e 49 51 55 45 22 2c 20 6e 2c 20 70   " UNIQUE", n, p
1be80 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65  Name->z);.    }e
1be90 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
1bea0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
1beb0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52   created by a PR
1bec0 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
1bed0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  QUE constraint *
1bee0 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74  /.      /* zStmt
1bef0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
1bf00 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20  f(""); */.      
1bf10 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  zStmt = 0;.    }
1bf20 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20  ..    /* Add an 
1bf30 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f  entry in sqlite_
1bf40 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20  master for this 
1bf50 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20  index.    */.   
1bf60 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
1bf70 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
1bf80 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
1bf90 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27  O %Q.%s VALUES('
1bfa0 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64  index',%Q,%Q,#%d
1bfb0 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20  ,%Q);",.        
1bfc0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
1bfd0 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  SName, MASTER_NA
1bfe0 4d 45 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64  ME,.        pInd
1bff0 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ex->zName,.     
1c000 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a     pTab->zName,.
1c010 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20          iMem,.  
1c020 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20        zStmt.    
1c030 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
1c040 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b  Free(db, zStmt);
1c050 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68  ..    /* Fill th
1c060 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61 74  e index with dat
1c070 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74 68  a and reparse th
1c080 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61  e schema. Code a
1c090 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20  n OP_Expire.    
1c0a0 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ** to invalidate
1c0b0 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65   all pre-compile
1c0c0 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
1c0d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 62    */.    if( pTb
1c0e0 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73  lName ){.      s
1c0f0 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
1c100 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
1c110 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73  , iMem);.      s
1c120 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
1c130 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
1c140 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1c150 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61  beAddParseSchema
1c160 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20  Op(v, iDb,.     
1c170 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
1c180 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71  tf(db, "name='%q
1c190 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65  ' AND type='inde
1c1a0 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  x'", pIndex->zNa
1c1b0 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  me));.      sqli
1c1c0 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
1c1d0 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20 20 20   OP_Expire);.   
1c1e0 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56   }..    sqlite3V
1c1f0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
1c200 49 6e 64 65 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20  Index->tnum);.  
1c210 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64  }..  /* When add
1c220 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ing an index to 
1c230 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69  the list of indi
1c240 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c  ces for a table,
1c250 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20   make.  ** sure 
1c260 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65  all indices labe
1c270 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63  led OE_Replace c
1c280 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68  ome after all th
1c290 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a  ose labeled.  **
1c2a0 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69   OE_Ignore.  Thi
1c2b0 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66  s is necessary f
1c2c0 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 63  or the correct c
1c2d0 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a  onstraint check.
1c2e0 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
1c2f0 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72  (in sqlite3Gener
1c300 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65  ateConstraintChe
1c310 63 6b 73 28 29 29 20 61 73 20 70 61 72 74 20 6f  cks()) as part o
1c320 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e  f.  ** UPDATE an
1c330 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  d INSERT stateme
1c340 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66  nts.  .  */.  if
1c350 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
1c360 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29  || pTblName==0 )
1c370 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f  {.    if( onErro
1c380 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c  r!=OE_Replace ||
1c390 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30   pTab->pIndex==0
1c3a0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61  .         || pTa
1c3b0 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  b->pIndex->onErr
1c3c0 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b  or==OE_Replace){
1c3d0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
1c3e0 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
1c3f0 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  dex;.      pTab-
1c400 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
1c410 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c420 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72     Index *pOther
1c430 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
1c440 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f  .      while( pO
1c450 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70  ther->pNext && p
1c460 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e  Other->pNext->on
1c470 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
1c480 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74  e ){.        pOt
1c490 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  her = pOther->pN
1c4a0 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
1c4b0 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
1c4c0 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
1c4d0 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e  ;.      pOther->
1c4e0 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a  pNext = pIndex;.
1c4f0 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
1c500 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
1c510 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20  Clean up before 
1c520 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f  exiting */.exit_
1c530 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20  create_index:.  
1c540 69 66 28 20 70 49 6e 64 65 78 20 29 20 66 72 65  if( pIndex ) fre
1c550 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  eIndex(db, pInde
1c560 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  x);.  sqlite3Exp
1c570 72 44 65 6c 65 74 65 28 64 62 2c 20 70 50 49 57  rDelete(db, pPIW
1c580 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  here);.  sqlite3
1c590 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
1c5a0 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c  b, pList);.  sql
1c5b0 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
1c5c0 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b  e(db, pTblName);
1c5d0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1c5e0 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, zName);.}..
1c5f0 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49  /*.** Fill the I
1c600 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20  ndex.aiRowEst[] 
1c610 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61 75  array with defau
1c620 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  lt information -
1c630 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
1c640 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20  to be used when 
1c650 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20  we have not run 
1c660 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d  the ANALYZE comm
1c670 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77  and..**.** aiRow
1c680 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73  Est[0] is suppos
1c690 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ed to contain th
1c6a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
1c6b0 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ents in the inde
1c6c0 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64  x..** Since we d
1c6d0 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73  o not know, gues
1c6e0 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69  s 1 million.  ai
1c6f0 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20  RowEst[1] is an 
1c700 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a  estimate of the.
1c710 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
1c720 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74  s in the table t
1c730 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61  hat match any pa
1c740 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f  rticular value o
1c750 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63  f the.** first c
1c760 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
1c770 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d  ex.  aiRowEst[2]
1c780 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
1c790 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  of the number.**
1c7a0 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61   of rows that ma
1c7b0 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c  tch any particul
1c7c0 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ar combination o
1c7d0 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63 6f  f the first 2 co
1c7e0 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20  lumns.** of the 
1c7f0 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66  index.  And so f
1c800 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61  orth.  It must a
1c810 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61 73  lways be the cas
1c820 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20  e that.*.**     
1c830 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e        aiRowEst[N
1c840 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d  ]<=aiRowEst[N-1]
1c850 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69  .**           ai
1c860 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a  RowEst[N]>=1.**.
1c870 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68  ** Apart from th
1c880 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74  at, we have litt
1c890 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69  le to go on besi
1c8a0 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73  des intuition as
1c8b0 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77   to.** how aiRow
1c8c0 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  Est[] should be 
1c8d0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68  initialized.  Th
1c8e0 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61  e numbers genera
1c8f0 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20  ted here.** are 
1c900 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c  based on typical
1c910 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e   values found in
1c920 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e   actual indices.
1c930 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c940 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e  DefaultRowEst(In
1c950 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a  dex *pIdx){.  /*
1c960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c970 31 30 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c 20  10,  9,  8,  7, 
1c980 20 36 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61   6 */.  LogEst a
1c990 56 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32  Val[] = { 33, 32
1c9a0 2c 20 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a  , 30, 28, 26 };.
1c9b0 20 20 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70 49    LogEst *a = pI
1c9c0 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b  dx->aiRowLogEst;
1c9d0 0a 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d  .  int nCopy = M
1c9e0 49 4e 28 41 72 72 61 79 53 69 7a 65 28 61 56 61  IN(ArraySize(aVa
1c9f0 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  l), pIdx->nKeyCo
1ca00 6c 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  l);.  int i;..  
1ca10 2f 2a 20 49 6e 64 65 78 65 73 20 77 69 74 68 20  /* Indexes with 
1ca20 64 65 66 61 75 6c 74 20 72 6f 77 20 65 73 74 69  default row esti
1ca30 6d 61 74 65 73 20 73 68 6f 75 6c 64 20 6e 6f 74  mates should not
1ca40 20 68 61 76 65 20 73 74 61 74 31 20 64 61 74 61   have stat1 data
1ca50 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
1ca60 49 64 78 2d 3e 68 61 73 53 74 61 74 31 20 29 3b  Idx->hasStat1 );
1ca70 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66  ..  /* Set the f
1ca80 69 72 73 74 20 65 6e 74 72 79 20 28 6e 75 6d 62  irst entry (numb
1ca90 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
1caa0 65 20 69 6e 64 65 78 29 20 74 6f 20 74 68 65 20  e index) to the 
1cab0 65 73 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20  estimated .  ** 
1cac0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
1cad0 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 6f 72 20  n the table, or 
1cae0 68 61 6c 66 20 74 68 65 20 6e 75 6d 62 65 72 20  half the number 
1caf0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
1cb00 61 62 6c 65 0a 20 20 2a 2a 20 66 6f 72 20 61 20  able.  ** for a 
1cb10 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 20 20  partial index.  
1cb20 20 42 75 74 20 64 6f 20 6e 6f 74 20 6c 65 74 20   But do not let 
1cb30 74 68 65 20 65 73 74 69 6d 61 74 65 20 64 72 6f  the estimate dro
1cb40 70 20 62 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a 20  p below 10. */. 
1cb50 20 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54   a[0] = pIdx->pT
1cb60 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  able->nRowLogEst
1cb70 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50  ;.  if( pIdx->pP
1cb80 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 29  artIdxWhere!=0 )
1cb90 20 61 5b 30 5d 20 2d 3d 20 31 30 3b 20 20 61 73   a[0] -= 10;  as
1cba0 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65  sert( 10==sqlite
1cbb0 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20  3LogEst(2) );.  
1cbc0 69 66 28 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b  if( a[0]<33 ) a[
1cbd0 30 5d 20 3d 20 33 33 3b 20 20 20 20 20 20 20 20  0] = 33;        
1cbe0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1cbf0 28 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 33==sqlite3Log
1cc00 45 73 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a  Est(10) );..  /*
1cc10 20 45 73 74 69 6d 61 74 65 20 74 68 61 74 20 61   Estimate that a
1cc20 5b 31 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d 20  [1] is 10, a[2] 
1cc30 69 73 20 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c  is 9, a[3] is 8,
1cc40 20 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d   a[4] is 7, a[5]
1cc50 20 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65   is.  ** 6 and e
1cc60 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 76  ach subsequent v
1cc70 61 6c 75 65 20 28 69 66 20 61 6e 79 29 20 69 73  alue (if any) is
1cc80 20 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79   5.  */.  memcpy
1cc90 28 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43  (&a[1], aVal, nC
1cca0 6f 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73  opy*sizeof(LogEs
1ccb0 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f  t));.  for(i=nCo
1ccc0 70 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e  py+1; i<=pIdx->n
1ccd0 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  KeyCol; i++){.  
1cce0 20 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20    a[i] = 23;    
1ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd00 61 73 73 65 72 74 28 20 32 33 3d 3d 73 71 6c 69  assert( 23==sqli
1cd10 74 65 33 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a  te3LogEst(5) );.
1cd20 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30    }..  assert( 0
1cd30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
1cd40 31 29 20 29 3b 0a 20 20 69 66 28 20 49 73 55 6e  1) );.  if( IsUn
1cd50 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20  iqueIndex(pIdx) 
1cd60 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ) a[pIdx->nKeyCo
1cd70 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  l] = 0;.}../*.**
1cd80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
1cd90 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74  ll drop an exist
1cda0 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e  ing named index.
1cdb0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
1cdc0 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  * implements the
1cdd0 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74   DROP INDEX stat
1cde0 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
1cdf0 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28  qlite3DropIndex(
1ce00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1ce10 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69  rcList *pName, i
1ce20 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20  nt ifExists){.  
1ce30 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
1ce40 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
1ce50 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1ce60 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
1ce70 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1ce80 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20  se->nErr==0 );  
1ce90 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64   /* Never called
1cea0 20 77 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f   with prior erro
1ceb0 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  rs */.  if( db->
1cec0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1ced0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1cee0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
1cef0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e  assert( pName->n
1cf00 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  Src==1 );.  if( 
1cf10 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
1cf20 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
1cf30 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  rse) ){.    goto
1cf40 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1cf50 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
1cf60 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
1cf70 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  x(db, pName->a[0
1cf80 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
1cf90 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
1cfa0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
1cfb0 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45   ){.    if( !ifE
1cfc0 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73  xists ){.      s
1cfd0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1cfe0 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
1cff0 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d  index: %S", pNam
1d000 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e, 0);.    }else
1d010 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
1d020 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
1d030 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61  hema(pParse, pNa
1d040 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
1d050 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  se);.    }.    p
1d060 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
1d070 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  ma = 1;.    goto
1d080 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1d090 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64  ;.  }.  if( pInd
1d0a0 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c  ex->idxType!=SQL
1d0b0 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44  ITE_IDXTYPE_APPD
1d0c0 45 46 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  EF ){.    sqlite
1d0d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1d0e0 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61  , "index associa
1d0f0 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20  ted with UNIQUE 
1d100 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d  ".      "or PRIM
1d110 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
1d120 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f  nt cannot be dro
1d130 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67  pped", 0);.    g
1d140 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1d150 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  dex;.  }.  iDb =
1d160 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
1d170 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
1d180 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e  ->pSchema);.#ifn
1d190 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d1a0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
1d1b0 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d  {.    int code =
1d1c0 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44   SQLITE_DROP_IND
1d1d0 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  EX;.    Table *p
1d1e0 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
1d1f0 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  able;.    const 
1d200 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
1d210 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
1d220 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
1d230 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
1d240 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
1d250 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1d260 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1d270 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
1d280 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  b, 0, zDb) ){.  
1d290 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1d2a0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
1d2b0 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
1d2c0 4d 50 44 42 20 26 26 20 69 44 62 20 29 20 63 6f  MPDB && iDb ) co
1d2d0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
1d2e0 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
1d2f0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1d300 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
1d310 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  de, pIndex->zNam
1d320 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
1d330 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
1d340 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1d350 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
1d360 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
1d370 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
1d380 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  ve the index and
1d390 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
1d3a0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20   table */.  v = 
1d3b0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1d3c0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
1d3d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
1d3e0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
1d3f0 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
1d400 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  );.    sqlite3Ne
1d410 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
1d420 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  ,.       "DELETE
1d430 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
1d440 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79  E name=%Q AND ty
1d450 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20 20  pe='index'",.   
1d460 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
1d470 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45  .zDbSName, MASTE
1d480 52 5f 4e 41 4d 45 2c 20 70 49 6e 64 65 78 2d 3e  R_NAME, pIndex->
1d490 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20  zName.    );.   
1d4a0 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61   sqlite3ClearSta
1d4b0 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20  tTables(pParse, 
1d4c0 69 44 62 2c 20 22 69 64 78 22 2c 20 70 49 6e 64  iDb, "idx", pInd
1d4d0 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ex->zName);.    
1d4e0 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
1d4f0 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
1d500 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  ;.    destroyRoo
1d510 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
1d520 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  ndex->tnum, iDb)
1d530 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1d540 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72  eAddOp4(v, OP_Dr
1d550 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c  opIndex, iDb, 0,
1d560 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d   0, pIndex->zNam
1d570 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74  e, 0);.  }..exit
1d580 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73  _drop_index:.  s
1d590 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
1d5a0 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ete(db, pName);.
1d5b0 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20  }../*.** pArray 
1d5c0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1d5d0 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65  an array of obje
1d5e0 63 74 73 2e 20 45 61 63 68 20 6f 62 6a 65 63 74  cts. Each object
1d5f0 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79   in the.** array
1d600 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65   is szEntry byte
1d610 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 69 73 20  s in size. This 
1d620 72 6f 75 74 69 6e 65 20 75 73 65 73 20 73 71 6c  routine uses sql
1d630 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a  ite3DbRealloc().
1d640 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65  ** to extend the
1d650 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20 74   array so that t
1d660 68 65 72 65 20 69 73 20 73 70 61 63 65 20 66 6f  here is space fo
1d670 72 20 61 20 6e 65 77 20 6f 62 6a 65 63 74 20 61  r a new object a
1d680 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a  t the end..**.**
1d690 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
1d6a0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a  ion is called, *
1d6b0 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73  pnEntry contains
1d6c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
1d6d0 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72 72 61  e of.** the arra
1d6e0 79 20 28 69 6e 20 65 6e 74 72 69 65 73 20 2d 20  y (in entries - 
1d6f0 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  so the allocatio
1d700 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74 72 79 29  n is ((*pnEntry)
1d710 20 2a 20 73 7a 45 6e 74 72 79 29 20 62 79 74 65   * szEntry) byte
1d720 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a  s.** in total)..
1d730 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 61  **.** If the rea
1d740 6c 6c 6f 63 28 29 20 69 73 20 73 75 63 63 65 73  lloc() is succes
1d750 73 66 75 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f  sful (i.e. if no
1d760 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f   OOM condition o
1d770 63 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73  ccurs), the.** s
1d780 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
1d790 6f 72 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  or the new objec
1d7a0 74 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e  t is zeroed, *pn
1d7b0 45 6e 74 72 79 20 75 70 64 61 74 65 64 20 74 6f  Entry updated to
1d7c0 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 65 20  .** reflect the 
1d7d0 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20  new size of the 
1d7e0 61 72 72 61 79 20 61 6e 64 20 61 20 70 6f 69 6e  array and a poin
1d7f0 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 61  ter to the new a
1d800 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74  llocation.** ret
1d810 75 72 6e 65 64 2e 20 2a 70 49 64 78 20 69 73 20  urned. *pIdx is 
1d820 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
1d830 20 6f 66 20 74 68 65 20 6e 65 77 20 61 72 72 61   of the new arra
1d840 79 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20  y entry in this 
1d850 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  case..**.** Othe
1d860 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 72 65  rwise, if the re
1d870 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a  alloc() fails, *
1d880 70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 2d  pIdx is set to -
1d890 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61  1, *pnEntry rema
1d8a0 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  ins.** unchanged
1d8b0 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 70   and a copy of p
1d8c0 41 72 72 61 79 20 72 65 74 75 72 6e 65 64 2e 0a  Array returned..
1d8d0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
1d8e0 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
1d8f0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1d900 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1d910 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61   to notify of ma
1d920 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f  lloc failures */
1d930 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c  .  void *pArray,
1d940 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
1d950 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74   objects.  Might
1d960 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20   be reallocated 
1d970 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79  */.  int szEntry
1d980 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  ,      /* Size o
1d990 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e  f each object in
1d9a0 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20   the array */.  
1d9b0 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20  int *pnEntry,   
1d9c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
1d9d0 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79  bjects currently
1d9e0 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74   in use */.  int
1d9f0 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f   *pIdx         /
1da00 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65  * Write the inde
1da10 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20  x of a new slot 
1da20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  here */.){.  cha
1da30 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  r *z;.  int n = 
1da40 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28 20  *pnEntry;.  if( 
1da50 28 6e 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29  (n & (n-1))==0 )
1da60 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 28  {.    int sz = (
1da70 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b  n==0) ? 1 : 2*n;
1da80 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20  .    void *pNew 
1da90 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
1daa0 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20 73  oc(db, pArray, s
1dab0 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20  z*szEntry);.    
1dac0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
1dad0 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b       *pIdx = -1;
1dae0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41  .      return pA
1daf0 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rray;.    }.    
1db00 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20  pArray = pNew;. 
1db10 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29   }.  z = (char*)
1db20 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74  pArray;.  memset
1db30 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d  (&z[n * szEntry]
1db40 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20  , 0, szEntry);. 
1db50 20 2a 70 49 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b   *pIdx = n;.  ++
1db60 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75  *pnEntry;.  retu
1db70 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a  rn pArray;.}../*
1db80 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
1db90 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
1dba0 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43  given IdList.  C
1dbb0 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69  reate a new IdLi
1dbc0 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
1dbd0 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64  ..**.** A new Id
1dbe0 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
1dbf0 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
1dc00 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
1dc10 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
1dc20 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69  dListAppend(sqli
1dc30 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
1dc40 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
1dc50 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  Token){.  int i;
1dc60 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1dc70 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
1dc80 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1dc90 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64  ro(db, sizeof(Id
1dca0 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
1dcb0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1dcc0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
1dcd0 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72  t->a = sqlite3Ar
1dce0 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
1dcf0 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69     db,.      pLi
1dd00 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a  st->a,.      siz
1dd10 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
1dd20 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e  ,.      &pList->
1dd30 6e 49 64 2c 0a 20 20 20 20 20 20 26 69 0a 20 20  nId,.      &i.  
1dd40 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  );.  if( i<0 ){.
1dd50 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
1dd60 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
1dd70 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
1dd80 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61  ;.  }.  pList->a
1dd90 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
1dda0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1ddb0 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  (db, pToken);.  
1ddc0 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
1ddd0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
1dde0 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64   IdList..*/.void
1ddf0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1de00 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
1de10 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29  , IdList *pList)
1de20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1de30 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1de40 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
1de50 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
1de60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
1de70 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
1de80 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  a[i].zName);.  }
1de90 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1dea0 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a  (db, pList->a);.
1deb0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
1dec0 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  N(db, pList);.}.
1ded0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1dee0 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  e index in pList
1def0 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69   of the identifi
1df00 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52  er named zId.  R
1df10 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e  eturn -1.** if n
1df20 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  ot found..*/.int
1df30 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
1df40 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  dex(IdList *pLis
1df50 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
1df60 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
1df70 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1df80 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f   return -1;.  fo
1df90 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1dfa0 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nId; i++){.    i
1dfb0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1dfc0 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
1dfd0 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
1dfe0 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
1dff0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
1e000 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20  *.** Expand the 
1e010 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
1e020 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 72  for the given Sr
1e030 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a  cList object by.
1e040 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74  ** creating nExt
1e050 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67  ra new slots beg
1e060 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74  inning at iStart
1e070 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65 72  .  iStart is zer
1e080 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20  o based..** New 
1e090 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64  slots are zeroed
1e0a0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1e0b0 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53  ple, suppose a S
1e0c0 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79  rcList initially
1e0d0 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e   contains two en
1e0e0 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54  tries: A,B..** T
1e0f0 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65  o append 3 new e
1e100 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20  ntries onto the 
1e110 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a  end, do this:.**
1e120 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72  .**    sqlite3Sr
1e130 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
1e140 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29   pSrclist, 3, 2)
1e150 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ;.**.** After th
1e160 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20  e call above it 
1e170 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20  would contain:  
1e180 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20  A, B, nil, nil, 
1e190 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69  nil..** If the i
1e1a0 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68  Start argument h
1e1b0 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61  ad been 1 instea
1e1c0 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65  d of 2, then the
1e1d0 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64   result.** would
1e1e0 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20   have been:  A, 
1e1f0 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42  nil, nil, nil, B
1e200 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68  .  To prepend th
1e210 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20  e new slots,.** 
1e220 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75 65  the iStart value
1e230 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68   would be 0.  Th
1e240 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f  e result then wo
1e250 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20  uld.** be: nil, 
1e260 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a  nil, nil, A, B..
1e270 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
1e280 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
1e290 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69  ls the SrcList i
1e2a0 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68  s unchanged.  Th
1e2b0 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  e.** db->mallocF
1e2c0 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20  ailed flag will 
1e2d0 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a  be set to true..
1e2e0 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
1e2f0 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1e300 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
1e310 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ,       /* Datab
1e320 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
1e330 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20  o notify of OOM 
1e340 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c  errors */.  SrcL
1e350 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  ist *pSrc,     /
1e360 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f  * The SrcList to
1e370 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a   be enlarged */.
1e380 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
1e390 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e3a0 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61  f new slots to a
1e3b0 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20  dd to pSrc->a[] 
1e3c0 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20  */.  int iStart 
1e3d0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1e3e0 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   in pSrc->a[] of
1e3f0 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20   first new slot 
1e400 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  */.){.  int i;..
1e410 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
1e420 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20  king on calling 
1e430 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
1e440 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d  assert( iStart>=
1e450 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
1e460 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73  Extra>=1 );.  as
1e470 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b  sert( pSrc!=0 );
1e480 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
1e490 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  t<=pSrc->nSrc );
1e4a0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1e4b0 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65  additional space
1e4c0 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
1e4d0 69 66 28 20 28 75 33 32 29 70 53 72 63 2d 3e 6e  if( (u32)pSrc->n
1e4e0 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d  Src+nExtra>pSrc-
1e4f0 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53  >nAlloc ){.    S
1e500 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
1e510 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70    int nAlloc = p
1e520 53 72 63 2d 3e 6e 53 72 63 2a 32 2b 6e 45 78 74  Src->nSrc*2+nExt
1e530 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74  ra;.    int nGot
1e540 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
1e550 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
1e560 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20  , pSrc,.        
1e570 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
1e580 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31  Src) + (nAlloc-1
1e590 29 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61  )*sizeof(pSrc->a
1e5a0 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
1e5b0 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
1e5c0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
1e5d0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1e5e0 20 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a     return pSrc;.
1e5f0 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d      }.    pSrc =
1e600 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20   pNew;.    nGot 
1e610 3d 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  = (sqlite3DbMall
1e620 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29  ocSize(db, pNew)
1e630 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29   - sizeof(*pSrc)
1e640 29 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61  )/sizeof(pSrc->a
1e650 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63  [0])+1;.    pSrc
1e660 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74 3b  ->nAlloc = nGot;
1e670 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  .  }..  /* Move 
1e680 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74  existing slots t
1e690 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74  hat come after t
1e6a0 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65  he newly inserte
1e6b0 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74  d slots.  ** out
1e6c0 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20   of the way */. 
1e6d0 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
1e6e0 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20  c-1; i>=iStart; 
1e6f0 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e  i--){.    pSrc->
1e700 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53  a[i+nExtra] = pS
1e710 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  rc->a[i];.  }.  
1e720 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45  pSrc->nSrc += nE
1e730 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f  xtra;..  /* Zero
1e740 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63   the newly alloc
1e750 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20  ated slots */.  
1e760 6d 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b  memset(&pSrc->a[
1e770 69 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65  iStart], 0, size
1e780 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e  of(pSrc->a[0])*n
1e790 45 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d  Extra);.  for(i=
1e7a0 69 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74  iStart; i<iStart
1e7b0 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20  +nExtra; i++){. 
1e7c0 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43     pSrc->a[i].iC
1e7d0 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a  ursor = -1;.  }.
1e7e0 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  .  /* Return a p
1e7f0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e  ointer to the en
1e800 6c 61 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a  larged SrcList *
1e810 2f 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b  /.  return pSrc;
1e820 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  .}.../*.** Appen
1e830 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  d a new table na
1e840 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  me to the given 
1e850 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65  SrcList.  Create
1e860 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
1e870 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41  f.** need be.  A
1e880 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72   new entry is cr
1e890 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63  eated in the Src
1e8a0 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 61  List even if pTa
1e8b0 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  ble is NULL..**.
1e8c0 2a 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73 20  ** A SrcList is 
1e8d0 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
1e8e0 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  L if there is an
1e8f0 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68 65   OOM error.  The
1e900 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63   returned.** Src
1e910 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 74 68  List might be th
1e920 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 53 72  e same as the Sr
1e930 63 4c 69 73 74 20 74 68 61 74 20 77 61 73 20 69  cList that was i
1e940 6e 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74  nput or it might
1e950 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65   be.** a new one
1e960 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  .  If an OOM err
1e970 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20  or does occurs, 
1e980 74 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76  then the prior v
1e990 61 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a  alue of pList.**
1e9a0 20 74 68 61 74 20 69 73 20 69 6e 70 75 74 20 74   that is input t
1e9b0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
1e9c0 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
1e9d0 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  freed..**.** If 
1e9e0 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74  pDatabase is not
1e9f0 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20   null, it means 
1ea00 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68  that the table h
1ea10 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a  as an optional.*
1ea20 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * database name 
1ea30 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68  prefix.  Like th
1ea40 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74  is:  "database.t
1ea50 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74  able".  The pDat
1ea60 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20  abase.** points 
1ea70 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  to the table nam
1ea80 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65  e and the pTable
1ea90 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64   points to the d
1eaa0 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a  atabase name..**
1eab0 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d   The SrcList.a[]
1eac0 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20  .zName field is 
1ead0 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
1eae0 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68  table name which
1eaf0 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66   might.** come f
1eb00 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70  rom pTable (if p
1eb10 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c  Database is NULL
1eb20 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62  ) or from pDatab
1eb30 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73  ase.  .** SrcLis
1eb40 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20  t.a[].zDatabase 
1eb50 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
1eb60 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
1eb70 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a   from pTable,.**
1eb80 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66   or with NULL if
1eb90 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20   no database is 
1eba0 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
1ebb0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1ebc0 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68   if call like th
1ebd0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
1ebe0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1ebf0 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b  Append(D,A,B,0);
1ec00 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73  .**.** Then B is
1ec10 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   a table name an
1ec20 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  d the database n
1ec30 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69  ame is unspecifi
1ec40 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a  ed.  If called.*
1ec50 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  * like this:.**.
1ec60 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
1ec70 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1ec80 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,B,C);.**.** 
1ec90 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61  Then C is the ta
1eca0 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69  ble name and B i
1ecb0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  s the database n
1ecc0 61 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64 65  ame.  If C is de
1ecd0 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f  fined.** then so
1ece0 20 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72   is B.  In other
1ecf0 20 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72   words, we never
1ed00 20 68 61 76 65 20 61 20 63 61 73 65 20 77 68 65   have a case whe
1ed10 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
1ed20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1ed30 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b  Append(D,A,0,C);
1ed40 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62  .**.** Both pTab
1ed50 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65  le and pDatabase
1ed60 20 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20   are assumed to 
1ed70 62 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79  be quoted.  They
1ed80 20 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a   are dequoted.**
1ed90 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64   before being ad
1eda0 64 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69  ded to the SrcLi
1edb0 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  st..*/.SrcList *
1edc0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1edd0 70 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20  pend(.  sqlite3 
1ede0 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  *db,        /* C
1edf0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74  onnection to not
1ee00 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61  ify of malloc fa
1ee10 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c  ilures */.  SrcL
1ee20 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
1ee30 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69  /* Append to thi
1ee40 73 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20  s SrcList. NULL 
1ee50 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 53 72  creates a new Sr
1ee60 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  cList */.  Token
1ee70 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f   *pTable,      /
1ee80 2a 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e  * Table to appen
1ee90 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44  d */.  Token *pD
1eea0 61 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61  atabase    /* Da
1eeb0 74 61 62 61 73 65 20 6f 66 20 74 68 65 20 74 61  tabase of the ta
1eec0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ble */.){.  stru
1eed0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1eee0 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74  *pItem;.  assert
1eef0 28 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20 7c  ( pDatabase==0 |
1ef00 7c 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20 20  | pTable!=0 );  
1ef10 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 43  /* Cannot have C
1ef20 20 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20   without B */.  
1ef30 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
1ef40 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1ef50 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
1ef60 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
1ef70 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 53  wNN(db, sizeof(S
1ef80 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  rcList) );.    i
1ef90 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1efa0 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
1efb0 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20  t->nAlloc = 1;. 
1efc0 20 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 3d     pList->nSrc =
1efd0 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   1;.    memset(&
1efe0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2c 20 30 2c 20  pList->a[0], 0, 
1eff0 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
1f000 30 5d 29 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d  0]));.    pList-
1f010 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20  >a[0].iCursor = 
1f020 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
1f030 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1f040 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
1f050 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69  b, pList, 1, pLi
1f060 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 7d 0a 20  st->nSrc);.  }. 
1f070 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1f080 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
1f090 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
1f0a0 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
1f0b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1f0c0 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
1f0d0 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d  ->a[pList->nSrc-
1f0e0 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62  1];.  if( pDatab
1f0f0 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65  ase && pDatabase
1f100 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  ->z==0 ){.    pD
1f110 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
1f120 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
1f130 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   ){.    pItem->z
1f140 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1f150 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1f160 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  pDatabase);.    
1f170 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
1f180 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1f190 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62  omToken(db, pTab
1f1a0 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  le);.  }else{.  
1f1b0 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
1f1c0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1f1d0 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65  Token(db, pTable
1f1e0 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44  );.    pItem->zD
1f1f0 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
1f200 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
1f210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
1f220 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65   VdbeCursor inde
1f230 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c  x numbers to all
1f240 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63   tables in a Src
1f250 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  List.*/.void sql
1f260 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
1f270 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a  nCursors(Parse *
1f280 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
1f290 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1f2a0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1f2b0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1f2c0 20 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c    assert(pList |
1f2d0 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
1f2e0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1f2f0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
1f300 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
1f310 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73  pList->a; i<pLis
1f320 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
1f330 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  tem++){.      if
1f340 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ( pItem->iCursor
1f350 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  >=0 ) break;.   
1f360 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f     pItem->iCurso
1f370 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
1f380 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ++;.      if( pI
1f390 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
1f3a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1f3b0 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
1f3c0 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65  ors(pParse, pIte
1f3d0 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  m->pSelect->pSrc
1f3e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1f3f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
1f400 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53  lete an entire S
1f410 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67  rcList including
1f420 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75   all its substru
1f430 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cture..*/.void s
1f440 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
1f450 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
1f460 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
1f470 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
1f480 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1f490 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
1f4a0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1f4b0 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
1f4c0 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
1f4d0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1f4e0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
1f4f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1f500 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
1f510 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
1f520 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
1f530 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
1f540 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1f550 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
1f560 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
1f570 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 73  .isIndexedBy ) s
1f580 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1f590 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65   pItem->u1.zInde
1f5a0 78 65 64 42 79 29 3b 0a 20 20 20 20 69 66 28 20  xedBy);.    if( 
1f5b0 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pItem->fg.isTabF
1f5c0 75 6e 63 20 29 20 73 71 6c 69 74 65 33 45 78 70  unc ) sqlite3Exp
1f5d0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
1f5e0 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  pItem->u1.pFuncA
1f5f0 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
1f600 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
1f610 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  pItem->pTab);.  
1f620 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1f630 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
1f640 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  >pSelect);.    s
1f650 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1f660 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29  (db, pItem->pOn)
1f670 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  ;.    sqlite3IdL
1f680 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  istDelete(db, pI
1f690 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
1f6a0 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
1f6b0 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  eNN(db, pList);.
1f6c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1f6d0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1f6e0 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f  by the parser to
1f6f0 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20   add a new term 
1f700 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
1f710 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20   a growing FROM 
1f720 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70 22  clause.  The "p"
1f730 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
1f740 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  e part of.** the
1f750 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61   FROM clause tha
1f760 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
1f770 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20  en constructed. 
1f780 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20   "p" is NULL.** 
1f790 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
1f7a0 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65  irst term of the
1f7b0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70   FROM clause.  p
1f7c0 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62  Table and pDatab
1f7d0 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e  ase.** are the n
1f7e0 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
1f7f0 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61   and database na
1f800 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
1f810 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20  clause term..** 
1f820 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
1f830 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  L if the databas
1f840 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72  e name qualifier
1f850 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68   is missing - th
1f860 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e  e.** usual case.
1f870 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 68 61    If the term ha
1f880 73 20 61 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e  s an alias, then
1f890 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74   pAlias points t
1f8a0 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74  o the.** alias t
1f8b0 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65  oken.  If the te
1f8c0 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79  rm is a subquery
1f8d0 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79  , then pSubquery
1f8e0 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43   is the.** SELEC
1f8f0 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
1f900 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e   the subquery en
1f910 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62  codes.  The pTab
1f920 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62  le and.** pDatab
1f930 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61  ase parameters a
1f940 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71  re NULL for subq
1f950 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e  ueries.  The pOn
1f960 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70   and pUsing.** p
1f970 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68  arameters are th
1f980 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
1f990 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1f9a0 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  auses..**.** Ret
1f9b0 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73  urn a new SrcLis
1f9c0 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20  t which encodes 
1f9d0 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68  is the FROM with
1f9e0 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d   the new.** term
1f9f0 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69   added..*/.SrcLi
1fa00 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
1fa10 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
1fa20 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1fa30 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
1fa40 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1fa50 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  /.  SrcList *p, 
1fa60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1fa70 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20  he left part of 
1fa80 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1fa90 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a  already seen */.
1faa0 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
1fab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1fac0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
1fad0 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f  o add to the FRO
1fae0 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f  M clause */.  To
1faf0 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20  ken *pDatabase, 
1fb00 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1fb10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
1fb20 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20  ntaining pTable 
1fb30 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69  */.  Token *pAli
1fb40 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  as,          /* 
1fb50 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
1fb60 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75  ide of the AS su
1fb70 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  bexpression */. 
1fb80 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65   Select *pSubque
1fb90 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75  ry,      /* A su
1fba0 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70  bquery used in p
1fbb0 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20  lace of a table 
1fbc0 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  name */.  Expr *
1fbd0 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pOn,            
1fbe0 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75    /* The ON clau
1fbf0 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a  se of a join */.
1fc00 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67    IdList *pUsing
1fc10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1fc20 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
1fc30 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20   a join */.){.  
1fc40 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1fc50 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
1fc60 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1fc70 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70  se->db;.  if( !p
1fc80 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69   && (pOn || pUsi
1fc90 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ng) ){.    sqlit
1fca0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1fcb0 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73  e, "a JOIN claus
1fcc0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  e is required be
1fcd0 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20  fore %s", .     
1fce0 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22   (pOn ? "ON" : "
1fcf0 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20  USING").    );. 
1fd00 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66     goto append_f
1fd10 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  rom_error;.  }. 
1fd20 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c   p = sqlite3SrcL
1fd30 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c  istAppend(db, p,
1fd40 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61   pTable, pDataba
1fd50 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  se);.  if( p==0 
1fd60 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 53 72 63  || NEVER(p->nSrc
1fd70 3d 3d 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ==0) ){.    goto
1fd80 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72   append_from_err
1fd90 6f 72 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20  or;.  }.  pItem 
1fda0 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
1fdb0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 41  1];.  assert( pA
1fdc0 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66 28  lias!=0 );.  if(
1fdd0 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20   pAlias->n ){.  
1fde0 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20    pItem->zAlias 
1fdf0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1fe00 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61  mToken(db, pAlia
1fe10 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  s);.  }.  pItem-
1fe20 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71  >pSelect = pSubq
1fe30 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70  uery;.  pItem->p
1fe40 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65  On = pOn;.  pIte
1fe50 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69  m->pUsing = pUsi
1fe60 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  ng;.  return p;.
1fe70 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  . append_from_er
1fe80 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20 70  ror:.  assert( p
1fe90 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
1fea0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1feb0 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64  On);.  sqlite3Id
1fec0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1fed0 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  Using);.  sqlite
1fee0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
1fef0 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20  , pSubquery);.  
1ff00 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1ff10 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45  ** Add an INDEXE
1ff20 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45  D BY or NOT INDE
1ff30 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68  XED clause to th
1ff40 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
1ff50 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e  added .** elemen
1ff60 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d  t of the source-
1ff70 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
1ff80 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1ff90 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
1ffa0 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65  te3SrcListIndexe
1ffb0 64 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  dBy(Parse *pPars
1ffc0 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54  e, SrcList *p, T
1ffd0 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79  oken *pIndexedBy
1ffe0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ){.  assert( pIn
1fff0 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20 20  dexedBy!=0 );.  
20000 69 66 28 20 70 20 26 26 20 41 4c 57 41 59 53 28  if( p && ALWAYS(
20010 70 2d 3e 6e 53 72 63 3e 30 29 20 29 7b 0a 20 20  p->nSrc>0) ){.  
20020 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
20030 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
20040 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
20050 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
20060 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  em->fg.notIndexe
20070 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
20080 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
20090 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a  IndexedBy==0 );.
200a0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
200b0 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m->fg.isTabFunc=
200c0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  =0 );.    if( pI
200d0 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26  ndexedBy->n==1 &
200e0 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a  & !pIndexedBy->z
200f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22   ){.      /* A "
20100 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61  NOT INDEXED" cla
20110 75 73 65 20 77 61 73 20 73 75 70 70 6c 69 65 64  use was supplied
20120 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20  . See parse.y . 
20130 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63       ** construc
20140 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20  t "indexed_opt" 
20150 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a  for details. */.
20160 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
20170 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a  notIndexed = 1;.
20180 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20190 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65   pItem->u1.zInde
201a0 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33 4e  xedBy = sqlite3N
201b0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
201c0 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65  rse->db, pIndexe
201d0 64 42 79 29 3b 0a 20 20 20 20 20 20 70 49 74 65  dBy);.      pIte
201e0 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
201f0 79 20 3d 20 28 70 49 74 65 6d 2d 3e 75 31 2e 7a  y = (pItem->u1.z
20200 49 6e 64 65 78 65 64 42 79 21 3d 30 29 3b 0a 20  IndexedBy!=0);. 
20210 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
20220 2a 20 41 64 64 20 74 68 65 20 6c 69 73 74 20 6f  * Add the list o
20230 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
20240 65 6e 74 73 20 74 6f 20 74 68 65 20 53 72 63 4c  ents to the SrcL
20250 69 73 74 20 65 6e 74 72 79 20 66 6f 72 20 61 0a  ist entry for a.
20260 2a 2a 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d  ** table-valued-
20270 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
20280 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
20290 46 75 6e 63 41 72 67 73 28 50 61 72 73 65 20 2a  FuncArgs(Parse *
202a0 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
202b0 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  *p, ExprList *pL
202c0 69 73 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ist){.  if( p ){
202d0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
202e0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
202f0 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
20300 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
20310 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64  pItem->fg.notInd
20320 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  exed==0 );.    a
20330 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
20340 2e 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20  .isIndexedBy==0 
20350 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
20360 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
20370 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74  nc==0 );.    pIt
20380 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20  em->u1.pFuncArg 
20390 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 70 49 74  = pList;.    pIt
203a0 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
203b0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
203c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
203d0 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
203e0 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d  >db, pList);.  }
203f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62  .}../*.** When b
20400 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f  uilding up a FRO
20410 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
20420 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e  parser, the join
20430 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20   operator.** is 
20440 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68  initially attach
20450 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ed to the left o
20460 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65  perand.  But the
20470 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
20480 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65 20 6a  ** expects the j
20490 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  oin operator to 
204a0 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  be on the right 
204b0 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72  operand.  This r
204c0 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73  outine.** Shifts
204d0 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74   all join operat
204e0 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  ors from left to
204f0 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e   right for an en
20500 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61  tire FROM.** cla
20510 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  use..**.** Examp
20520 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20  le: Suppose the 
20530 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69  join is like thi
20540 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
20550 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f     A natural cro
20560 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20  ss join B.**.** 
20570 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20  The operator is 
20580 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a  "natural cross j
20590 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64  oin".  The A and
205a0 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20   B operands are 
205b0 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e  stored.** in p->
205c0 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d  a[0] and p->a[1]
205d0 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
205e0 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 69 74   The parser init
205f0 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65  ially stores the
20600 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74  .** operator wit
20610 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69  h A.  This routi
20620 6e 65 20 73 68 69 66 74 73 20 74 68 61 74 20 6f  ne shifts that o
20630 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20  perator over to 
20640 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  B..*/.void sqlit
20650 65 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f  e3SrcListShiftJo
20660 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a  inType(SrcList *
20670 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
20680 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
20690 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69  r(i=p->nSrc-1; i
206a0 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
206b0 70 2d 3e 61 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74  p->a[i].fg.joint
206c0 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e  ype = p->a[i-1].
206d0 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  fg.jointype;.   
206e0 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 66   }.    p->a[0].f
206f0 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  g.jointype = 0;.
20700 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
20710 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
20720 66 6f 72 20 61 20 42 45 47 49 4e 20 73 74 61 74  for a BEGIN stat
20730 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
20740 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73  qlite3BeginTrans
20750 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
20760 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b  arse, int type){
20770 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
20780 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
20790 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   i;..  assert( p
207a0 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62  Parse!=0 );.  db
207b0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
207c0 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
207d0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
207e0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
207f0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
20800 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c  ION, "BEGIN", 0,
20810 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   0) ){.    retur
20820 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c  n;.  }.  v = sql
20830 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
20840 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20  se);.  if( !v ) 
20850 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79  return;.  if( ty
20860 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20  pe!=TK_DEFERRED 
20870 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
20880 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
20890 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
208a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54  beAddOp2(v, OP_T
208b0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28  ransaction, i, (
208c0 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49  type==TK_EXCLUSI
208d0 56 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  VE)+1);.      sq
208e0 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
208f0 65 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  ee(v, i);.    }.
20900 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
20910 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 41 75  eAddOp0(v, OP_Au
20920 74 6f 43 6f 6d 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a  toCommit);.}../*
20930 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
20940 45 20 63 6f 64 65 20 66 6f 72 20 61 20 43 4f 4d  E code for a COM
20950 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20  MIT or ROLLBACK 
20960 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 43 6f  statement..** Co
20970 64 65 20 66 6f 72 20 52 4f 4c 4c 42 41 43 4b 20  de for ROLLBACK 
20980 69 73 20 67 65 6e 65 72 61 74 65 64 20 69 66 20  is generated if 
20990 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41  eType==TK_ROLLBA
209a0 43 4b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  CK.  Otherwise.*
209b0 2a 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61  * code is genera
209c0 74 65 64 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54  ted for a COMMIT
209d0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
209e0 33 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  3EndTransaction(
209f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
20a00 6e 74 20 65 54 79 70 65 29 7b 0a 20 20 56 64 62  nt eType){.  Vdb
20a10 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 73 52 6f  e *v;.  int isRo
20a20 6c 6c 62 61 63 6b 3b 0a 0a 20 20 61 73 73 65 72  llback;..  asser
20a30 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
20a40 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
20a50 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ->db!=0 );.  ass
20a60 65 72 74 28 20 65 54 79 70 65 3d 3d 54 4b 5f 43  ert( eType==TK_C
20a70 4f 4d 4d 49 54 20 7c 7c 20 65 54 79 70 65 3d 3d  OMMIT || eType==
20a80 54 4b 5f 45 4e 44 20 7c 7c 20 65 54 79 70 65 3d  TK_END || eType=
20a90 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  =TK_ROLLBACK );.
20aa0 20 20 69 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 65    isRollback = e
20ab0 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43  Type==TK_ROLLBAC
20ac0 4b 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  K;.  if( sqlite3
20ad0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
20ae0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
20af0 54 49 4f 4e 2c 20 0a 20 20 20 20 20 20 20 69 73  TION, .       is
20b00 52 6f 6c 6c 62 61 63 6b 20 3f 20 22 52 4f 4c 4c  Rollback ? "ROLL
20b10 42 41 43 4b 22 20 3a 20 22 43 4f 4d 4d 49 54 22  BACK" : "COMMIT"
20b20 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  , 0, 0) ){.    r
20b30 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d  eturn;.  }.  v =
20b40 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
20b50 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
20b60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
20b70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20b80 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 69  AutoCommit, 1, i
20b90 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d 0a  sRollback);.  }.
20ba0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
20bb0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
20bc0 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
20bd0 68 65 6e 20 69 74 20 70 61 72 73 65 73 20 61 20  hen it parses a 
20be0 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61 74  command to creat
20bf0 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72  e,.** release or
20c00 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c   rollback an SQL
20c10 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a   savepoint. .*/.
20c20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 61 76 65  void sqlite3Save
20c30 70 6f 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61  point(Parse *pPa
20c40 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b  rse, int op, Tok
20c50 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68  en *pName){.  ch
20c60 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ar *zName = sqli
20c70 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
20c80 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
20c90 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
20ca0 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
20cb0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
20cc0 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
20cd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
20ce0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
20cf0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
20d00 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d  r * const az[] =
20d10 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52 45 4c   { "BEGIN", "REL
20d20 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b  EASE", "ROLLBACK
20d30 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  " };.    assert(
20d40 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49   !SAVEPOINT_BEGI
20d50 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52  N && SAVEPOINT_R
20d60 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53 41 56  ELEASE==1 && SAV
20d70 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d  EPOINT_ROLLBACK=
20d80 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  =2 );.#endif.   
20d90 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c 69 74   if( !v || sqlit
20da0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
20db0 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56 45 50  se, SQLITE_SAVEP
20dc0 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e  OINT, az[op], zN
20dd0 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ame, 0) ){.     
20de0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
20df0 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
20e00 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
20e10 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
20e20 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
20e30 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70  OP_Savepoint, op
20e40 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50  , 0, 0, zName, P
20e50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
20e60 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
20e70 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61  re the TEMP data
20e80 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64  base is open and
20e90 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
20ea0 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  se.  Return.** t
20eb0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
20ec0 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20  ors.  Leave any 
20ed0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
20ee0 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
20ef0 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
20f00 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
20f10 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50  tabase(Parse *pP
20f20 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
20f30 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
20f40 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62  b;.  if( db->aDb
20f50 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70  [1].pBt==0 && !p
20f60 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
20f70 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
20f80 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20    Btree *pBt;.  
20f90 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
20fa0 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20  nt flags = .    
20fb0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
20fc0 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20  N_READWRITE |.  
20fd0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
20fe0 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
20ff0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
21000 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20  EN_EXCLUSIVE |. 
21010 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
21020 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
21030 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  SE |.          S
21040 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
21050 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  DB;..    rc = sq
21060 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64  lite3BtreeOpen(d
21070 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20  b->pVfs, 0, db, 
21080 26 70 42 74 2c 20 30 2c 20 66 6c 61 67 73 29 3b  &pBt, 0, flags);
21090 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
210a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
210b0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
210c0 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
210d0 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
210e0 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20  ary database ". 
210f0 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72         "file for
21100 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61   storing tempora
21110 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ry tables");.   
21120 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
21130 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
21140 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62   1;.    }.    db
21150 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70  ->aDb[1].pBt = p
21160 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
21170 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
21180 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51  ma );.    if( SQ
21190 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69  LITE_NOMEM==sqli
211a0 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
211b0 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78  ize(pBt, db->nex
211c0 74 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30  tPagesize, -1, 0
211d0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
211e0 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
211f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
21200 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
21210 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
21220 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
21230 68 61 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  hat the schema c
21240 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e 65 65 64 20  ookie will need 
21250 74 6f 20 62 65 20 76 65 72 69 66 69 65 64 0a 2a  to be verified.*
21260 2a 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 69  * for database i
21270 44 62 2e 20 20 54 68 65 20 63 6f 64 65 20 74 6f  Db.  The code to
21280 20 61 63 74 75 61 6c 6c 79 20 76 65 72 69 66 79   actually verify
21290 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
212a0 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63 63 75 72  ie.** will occur
212b0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
212c0 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56 44 42  he top-level VDB
212d0 45 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 67 65  E and will be ge
212e0 6e 65 72 61 74 65 64 0a 2a 2a 20 6c 61 74 65 72  nerated.** later
212f0 2c 20 62 79 20 73 71 6c 69 74 65 33 46 69 6e 69  , by sqlite3Fini
21300 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76  shCoding()..*/.v
21310 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56  oid sqlite3CodeV
21320 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73  erifySchema(Pars
21330 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
21340 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  Db){.  Parse *pT
21350 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
21360 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
21370 50 61 72 73 65 29 3b 0a 0a 20 20 61 73 73 65 72  Parse);..  asser
21380 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
21390 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62  <pParse->db->nDb
213a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
213b0 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
213c0 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62  b].pBt!=0 || iDb
213d0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
213e0 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f   iDb<SQLITE_MAX_
213f0 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20  ATTACHED+2 );.  
21400 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
21410 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 70  chemaMutexHeld(p
21420 50 61 72 73 65 2d 3e 64 62 2c 20 69 44 62 2c 20  Parse->db, iDb, 
21430 30 29 20 29 3b 0a 20 20 69 66 28 20 44 62 4d 61  0) );.  if( DbMa
21440 73 6b 54 65 73 74 28 70 54 6f 70 6c 65 76 65 6c  skTest(pToplevel
21450 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44  ->cookieMask, iD
21460 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44 62 4d  b)==0 ){.    DbM
21470 61 73 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c  askSet(pToplevel
21480 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44  ->cookieMask, iD
21490 62 29 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49  b);.    if( !OMI
214a0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
214b0 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
214c0 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
214d0 61 73 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a  ase(pToplevel);.
214e0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
214f0 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  ** If argument z
21500 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  Db is NULL, then
21510 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64   call sqlite3Cod
21520 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 29 20  eVerifySchema() 
21530 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 61 74 74  for each .** att
21540 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2e 20  ached database. 
21550 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b  Otherwise, invok
21560 65 20 69 74 20 66 6f 72 20 74 68 65 20 64 61 74  e it for the dat
21570 61 62 61 73 65 20 6e 61 6d 65 64 20 7a 44 62 20  abase named zDb 
21580 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
21590 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e  lite3CodeVerifyN
215a0 61 6d 65 64 53 63 68 65 6d 61 28 50 61 72 73 65  amedSchema(Parse
215b0 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
215c0 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71  char *zDb){.  sq
215d0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
215e0 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b  se->db;.  int i;
215f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
21600 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
21610 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
21620 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
21630 70 44 62 2d 3e 70 42 74 20 26 26 20 28 21 7a 44  pDb->pBt && (!zD
21640 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53  b || 0==sqlite3S
21650 74 72 49 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d  trICmp(zDb, pDb-
21660 3e 7a 44 62 53 4e 61 6d 65 29 29 20 29 7b 0a 20  >zDbSName)) ){. 
21670 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
21680 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
21690 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  rse, i);.    }. 
216a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
216b0 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
216c0 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72  hat prepares for
216d0 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74   doing an operat
216e0 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  ion that.** migh
216f0 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74  t change the dat
21700 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abase..**.** Thi
21710 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
21720 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
21730 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  on if we are not
21740 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a   already within.
21750 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
21760 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72  .  If we are alr
21770 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72  eady within a tr
21780 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
21790 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  a checkpoint.** 
217a0 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65  is set if the se
217b0 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d  tStatement param
217c0 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41  eter is true.  A
217d0 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
217e0 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72  ld.** be set for
217f0 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74   operations that
21800 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65   might fail (due
21810 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   to a constraint
21820 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  ) part of.** the
21830 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64   way through and
21840 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64   which will need
21850 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72   to undo some wr
21860 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76  ites without hav
21870 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61  ing to.** rollba
21880 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  ck the whole tra
21890 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f  nsaction.  For o
218a0 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20  perations where 
218b0 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
218c0 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65  ** can be checke
218d0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  d before any cha
218e0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
218f0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
21900 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65  t is never.** ne
21910 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
21920 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20  a write and the 
21930 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
21940 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f  d not be set..*/
21950 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
21960 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
21970 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
21980 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74  int setStatement
21990 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61  , int iDb){.  Pa
219a0 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
219b0 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
219c0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
219d0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
219e0 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
219f0 20 69 44 62 29 3b 0a 20 20 44 62 4d 61 73 6b 53   iDb);.  DbMaskS
21a00 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72  et(pToplevel->wr
21a10 69 74 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20  iteMask, iDb);. 
21a20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75   pToplevel->isMu
21a30 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65 74 53  ltiWrite |= setS
21a40 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a  tatement;.}../*.
21a50 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
21a60 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63   the statement c
21a70 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
21a80 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69 67 68  onstruction migh
21a90 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20  t write.** more 
21aa0 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28  than one entry (
21ab0 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e  example: deletin
21ac0 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20 69  g one row then i
21ad0 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68 65 72  nserting another
21ae0 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d  ,.** inserting m
21af0 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69 6e 20  ultiple rows in 
21b00 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65  a table, or inse
21b10 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e 64 20  rting a row and 
21b20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e 29 0a  index entries.).
21b30 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74 20 6f  ** If an abort o
21b40 63 63 75 72 73 20 61 66 74 65 72 20 73 6f 6d 65  ccurs after some
21b50 20 6f 66 20 74 68 65 73 65 20 77 72 69 74 65 73   of these writes
21b60 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c   have completed,
21b70 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a   then it will.**
21b80 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
21b90 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65   undo the comple
21ba0 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76  ted writes..*/.v
21bb0 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69  oid sqlite3Multi
21bc0 57 72 69 74 65 28 50 61 72 73 65 20 2a 70 50 61  Write(Parse *pPa
21bd0 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  rse){.  Parse *p
21be0 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
21bf0 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
21c00 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c  pParse);.  pTopl
21c10 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69  evel->isMultiWri
21c20 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  te = 1;.}../* .*
21c30 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
21c40 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ator calls this 
21c50 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20 64 69  routine if is di
21c60 73 63 6f 76 65 72 73 20 74 68 61 74 20 69 74 20  scovers that it 
21c70 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74  is.** possible t
21c80 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74 65 6d  o abort a statem
21c90 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d  ent prior to com
21ca0 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64  pletion.  In ord
21cb0 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72  er to .** perfor
21cc0 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77 69 74  m this abort wit
21cd0 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e 67 20  hout corrupting 
21ce0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 77 65  the database, we
21cf0 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a   need to make.**
21d00 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73   sure that the s
21d10 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72 6f 74  tatement is prot
21d20 65 63 74 65 64 20 62 79 20 61 20 73 74 61 74 65  ected by a state
21d30 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
21d40 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61  ..**.** Technica
21d50 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65  lly, we only nee
21d60 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 79  d to set the may
21d70 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20 74 68  Abort flag if th
21d80 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69 74  e.** isMultiWrit
21d90 65 20 66 6c 61 67 20 77 61 73 20 70 72 65 76 69  e flag was previ
21da0 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68 65 72  ously set.  Ther
21db0 65 20 69 73 20 61 20 74 69 6d 65 20 64 65 70 65  e is a time depe
21dc0 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74  ndency.** such t
21dd0 68 61 74 20 74 68 65 20 61 62 6f 72 74 20 6d 75  hat the abort mu
21de0 73 74 20 6f 63 63 75 72 20 61 66 74 65 72 20 74  st occur after t
21df0 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e 20 20  he multiwrite.  
21e00 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f  This makes.** so
21e10 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  me statements in
21e20 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45 50 4c  volving the REPL
21e30 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  ACE conflict res
21e40 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
21e50 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65  m.** go a little
21e60 20 66 61 73 74 65 72 2e 20 20 42 75 74 20 74 61   faster.  But ta
21e70 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65 20 6f  king advantage o
21e80 66 20 74 68 69 73 20 74 69 6d 65 20 64 65 70 65  f this time depe
21e90 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20  ndency.** makes 
21ea0 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c  it more difficul
21eb0 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20  t to prove that 
21ec0 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f 72 72  the code is corr
21ed0 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74  ect (in .** part
21ee0 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65 76 65  icular, it preve
21ef0 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72 69 74  nts us from writ
21f00 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69 76 65  ing an effective
21f10 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
21f20 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41 73 73  on of sqlite3Ass
21f30 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29 20 61  ertMayAbort()) a
21f40 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20 63 68  nd so we have ch
21f50 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20  osen.** to take 
21f60 74 68 65 20 73 61 66 65 20 72 6f 75 74 65 20 61  the safe route a
21f70 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70 74 69  nd skip the opti
21f80 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  mization..*/.voi
21f90 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72  d sqlite3MayAbor
21fa0 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  t(Parse *pParse)
21fb0 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
21fc0 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
21fd0 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
21fe0 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  se);.  pToplevel
21ff0 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a  ->mayAbort = 1;.
22000 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
22010 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20 63 61   OP_Halt that ca
22020 75 73 65 73 20 74 68 65 20 76 64 62 65 20 74 6f  uses the vdbe to
22030 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
22040 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20  E_CONSTRAINT.** 
22050 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72  error. The onErr
22060 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 74  or parameter det
22070 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 28 69  ermines which (i
22080 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20 73 74  f any) of the st
22090 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f  atement.** and/o
220a0 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  r current transa
220b0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
220c0 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  back..*/.void sq
220d0 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
220e0 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
220f0 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
22100 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
22110 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 20 20   int errCode,   
22120 20 20 20 2f 2a 20 65 78 74 65 6e 64 65 64 20 65     /* extended e
22130 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69  rror code */.  i
22140 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
22150 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74   /* Constraint t
22160 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  ype */.  char *p
22170 34 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72  4,         /* Er
22180 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20  ror message */. 
22190 20 69 38 20 70 34 74 79 70 65 2c 20 20 20 20 20   i8 p4type,     
221a0 20 20 20 2f 2a 20 50 34 5f 53 54 41 54 49 43 20     /* P4_STATIC 
221b0 6f 72 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 20  or P4_TRANSIENT 
221c0 2a 2f 0a 20 20 75 38 20 70 35 45 72 72 6d 73 67  */.  u8 p5Errmsg
221d0 20 20 20 20 20 20 20 2f 2a 20 50 35 5f 45 72 72         /* P5_Err
221e0 4d 73 67 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  Msg type */.){. 
221f0 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
22200 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
22210 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65 72  );.  assert( (er
22220 72 43 6f 64 65 26 30 78 66 66 29 3d 3d 53 51 4c  rCode&0xff)==SQL
22230 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29  ITE_CONSTRAINT )
22240 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d  ;.  if( onError=
22250 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
22260 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
22270 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20  (pParse);.  }.  
22280 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22290 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72  4(v, OP_Halt, er
222a0 72 43 6f 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20  rCode, onError, 
222b0 30 2c 20 70 34 2c 20 70 34 74 79 70 65 29 3b 0a  0, p4, p4type);.
222c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
222d0 6e 67 65 50 35 28 76 2c 20 70 35 45 72 72 6d 73  ngeP5(v, p5Errms
222e0 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64  g);.}../*.** Cod
222f0 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65  e an OP_Halt due
22300 20 74 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52   to UNIQUE or PR
22310 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
22320 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a  aint violation..
22330 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55  */.void sqlite3U
22340 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28  niqueConstraint(
22350 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
22360 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
22370 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
22380 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
22390 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70  * Constraint typ
223a0 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
223b0 64 78 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  dx       /* The 
223c0 69 6e 64 65 78 20 74 68 61 74 20 74 72 69 67 67  index that trigg
223d0 65 72 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69  ers the constrai
223e0 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
223f0 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a  *zErr;.  int j;.
22400 20 20 53 74 72 41 63 63 75 6d 20 65 72 72 4d 73    StrAccum errMs
22410 67 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  g;.  Table *pTab
22420 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b   = pIdx->pTable;
22430 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ..  sqlite3StrAc
22440 63 75 6d 49 6e 69 74 28 26 65 72 72 4d 73 67 2c  cumInit(&errMsg,
22450 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20   pParse->db, 0, 
22460 30 2c 20 32 30 30 29 3b 0a 20 20 69 66 28 20 70  0, 200);.  if( p
22470 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 7b  Idx->aColExpr ){
22480 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69  .    sqlite3XPri
22490 6e 74 66 28 26 65 72 72 4d 73 67 2c 20 22 69 6e  ntf(&errMsg, "in
224a0 64 65 78 20 27 25 71 27 22 2c 20 70 49 64 78 2d  dex '%q'", pIdx-
224b0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  >zName);.  }else
224c0 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
224d0 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
224e0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  j++){.      char
224f0 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 61 73   *zCol;.      as
22500 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f  sert( pIdx->aiCo
22510 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20  lumn[j]>=0 );.  
22520 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
22530 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f  >aCol[pIdx->aiCo
22540 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[j]].zName;.
22550 20 20 20 20 20 20 69 66 28 20 6a 20 29 20 73 71        if( j ) sq
22560 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
22570 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2c 20  end(&errMsg, ", 
22580 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", 2);.      sql
22590 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
225a0 6e 64 41 6c 6c 28 26 65 72 72 4d 73 67 2c 20 70  ndAll(&errMsg, p
225b0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
225c0 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
225d0 75 6d 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67  umAppend(&errMsg
225e0 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20 20 20 20  , ".", 1);.     
225f0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
22600 41 70 70 65 6e 64 41 6c 6c 28 26 65 72 72 4d 73  AppendAll(&errMs
22610 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a  g, zCol);.    }.
22620 20 20 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c    }.  zErr = sql
22630 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
22640 73 68 28 26 65 72 72 4d 73 67 29 3b 0a 20 20 73  sh(&errMsg);.  s
22650 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
22660 61 69 6e 74 28 70 50 61 72 73 65 2c 20 0a 20 20  aint(pParse, .  
22670 20 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e    IsPrimaryKeyIn
22680 64 65 78 28 70 49 64 78 29 20 3f 20 53 51 4c 49  dex(pIdx) ? SQLI
22690 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52  TE_CONSTRAINT_PR
226a0 49 4d 41 52 59 4b 45 59 20 0a 20 20 20 20 20 20  IMARYKEY .      
226b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226c0 20 20 20 20 20 20 3a 20 53 51 4c 49 54 45 5f 43        : SQLITE_C
226d0 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45  ONSTRAINT_UNIQUE
226e0 2c 0a 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20 7a  ,.    onError, z
226f0 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c  Err, P4_DYNAMIC,
22700 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e   P5_ConstraintUn
22710 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ique);.}.../*.**
22720 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74   Code an OP_Halt
22730 20 64 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69 71   due to non-uniq
22740 75 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69  ue rowid..*/.voi
22750 64 20 73 71 6c 69 74 65 33 52 6f 77 69 64 43 6f  d sqlite3RowidCo
22760 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
22770 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
22780 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
22790 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
227a0 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c  r,      /* Confl
227b0 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
227c0 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54 61  lgorithm */.  Ta
227d0 62 6c 65 20 2a 70 54 61 62 20 20 20 20 20 20 20  ble *pTab       
227e0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 77 69 74  /* The table wit
227f0 68 20 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75 65  h the non-unique
22800 20 72 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20 20   rowid */ .){.  
22810 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e  char *zMsg;.  in
22820 74 20 72 63 3b 0a 20 20 69 66 28 20 70 54 61 62  t rc;.  if( pTab
22830 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20  ->iPKey>=0 ){.  
22840 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
22850 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
22860 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61  db, "%s.%s", pTa
22870 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
22880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22890 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70      pTab->aCol[p
228a0 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d  Tab->iPKey].zNam
228b0 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  e);.    rc = SQL
228c0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
228d0 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65 6c  RIMARYKEY;.  }el
228e0 73 65 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73  se{.    zMsg = s
228f0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
22900 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72 6f  arse->db, "%s.ro
22910 77 69 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  wid", pTab->zNam
22920 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  e);.    rc = SQL
22930 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52  ITE_CONSTRAINT_R
22940 4f 57 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  OWID;.  }.  sqli
22950 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
22960 74 28 70 50 61 72 73 65 2c 20 72 63 2c 20 6f 6e  t(pParse, rc, on
22970 45 72 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34 5f  Error, zMsg, P4_
22980 44 59 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20 20  DYNAMIC,.       
22990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229a0 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e   P5_ConstraintUn
229b0 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ique);.}../*.** 
229c0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
229d0 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65 20  pIndex uses the 
229e0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
229f0 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72  ce pColl.  Retur
22a00 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20  n.** true if it 
22a10 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69  does and false i
22a20 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  f it does not..*
22a30 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
22a40 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
22a50 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69  atic int collati
22a60 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68  onMatch(const ch
22a70 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78  ar *zColl, Index
22a80 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74   *pIndex){.  int
22a90 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43   i;.  assert( zC
22aa0 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  oll!=0 );.  for(
22ab0 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e  i=0; i<pIndex->n
22ac0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
22ad0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
22ae0 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
22af0 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
22b00 20 7a 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d   z!=0 || pIndex-
22b10 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29  >aiColumn[i]<0 )
22b20 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  ;.    if( pIndex
22b30 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30  ->aiColumn[i]>=0
22b40 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
22b50 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20  rICmp(z, zColl) 
22b60 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
22b70 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
22b80 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
22b90 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75  f../*.** Recompu
22ba0 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
22bb0 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20  f pTab that use 
22bc0 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
22bd0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a  quence pColl..**
22be0 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65   If pColl==0 the
22bf0 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  n recompute all 
22c00 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e  indices of pTab.
22c10 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
22c20 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
22c30 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
22c40 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a  dexTable(Parse *
22c50 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
22c60 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20  Tab, char const 
22c70 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78  *zColl){.  Index
22c80 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
22c90 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
22ca0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
22cb0 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f  th pTab */..  fo
22cc0 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70  r(pIndex=pTab->p
22cd0 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
22ce0 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e  Index=pIndex->pN
22cf0 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43  ext){.    if( zC
22d00 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74  oll==0 || collat
22d10 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20  ionMatch(zColl, 
22d20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20  pIndex) ){.     
22d30 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
22d40 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
22d50 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
22d60 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
22d70 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
22d80 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
22d90 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
22da0 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
22db0 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
22dc0 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
22dd0 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
22de0 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
22df0 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61  all indices of a
22e00 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c  ll tables in all
22e10 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65   databases where
22e20 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20   the.** indices 
22e30 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
22e40 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
22e50 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  .  If pColl==0 t
22e60 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a  hen recompute.**
22e70 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65   all indices eve
22e80 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e  rywhere..*/.#ifn
22e90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22ea0 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
22eb0 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62  oid reindexDatab
22ec0 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ases(Parse *pPar
22ed0 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  se, char const *
22ee0 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44  zColl){.  Db *pD
22ef0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
22f00 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
22f10 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
22f20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
22f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22f40 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
22f50 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
22f60 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
22f70 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
22f80 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
22f90 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c  tion */.  HashEl
22fa0 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20  em *k;          
22fb0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
22fc0 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73  ping over tables
22fd0 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62   in pDb */.  Tab
22fe0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
22ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
23000 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
23010 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ase */..  assert
23020 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
23030 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62  ldsAllMutexes(db
23040 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65 64 20  ) );  /* Needed 
23050 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73  for schema acces
23060 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62 3d 30  s */.  for(iDb=0
23070 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69  , pDb=db->aDb; i
23080 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
23090 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61  +, pDb++){.    a
230a0 73 73 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b  ssert( pDb!=0 );
230b0 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74  .    for(k=sqlit
230c0 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d  eHashFirst(&pDb-
230d0 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
230e0 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65  h);  k; k=sqlite
230f0 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20  HashNext(k)){.  
23100 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c      pTab = (Tabl
23110 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  e*)sqliteHashDat
23120 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e  a(k);.      rein
23130 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c  dexTable(pParse,
23140 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20   pTab, zColl);. 
23150 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
23160 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
23170 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52  e code for the R
23180 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
23190 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49  **.**        REI
231a0 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20 20  NDEX            
231b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231c0 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 1.**        R
231d0 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69  EINDEX  <collati
231e0 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20 20  on>             
231f0 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20    -- 2.**       
23200 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
23210 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d  base>.?<tablenam
23220 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20  e>  -- 3.**     
23230 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61     REINDEX  ?<da
23240 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e  tabase>.?<indexn
23250 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a  ame>  -- 4.**.**
23260 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61   Form 1 causes a
23270 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
23280 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
23290 61 73 65 73 20 74 6f 20 62 65 20 72 65 62 75 69  ases to be rebui
232a0 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65  lt..** Form 2 re
232b0 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63  builds all indic
232c0 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61  es in all databa
232d0 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65  ses that use the
232e0 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74   named.** collat
232f0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46  ing function.  F
23300 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62  orms 3 and 4 reb
23310 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69  uild the named i
23320 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69  ndex or all.** i
23330 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
23340 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64  d with the named
23350 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64   table..*/.#ifnd
23360 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
23370 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69  EINDEX.void sqli
23380 74 65 33 52 65 69 6e 64 65 78 28 50 61 72 73 65  te3Reindex(Parse
23390 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
233a0 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a  *pName1, Token *
233b0 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53  pName2){.  CollS
233c0 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
233d0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
233e0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
233f0 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72  be reindexed, or
23400 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20   NULL */.  char 
23410 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *z;             
23420 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
23430 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  f a table or ind
23440 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ex */.  const ch
23450 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20  ar *zDb;        
23460 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
23470 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
23480 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
23490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
234a0 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  A table in the d
234b0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64  atabase */.  Ind
234c0 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
234d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
234e0 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
234f0 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69  with pTab */.  i
23500 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
23510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
23520 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  e database index
23530 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c   number */.  sql
23540 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
23550 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20  e->db;   /* The 
23560 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
23570 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ion */.  Token *
23580 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20  pObjName;       
23590 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
235a0 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  the table or ind
235b0 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ex to be reindex
235c0 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  ed */..  /* Read
235d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
235e0 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f  hema. If an erro
235f0 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
23600 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
23610 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69  .  ** and code i
23620 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
23630 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69  urn NULL. */.  i
23640 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
23650 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
23660 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72  pParse) ){.    r
23670 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  eturn;.  }..  if
23680 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20  ( pName1==0 ){. 
23690 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
236a0 73 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a  ses(pParse, 0);.
236b0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65      return;.  }e
236c0 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28 70 4e  lse if( NEVER(pN
236d0 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d  ame2==0) || pNam
236e0 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  e2->z==0 ){.    
236f0 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20  char *zColl;.   
23700 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d   assert( pName1-
23710 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20  >z );.    zColl 
23720 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
23730 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
23740 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
23750 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74  if( !zColl ) ret
23760 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  urn;.    pColl =
23770 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
23780 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
23790 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20   zColl, 0);.    
237a0 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
237b0 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
237c0 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  ses(pParse, zCol
237d0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
237e0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
237f0 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  l);.      return
23800 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
23810 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
23820 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20  oll);.  }.  iDb 
23830 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
23840 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
23850 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f  me1, pName2, &pO
23860 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  bjName);.  if( i
23870 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
23880 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65   z = sqlite3Name
23890 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f  FromToken(db, pO
238a0 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  bjName);.  if( z
238b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
238c0 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
238d0 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 70  b].zDbSName;.  p
238e0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
238f0 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44  dTable(db, z, zD
23900 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29  b);.  if( pTab )
23910 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61 62  {.    reindexTab
23920 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
23930 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
23940 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
23950 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
23960 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
23970 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
23980 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , zDb);.  sqlite
23990 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
239a0 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
239b0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
239c0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
239d0 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
239e0 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
239f0 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
23a00 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
23a10 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
23a20 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
23a30 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
23a40 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62   identify the ob
23a50 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64  ject to be reind
23a60 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66  exed");.}.#endif
23a70 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
23a80 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
23a90 72 65 20 74 68 61 74 20 69 73 20 61 70 70 72 6f  re that is appro
23aa0 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67  priate for the g
23ab0 69 76 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a  iven Index..**.*
23ac0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f  * The caller sho
23ad0 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  uld invoke sqlit
23ae0 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 29  e3KeyInfoUnref()
23af0 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   on the returned
23b00 20 6f 62 6a 65 63 74 0a 2a 2a 20 77 68 65 6e 20   object.** when 
23b10 69 74 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  it has finished 
23b20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79  using it..*/.Key
23b30 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79  Info *sqlite3Key
23b40 49 6e 66 6f 4f 66 49 6e 64 65 78 28 50 61 72 73  InfoOfIndex(Pars
23b50 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
23b60 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69   *pIdx){.  int i
23b70 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70  ;.  int nCol = p
23b80 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Idx->nColumn;.  
23b90 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d  int nKey = pIdx-
23ba0 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65 79 49  >nKeyCol;.  KeyI
23bb0 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 69 66 28  nfo *pKey;.  if(
23bc0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
23bd0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
23be0 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  pIdx->uniqNotNul
23bf0 6c 20 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20  l ){.    pKey = 
23c00 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
23c10 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
23c20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29  nKey, nCol-nKey)
23c30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
23c40 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Key = sqlite3Key
23c50 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65  InfoAlloc(pParse
23c60 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a  ->db, nCol, 0);.
23c70 20 20 7d 0a 20 20 69 66 28 20 70 4b 65 79 20 29    }.  if( pKey )
23c80 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
23c90 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
23ca0 69 74 65 61 62 6c 65 28 70 4b 65 79 29 20 29 3b  iteable(pKey) );
23cb0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
23cc0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
23cd0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
23ce0 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
23cf0 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70 4b 65  ll[i];.      pKe
23d00 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43  y->aColl[i] = zC
23d10 6f 6c 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 42  oll==sqlite3StrB
23d20 49 4e 41 52 59 20 3f 20 30 20 3a 0a 20 20 20 20  INARY ? 0 :.    
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d40 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74      sqlite3Locat
23d50 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
23d60 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 70   zColl);.      p
23d70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Key->aSortOrder[
23d80 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74  i] = pIdx->aSort
23d90 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a  Order[i];.    }.
23da0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
23db0 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71  nErr ){.      sq
23dc0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
23dd0 66 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 70  f(pKey);.      p
23de0 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Key = 0;.    }. 
23df0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79   }.  return pKey
23e00 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
23e10 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20  ITE_OMIT_CTE./* 
23e20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
23e30 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65   is invoked once
23e40 20 70 65 72 20 43 54 45 20 62 79 20 74 68 65 20   per CTE by the 
23e50 70 61 72 73 65 72 20 77 68 69 6c 65 20 70 61 72  parser while par
23e60 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49 54 48 20  sing a .** WITH 
23e70 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68  clause. .*/.With
23e80 20 2a 73 71 6c 69 74 65 33 57 69 74 68 41 64 64   *sqlite3WithAdd
23e90 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
23ea0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
23eb0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
23ec0 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c  /.  With *pWith,
23ed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
23ee0 78 69 73 74 69 6e 67 20 57 49 54 48 20 63 6c 61  xisting WITH cla
23ef0 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
23f00 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
23f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
23f20 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d  e of the common-
23f30 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
23f40 69 73 74 20 2a 70 41 72 67 6c 69 73 74 2c 20 20  ist *pArglist,  
23f50 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63     /* Optional c
23f60 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20  olumn name list 
23f70 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
23f80 0a 20 20 53 65 6c 65 63 74 20 2a 70 51 75 65 72  .  Select *pQuer
23f90 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75  y          /* Qu
23fa0 65 72 79 20 75 73 65 64 20 74 6f 20 69 6e 69 74  ery used to init
23fb0 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c 65  ialize the table
23fc0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
23fd0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
23fe0 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e 65 77 3b  b;.  With *pNew;
23ff0 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
24000 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
24010 20 74 68 65 20 43 54 45 20 6e 61 6d 65 20 69 73   the CTE name is
24020 20 75 6e 69 71 75 65 20 77 69 74 68 69 6e 20 74   unique within t
24030 68 69 73 20 57 49 54 48 20 63 6c 61 75 73 65 2e  his WITH clause.
24040 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74   If.  ** not, st
24050 6f 72 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ore an error in 
24060 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74  the Parse struct
24070 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20  ure. */.  zName 
24080 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
24090 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
240a0 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
240b0 20 7a 4e 61 6d 65 20 26 26 20 70 57 69 74 68 20   zName && pWith 
240c0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
240d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69    for(i=0; i<pWi
240e0 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  th->nCte; i++){.
240f0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
24100 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  3StrICmp(zName, 
24110 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pWith->a[i].zNam
24120 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
24130 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
24140 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63  (pParse, "duplic
24150 61 74 65 20 57 49 54 48 20 74 61 62 6c 65 20 6e  ate WITH table n
24160 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29  ame: %s", zName)
24170 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24180 20 20 7d 0a 0a 20 20 69 66 28 20 70 57 69 74 68    }..  if( pWith
24190 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   ){.    int nByt
241a0 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 57 69 74  e = sizeof(*pWit
241b0 68 29 20 2b 20 28 73 69 7a 65 6f 66 28 70 57 69  h) + (sizeof(pWi
241c0 74 68 2d 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74  th->a[1]) * pWit
241d0 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e  h->nCte);.    pN
241e0 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
241f0 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69 74 68 2c  alloc(db, pWith,
24200 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
24210 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  {.    pNew = sql
24220 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
24230 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69  (db, sizeof(*pWi
24240 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  th));.  }.  asse
24250 72 74 28 20 28 70 4e 65 77 21 3d 30 20 26 26 20  rt( (pNew!=0 && 
24260 7a 4e 61 6d 65 21 3d 30 29 20 7c 7c 20 64 62 2d  zName!=0) || db-
24270 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
24280 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
24290 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
242a0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
242b0 65 6c 65 74 65 28 64 62 2c 20 70 41 72 67 6c 69  elete(db, pArgli
242c0 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
242d0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
242e0 20 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71   pQuery);.    sq
242f0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
24300 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
24310 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73   = pWith;.  }els
24320 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70  e{.    pNew->a[p
24330 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65  New->nCte].pSele
24340 63 74 20 3d 20 70 51 75 65 72 79 3b 0a 20 20 20  ct = pQuery;.   
24350 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
24360 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72  Cte].pCols = pAr
24370 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d  glist;.    pNew-
24380 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a  >a[pNew->nCte].z
24390 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
243a0 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
243b0 6e 43 74 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20  nCte].zCteErr = 
243c0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74  0;.    pNew->nCt
243d0 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  e++;.  }..  retu
243e0 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
243f0 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65  * Free the conte
24400 6e 74 73 20 6f 66 20 74 68 65 20 57 69 74 68 20  nts of the With 
24410 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
24420 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
24430 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
24440 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74 65 28  lite3WithDelete(
24450 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74  sqlite3 *db, Wit
24460 68 20 2a 70 57 69 74 68 29 7b 0a 20 20 69 66 28  h *pWith){.  if(
24470 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e   pWith ){.    in
24480 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
24490 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b  ; i<pWith->nCte;
244a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
244b0 75 63 74 20 43 74 65 20 2a 70 43 74 65 20 3d 20  uct Cte *pCte = 
244c0 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20  &pWith->a[i];.  
244d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
244e0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  istDelete(db, pC
244f0 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20  te->pCols);.    
24500 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
24510 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e  elete(db, pCte->
24520 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
24530 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
24540 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCte->zName);.
24550 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
24560 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 69 74  3DbFree(db, pWit
24570 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  h);.  }.}.#endif
24580 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
24590 49 54 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f  ITE_OMIT_CTE) */
245a0 0a                                               .