/ Hex Artifact Content
Login

Artifact 182877f27be4129ffd385b80f3318251a605152b:


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 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 29  ( zDatabase==0 )
29e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
29f0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2a00: 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44  Database, db->aD
2a10: 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65 29 21 3d  b[1].zDbSName)!=
2a20: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a  0 ) break;.    z
2a30: 4e 61 6d 65 20 3d 20 54 45 4d 50 5f 4d 41 53 54  Name = TEMP_MAST
2a40: 45 52 5f 4e 41 4d 45 3b 0a 20 20 7d 0a 20 20 72  ER_NAME;.  }.  r
2a50: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2a60: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
2a70: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
2a80: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
2a90: 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
2aa0: 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67  abase.** table g
2ab0: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
2ac0: 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   that table and 
2ad0: 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65  (optionally) the
2ae0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
2af0: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
2b00: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20  ing the table.  
2b10: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
2b20: 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20  ot found.  Also 
2b30: 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  leave an.** erro
2b40: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
2b50: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
2b60: 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
2b70: 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
2b80: 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69  routine and sqli
2b90: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69  te3FindTable() i
2ba0: 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72  s that this.** r
2bb0: 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e  outine leaves an
2bc0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
2bd0: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
2be0: 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74  g where.** sqlit
2bf0: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f  e3FindTable() do
2c00: 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65  es not..*/.Table
2c10: 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54   *sqlite3LocateT
2c20: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
2c30: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
2c40: 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69  * context in whi
2c50: 63 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72  ch to report err
2c60: 6f 72 73 20 2a 2f 0a 20 20 75 33 32 20 66 6c 61  ors */.  u32 fla
2c70: 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
2c80: 2f 2a 20 4c 4f 43 41 54 45 5f 56 49 45 57 20 6f  /* LOCATE_VIEW o
2c90: 72 20 4c 4f 43 41 54 45 5f 4e 4f 45 52 52 20 2a  r LOCATE_NOERR *
2ca0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2cb0: 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61  zName,     /* Na
2cc0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
2cd0: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66  we are looking f
2ce0: 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  or */.  const ch
2cf0: 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20 20 2f  ar *zDbase     /
2d00: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
2d10: 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74 20 62  tabase.  Might b
2d20: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54  e NULL */.){.  T
2d30: 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52  able *p;..  /* R
2d40: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
2d50: 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
2d60: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
2d70: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
2d80: 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
2d90: 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
2da0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
2db0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
2dc0: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
2dd0: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
2de0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2df0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69  .  p = sqlite3Fi
2e00: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
2e10: 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73  db, zName, zDbas
2e20: 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  e);.  if( p==0 )
2e30: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2e40: 20 2a 7a 4d 73 67 20 3d 20 66 6c 61 67 73 20 26   *zMsg = flags &
2e50: 20 4c 4f 43 41 54 45 5f 56 49 45 57 20 3f 20 22   LOCATE_VIEW ? "
2e60: 6e 6f 20 73 75 63 68 20 76 69 65 77 22 20 3a 20  no such view" : 
2e70: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 22 3b  "no such table";
2e80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e90: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2ea0: 45 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  E.    if( sqlite
2eb0: 33 46 69 6e 64 44 62 4e 61 6d 65 28 70 50 61 72  3FindDbName(pPar
2ec0: 73 65 2d 3e 64 62 2c 20 7a 44 62 61 73 65 29 3c  se->db, zDbase)<
2ed0: 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  1 ){.      /* If
2ee0: 20 7a 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 6f   zName is the no
2ef0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
2f00: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 73 63 68  table in the sch
2f10: 65 6d 61 20 63 72 65 61 74 65 64 20 75 73 69 6e  ema created usin
2f20: 67 0a 20 20 20 20 20 20 2a 2a 20 43 52 45 41 54  g.      ** CREAT
2f30: 45 2c 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f  E, then check to
2f40: 20 73 65 65 20 69 66 20 69 74 20 69 73 20 74 68   see if it is th
2f50: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 76 69 72  e name of an vir
2f60: 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 0a  tual table that.
2f70: 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20        ** can be 
2f80: 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72  an eponymous vir
2f90: 74 75 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  tual table. */. 
2fa0: 20 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f       Module *pMo
2fb0: 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29 73 71 6c  d = (Module*)sql
2fc0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 50  ite3HashFind(&pP
2fd0: 61 72 73 65 2d 3e 64 62 2d 3e 61 4d 6f 64 75 6c  arse->db->aModul
2fe0: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
2ff0: 20 69 66 28 20 70 4d 6f 64 20 26 26 20 73 71 6c   if( pMod && sql
3000: 69 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75  ite3VtabEponymou
3010: 73 54 61 62 6c 65 49 6e 69 74 28 70 50 61 72 73  sTableInit(pPars
3020: 65 2c 20 70 4d 6f 64 29 20 29 7b 0a 20 20 20 20  e, pMod) ){.    
3030: 20 20 20 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d      return pMod-
3040: 3e 70 45 70 6f 54 61 62 3b 0a 20 20 20 20 20 20  >pEpoTab;.      
3050: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
3060: 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
3070: 4c 4f 43 41 54 45 5f 4e 4f 45 52 52 29 3d 3d 30  LOCATE_NOERR)==0
3080: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 44   ){.      if( zD
3090: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  base ){.        
30a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
30b0: 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e  pParse, "%s: %s.
30c0: 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73  %s", zMsg, zDbas
30d0: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
30e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3100: 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 22  pParse, "%s: %s"
3110: 2c 20 7a 4d 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a  , zMsg, zName);.
3120: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
3130: 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
3140: 61 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  a = 1;.    }.  }
3150: 0a 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ..  return p;.}.
3160: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
3170: 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  e table identifi
3180: 65 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20  ed by *p..**.** 
3190: 54 68 69 73 20 69 73 20 61 20 77 72 61 70 70 65  This is a wrappe
31a0: 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33  r around sqlite3
31b0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20 54  LocateTable(). T
31c0: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
31d0: 74 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  tween.** sqlite3
31e0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61 6e  LocateTable() an
31f0: 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
3200: 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  is that this fun
3210: 63 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73 0a  ction restricts.
3220: 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20 74 6f  ** the search to
3230: 20 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63 68   schema (p->pSch
3240: 65 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e 6f  ema) if it is no
3250: 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68 65  t NULL. p->pSche
3260: 6d 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e  ma may be.** non
3270: 2d 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20 70  -NULL if it is p
3280: 61 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f 72  art of a view or
3290: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
32a0: 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65 65   definition. See
32b0: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72  .** sqlite3FixSr
32c0: 63 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74 61  cList() for deta
32d0: 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ils..*/.Table *s
32e0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
32f0: 65 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20 2a  eItem(.  Parse *
3300: 70 50 61 72 73 65 2c 20 0a 20 20 75 33 32 20 66  pParse, .  u32 f
3310: 6c 61 67 73 2c 0a 20 20 73 74 72 75 63 74 20 53  lags,.  struct S
3320: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a 29  rcList_item *p.)
3330: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
3340: 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  zDb;.  assert( p
3350: 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c 20  ->pSchema==0 || 
3360: 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20  p->zDatabase==0 
3370: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 63 68  );.  if( p->pSch
3380: 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ema ){.    int i
3390: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
33a0: 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
33b0: 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  ->db, p->pSchema
33c0: 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70 50 61  );.    zDb = pPa
33d0: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
33e0: 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 7d 65  ].zDbSName;.  }e
33f0: 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70  lse{.    zDb = p
3400: 2d 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7d  ->zDatabase;.  }
3410: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
3420: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
3430: 72 73 65 2c 20 66 6c 61 67 73 2c 20 70 2d 3e 7a  rse, flags, p->z
3440: 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f  Name, zDb);.}../
3450: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
3460: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
3470: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
3480: 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75  es .** a particu
3490: 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20  lar index given 
34a0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
34b0: 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68   index.** and th
34c0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
34d0: 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74  tabase that cont
34e0: 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a  ains the index..
34f0: 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
3500: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
3510: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
3520: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
3530: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
3540: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c   for the.** tabl
3550: 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  e and the first 
3560: 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69  matching index i
3570: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
3580: 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72   checking.** for
3590: 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78   duplicate index
35a0: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
35b0: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
35c0: 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69  er is.** TEMP fi
35d0: 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20  rst, then MAIN, 
35e0: 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61  then any auxilia
35f0: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
3600: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ed.** using the 
3610: 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a  ATTACH command..
3620: 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65  */.Index *sqlite
3630: 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74  3FindIndex(sqlit
3640: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
3650: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
3660: 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49   char *zDb){.  I
3670: 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69  ndex *p = 0;.  i
3680: 6e 74 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d  nt i;.  /* All m
3690: 75 74 65 78 65 73 20 61 72 65 20 72 65 71 75 69  utexes are requi
36a0: 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61  red for schema a
36b0: 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72  ccess.  Make sur
36c0: 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20  e we hold them. 
36d0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44 62  */.  assert( zDb
36e0: 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74  !=0 || sqlite3Bt
36f0: 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78  reeHoldsAllMutex
3700: 65 73 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28  es(db) );.  for(
3710: 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69  i=OMIT_TEMPDB; i
3720: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
3730: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
3740: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a  ) ? i^1 : i;  /*
3750: 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66   Search TEMP bef
3760: 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20  ore MAIN */.    
3770: 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
3780: 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63  = db->aDb[j].pSc
3790: 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74  hema;.    assert
37a0: 28 20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ( pSchema );.   
37b0: 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69   if( zDb && sqli
37c0: 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20  te3StrICmp(zDb, 
37d0: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e  db->aDb[j].zDbSN
37e0: 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ame) ) continue;
37f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
3800: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
3810: 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b  eld(db, j, 0) );
3820: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
3830: 48 61 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d  HashFind(&pSchem
3840: 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  a->idxHash, zNam
3850: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20  e);.    if( p ) 
3860: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
3870: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
3880: 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f  Reclaim the memo
3890: 72 79 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e  ry used by an in
38a0: 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  dex.*/.static vo
38b0: 69 64 20 66 72 65 65 49 6e 64 65 78 28 73 71 6c  id freeIndex(sql
38c0: 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20  ite3 *db, Index 
38d0: 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  *p){.#ifndef SQL
38e0: 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45  ITE_OMIT_ANALYZE
38f0: 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  .  sqlite3Delete
3900: 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 64 62 2c  IndexSamples(db,
3910: 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71   p);.#endif.  sq
3920: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3930: 64 62 2c 20 70 2d 3e 70 50 61 72 74 49 64 78 57  db, p->pPartIdxW
3940: 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  here);.  sqlite3
3950: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
3960: 62 2c 20 70 2d 3e 61 43 6f 6c 45 78 70 72 29 3b  b, p->aColExpr);
3970: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
3980: 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66 29  (db, p->zColAff)
3990: 3b 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65 73  ;.  if( p->isRes
39a0: 69 7a 65 64 20 29 20 73 71 6c 69 74 65 33 44 62  ized ) sqlite3Db
39b0: 46 72 65 65 28 64 62 2c 20 28 76 6f 69 64 20 2a  Free(db, (void *
39c0: 29 70 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 23 69 66  )p->azColl);.#if
39d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
39e0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
39f0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
3a00: 70 2d 3e 61 69 52 6f 77 45 73 74 29 3b 0a 23 65  p->aiRowEst);.#e
3a10: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62  ndif.  sqlite3Db
3a20: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
3a30: 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e  /*.** For the in
3a40: 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e  dex called zIdxN
3a50: 61 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f 75  ame which is fou
3a60: 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  nd in the databa
3a70: 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b  se iDb,.** unlik
3a80: 65 20 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f  e that index fro
3a90: 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e  m its Table then
3aa0: 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65   remove the inde
3ab0: 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e  x from.** the in
3ac0: 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 20 61  dex hash table a
3ad0: 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  nd free all memo
3ae0: 72 79 20 73 74 72 75 63 74 75 72 65 73 20 61 73  ry structures as
3af0: 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
3b00: 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76   the index..*/.v
3b10: 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e  oid sqlite3Unlin
3b20: 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28  kAndDeleteIndex(
3b30: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
3b40: 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   iDb, const char
3b50: 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49   *zIdxName){.  I
3b60: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
3b70: 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20  Hash *pHash;..  
3b80: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
3b90: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
3ba0: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
3bb0: 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62  pHash = &db->aDb
3bc0: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69  [iDb].pSchema->i
3bd0: 64 78 48 61 73 68 3b 0a 20 20 70 49 6e 64 65 78  dxHash;.  pIndex
3be0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
3bf0: 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64 78  sert(pHash, zIdx
3c00: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Name, 0);.  if( 
3c10: 41 4c 57 41 59 53 28 70 49 6e 64 65 78 29 20 29  ALWAYS(pIndex) )
3c20: 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  {.    if( pIndex
3c30: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
3c40: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
3c50: 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
3c60: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
3c70: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  x->pNext;.    }e
3c80: 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
3c90: 20 2a 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a 75   *p;.      /* Ju
3ca0: 73 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 41  stification of A
3cb0: 4c 57 41 59 53 28 29 3b 20 20 54 68 65 20 69 6e  LWAYS();  The in
3cc0: 64 65 78 20 6d 75 73 74 20 62 65 20 6f 6e 20 74  dex must be on t
3cd0: 68 65 20 6c 69 73 74 20 6f 66 0a 20 20 20 20 20  he list of.     
3ce0: 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f 0a   ** indices. */.
3cf0: 20 20 20 20 20 20 70 20 3d 20 70 49 6e 64 65 78        p = pIndex
3d00: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
3d10: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41  ;.      while( A
3d20: 4c 57 41 59 53 28 70 29 20 26 26 20 70 2d 3e 70  LWAYS(p) && p->p
3d30: 4e 65 78 74 21 3d 70 49 6e 64 65 78 20 29 7b 20  Next!=pIndex ){ 
3d40: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a  p = p->pNext; }.
3d50: 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
3d60: 28 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d  (p && p->pNext==
3d70: 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20  pIndex) ){.     
3d80: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49     p->pNext = pI
3d90: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
3da0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
3db0: 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  reeIndex(db, pIn
3dc0: 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  dex);.  }.  db->
3dd0: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
3de0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d  InternChanges;.}
3df0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68 72  ../*.** Look thr
3e00: 6f 75 67 68 20 74 68 65 20 6c 69 73 74 20 6f 66  ough the list of
3e10: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
3e20: 69 6c 65 73 20 69 6e 20 64 62 2d 3e 61 44 62 5b  iles in db->aDb[
3e30: 5d 20 61 6e 64 20 69 66 0a 2a 2a 20 61 6e 79 20  ] and if.** any 
3e40: 68 61 76 65 20 62 65 65 6e 20 63 6c 6f 73 65 64  have been closed
3e50: 2c 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72  , remove them fr
3e60: 6f 6d 20 74 68 65 20 6c 69 73 74 2e 20 20 52 65  om the list.  Re
3e70: 61 6c 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a 20  allocate the.** 
3e80: 64 62 2d 3e 61 44 62 5b 5d 20 73 74 72 75 63 74  db->aDb[] struct
3e90: 75 72 65 20 74 6f 20 61 20 73 6d 61 6c 6c 65 72  ure to a smaller
3ea0: 20 73 69 7a 65 2c 20 69 66 20 70 6f 73 73 69 62   size, if possib
3eb0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79 20  le..**.** Entry 
3ec0: 30 20 28 74 68 65 20 22 6d 61 69 6e 22 20 64 61  0 (the "main" da
3ed0: 74 61 62 61 73 65 29 20 61 6e 64 20 65 6e 74 72  tabase) and entr
3ee0: 79 20 31 20 28 74 68 65 20 22 74 65 6d 70 22 20  y 1 (the "temp" 
3ef0: 64 61 74 61 62 61 73 65 29 0a 2a 2a 20 61 72 65  database).** are
3f00: 20 6e 65 76 65 72 20 63 61 6e 64 69 64 61 74 65   never candidate
3f10: 73 20 66 6f 72 20 62 65 69 6e 67 20 63 6f 6c 6c  s for being coll
3f20: 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  apsed..*/.void s
3f30: 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61  qlite3CollapseDa
3f40: 74 61 62 61 73 65 41 72 72 61 79 28 73 71 6c 69  tabaseArray(sqli
3f50: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
3f60: 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  i, j;.  for(i=j=
3f70: 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  2; i<db->nDb; i+
3f80: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
3f90: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
3fa0: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
3fb0: 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  b->pBt==0 ){.   
3fc0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3fd0: 28 64 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61  (db, pDb->zDbSNa
3fe0: 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  me);.      pDb->
3ff0: 7a 44 62 53 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  zDbSName = 0;.  
4000: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
4010: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20    }.    if( j<i 
4020: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ){.      db->aDb
4030: 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  [j] = db->aDb[i]
4040: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b  ;.    }.    j++;
4050: 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  .  }.  db->nDb =
4060: 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44   j;.  if( db->nD
4070: 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21  b<=2 && db->aDb!
4080: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
4090: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d  {.    memcpy(db-
40a0: 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e  >aDbStatic, db->
40b0: 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62  aDb, 2*sizeof(db
40c0: 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20  ->aDb[0]));.    
40d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
40e0: 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20  , db->aDb);.    
40f0: 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
4100: 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a  bStatic;.  }.}..
4110: 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20  /*.** Reset the 
4120: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20 64  schema for the d
4130: 61 74 61 62 61 73 65 20 61 74 20 69 6e 64 65 78  atabase at index
4140: 20 69 44 62 2e 20 20 41 6c 73 6f 20 72 65 73 65   iDb.  Also rese
4150: 74 20 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73 63  t the.** TEMP sc
4160: 68 65 6d 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hema..*/.void sq
4170: 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68  lite3ResetOneSch
4180: 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ema(sqlite3 *db,
4190: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 44 62 20   int iDb){.  Db 
41a0: 2a 70 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20  *pDb;.  assert( 
41b0: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a  iDb<db->nDb );..
41c0: 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 52 65    /* Case 1:  Re
41d0: 73 65 74 20 74 68 65 20 73 69 6e 67 6c 65 20 73  set the single s
41e0: 63 68 65 6d 61 20 69 64 65 6e 74 69 66 69 65 64  chema identified
41f0: 20 62 79 20 69 44 62 20 2a 2f 0a 20 20 70 44 62   by iDb */.  pDb
4200: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
4210: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
4220: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
4230: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
4240: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d  ;.  assert( pDb-
4250: 3e 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20  >pSchema!=0 );. 
4260: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c   sqlite3SchemaCl
4270: 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61  ear(pDb->pSchema
4280: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20  );..  /* If any 
4290: 64 61 74 61 62 61 73 65 20 6f 74 68 65 72 20 74  database other t
42a0: 68 61 6e 20 54 45 4d 50 20 69 73 20 72 65 73 65  han TEMP is rese
42b0: 74 2c 20 74 68 65 6e 20 61 6c 73 6f 20 72 65 73  t, then also res
42c0: 65 74 20 54 45 4d 50 0a 20 20 2a 2a 20 73 69 6e  et TEMP.  ** sin
42d0: 63 65 20 54 45 4d 50 20 6d 69 67 68 74 20 62 65  ce TEMP might be
42e0: 20 68 6f 6c 64 69 6e 67 20 74 72 69 67 67 65 72   holding trigger
42f0: 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  s that reference
4300: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20   tables in the. 
4310: 20 2a 2a 20 6f 74 68 65 72 20 64 61 74 61 62 61   ** other databa
4320: 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  se..  */.  if( i
4330: 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 70 44 62  Db!=1 ){.    pDb
4340: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 31 5d 3b 0a   = &db->aDb[1];.
4350: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d      assert( pDb-
4360: 3e 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20  >pSchema!=0 );. 
4370: 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61     sqlite3Schema
4380: 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65  Clear(pDb->pSche
4390: 6d 61 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ma);.  }.  retur
43a0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73  n;.}../*.** Eras
43b0: 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66  e all schema inf
43c0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c  ormation from al
43d0: 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
43e0: 61 73 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a  ases (including.
43f0: 2a 2a 20 22 6d 61 69 6e 22 20 61 6e 64 20 22 74  ** "main" and "t
4400: 65 6d 70 22 29 20 66 6f 72 20 61 20 73 69 6e 67  emp") for a sing
4410: 6c 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  le database conn
4420: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
4430: 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53  sqlite3ResetAllS
4440: 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69  chemasOfConnecti
4450: 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  on(sqlite3 *db){
4460: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
4470: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
4480: 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  (db);.  for(i=0;
4490: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
44a0: 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20  {.    Db *pDb = 
44b0: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
44c0: 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
44d0: 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  a ){.      sqlit
44e0: 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44  e3SchemaClear(pD
44f0: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
4500: 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61   }.  }.  db->fla
4510: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
4520: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73  ternChanges;.  s
4530: 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b  qlite3VtabUnlock
4540: 4c 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69  List(db);.  sqli
4550: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
4560: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  (db);.  sqlite3C
4570: 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41  ollapseDatabaseA
4580: 72 72 61 79 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a  rray(db);.}../*.
4590: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
45a0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
45b0: 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a   commit occurs..
45c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
45d0: 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
45e0: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
45f0: 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  ){.  db->flags &
4600: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
4610: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
4620: 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20  * Delete memory 
4630: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
4640: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f  e column names o
4650: 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
4660: 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e  w (the.** Table.
4670: 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a  aCol[] array)..*
4680: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
4690: 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
46a0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
46b0: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69  le *pTable){.  i
46c0: 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  nt i;.  Column *
46d0: 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  pCol;.  assert( 
46e0: 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69  pTable!=0 );.  i
46f0: 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c  f( (pCol = pTabl
4700: 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20  e->aCol)!=0 ){. 
4710: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
4720: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  able->nCol; i++,
4730: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
4740: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4750: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCol->zName);.
4760: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
4770: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  rDelete(db, pCol
4780: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
4790: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
47a0: 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a  , pCol->zColl);.
47b0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
47c0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
47d0: 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d  le->aCol);.  }.}
47e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
47f0: 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73  he memory data s
4800: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
4810: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
4820: 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e  ven.** Table.  N
4830: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
4840: 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68  de to disk by th
4850: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
4860: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a  * This routine j
4870: 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20  ust deletes the 
4880: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20  data structure. 
4890: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c   It does not unl
48a0: 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ink.** the table
48b0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
48c0: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
48d0: 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65  ble.  But it doe
48e0: 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d  s destroy.** mem
48f0: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f  ory structures o
4900: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e  f the indices an
4910: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  d foreign keys a
4920: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
4930: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  ** the table..**
4940: 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72 61 6d  .** The db param
4950: 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e 61 6c  eter is optional
4960: 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65 64 20  .  It is needed 
4970: 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  if the Table obj
4980: 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ect .** contains
4990: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
49a0: 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a 65 63  y.  (Table objec
49b0: 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ts in the schema
49c0: 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c   do not use.** l
49d0: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2c  ookaside memory,
49e0: 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65 6d 65   but some epheme
49f0: 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  ral Table object
4a00: 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a 2a  s do.)  Or the.*
4a10: 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 63  * db parameter c
4a20: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
4a30: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
4a40: 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20   to measure the 
4a50: 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20 62  memory.** used b
4a60: 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  y the Table obje
4a70: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
4a80: 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  id SQLITE_NOINLI
4a90: 4e 45 20 64 65 6c 65 74 65 54 61 62 6c 65 28 73  NE deleteTable(s
4aa0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
4ab0: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e  e *pTable){.  In
4ac0: 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e  dex *pIndex, *pN
4ad0: 65 78 74 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  ext;.  TESTONLY(
4ae0: 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 3b   int nLookaside;
4af0: 20 29 20 2f 2a 20 55 73 65 64 20 74 6f 20 76 65   ) /* Used to ve
4b00: 72 69 66 79 20 6c 6f 6f 6b 61 73 69 64 65 20 6e  rify lookaside n
4b10: 6f 74 20 75 73 65 64 20 66 6f 72 20 73 63 68 65  ot used for sche
4b20: 6d 61 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f  ma */..  /* Reco
4b30: 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rd the number of
4b40: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f   outstanding loo
4b50: 6b 61 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f  kaside allocatio
4b60: 6e 73 20 69 6e 20 73 63 68 65 6d 61 20 54 61 62  ns in schema Tab
4b70: 6c 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74  les.  ** prior t
4b80: 6f 20 64 6f 69 6e 67 20 61 6e 79 20 66 72 65 65  o doing any free
4b90: 28 29 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20  () operations.  
4ba0: 53 69 6e 63 65 20 73 63 68 65 6d 61 20 54 61 62  Since schema Tab
4bb0: 6c 65 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20  les do not use. 
4bc0: 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74   ** lookaside, t
4bd0: 68 69 73 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c  his number shoul
4be0: 64 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f  d not change. */
4bf0: 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 6e 4c 6f  .  TESTONLY( nLo
4c00: 6f 6b 61 73 69 64 65 20 3d 20 28 64 62 20 26 26  okaside = (db &&
4c10: 20 28 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61   (pTable->tabFla
4c20: 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
4c30: 6c 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20  l)==0) ?.       
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c50: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4c60: 6e 4f 75 74 20 3a 20 30 20 29 3b 0a 0a 20 20 2f  nOut : 0 );..  /
4c70: 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64  * Delete all ind
4c80: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
4c90: 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e  with this table.
4ca0: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78   */.  for(pIndex
4cb0: 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65   = pTable->pInde
4cc0: 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
4cd0: 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  x=pNext){.    pN
4ce0: 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  ext = pIndex->pN
4cf0: 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ext;.    assert(
4d00: 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
4d10: 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d  ==pTable->pSchem
4d20: 61 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 49  a.         || (I
4d30: 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29  sVirtual(pTable)
4d40: 20 26 26 20 70 49 6e 64 65 78 2d 3e 69 64 78 54   && pIndex->idxT
4d50: 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54  ype!=SQLITE_IDXT
4d60: 59 50 45 5f 41 50 50 44 45 46 29 20 29 3b 0a 20  YPE_APPDEF) );. 
4d70: 20 20 20 69 66 28 20 28 64 62 3d 3d 30 20 7c 7c     if( (db==0 ||
4d80: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4d90: 64 3d 3d 30 29 20 26 26 20 21 49 73 56 69 72 74  d==0) && !IsVirt
4da0: 75 61 6c 28 70 54 61 62 6c 65 29 20 29 7b 0a 20  ual(pTable) ){. 
4db0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
4dc0: 20 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65   = pIndex->zName
4dd0: 3b 20 0a 20 20 20 20 20 20 54 45 53 54 4f 4e 4c  ; .      TESTONL
4de0: 59 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64 20  Y ( Index *pOld 
4df0: 3d 20 29 20 73 71 6c 69 74 65 33 48 61 73 68 49  = ) sqlite3HashI
4e00: 6e 73 65 72 74 28 0a 20 20 20 20 20 20 20 20 20  nsert(.         
4e10: 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61  &pIndex->pSchema
4e20: 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65  ->idxHash, zName
4e30: 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
4e40: 20 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d 30     assert( db==0
4e50: 20 7c 7c 20 73 71 6c 69 74 65 33 53 63 68 65 6d   || sqlite3Schem
4e60: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
4e70: 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  , pIndex->pSchem
4e80: 61 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  a) );.      asse
4e90: 72 74 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65 78  rt( pOld==pIndex
4ea0: 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20   || pOld==0 );. 
4eb0: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64     }.    freeInd
4ec0: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
4ed0: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
4ee0: 20 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79   any foreign key
4ef0: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  s attached to th
4f00: 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73  is table. */.  s
4f10: 71 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28 64  qlite3FkDelete(d
4f20: 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f  b, pTable);..  /
4f30: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62  * Delete the Tab
4f40: 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73  le structure its
4f50: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  elf..  */.  sqli
4f60: 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  te3DeleteColumnN
4f70: 61 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29  ames(db, pTable)
4f80: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
4f90: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  e(db, pTable->zN
4fa0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
4fb0: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
4fc0: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71  ->zColAff);.  sq
4fd0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
4fe0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53  e(db, pTable->pS
4ff0: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
5000: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
5010: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65  db, pTable->pChe
5020: 63 6b 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ck);.#ifndef SQL
5030: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
5040: 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 56  TABLE.  sqlite3V
5050: 74 61 62 43 6c 65 61 72 28 64 62 2c 20 70 54 61  tabClear(db, pTa
5060: 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  ble);.#endif.  s
5070: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5080: 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20   pTable);..  /* 
5090: 56 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20 6c  Verify that no l
50a0: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20  ookaside memory 
50b0: 77 61 73 20 75 73 65 64 20 62 79 20 73 63 68 65  was used by sche
50c0: 6d 61 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61  ma tables */.  a
50d0: 73 73 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64  ssert( nLookasid
50e0: 65 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69  e==0 || nLookasi
50f0: 64 65 3d 3d 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  de==db->lookasid
5100: 65 2e 6e 4f 75 74 20 29 3b 0a 7d 0a 76 6f 69 64  e.nOut );.}.void
5110: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
5120: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
5130: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
5140: 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c  .  /* Do not del
5150: 65 74 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e  ete the table un
5160: 74 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63  til the referenc
5170: 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  e count reaches 
5180: 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 21  zero. */.  if( !
5190: 70 54 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b  pTable ) return;
51a0: 0a 20 20 69 66 28 20 28 28 21 64 62 20 7c 7c 20  .  if( ((!db || 
51b0: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
51c0: 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54 61 62 6c  ==0) && (--pTabl
51d0: 65 2d 3e 6e 54 61 62 52 65 66 29 3e 30 29 20 29  e->nTabRef)>0) )
51e0: 20 72 65 74 75 72 6e 3b 0a 20 20 64 65 6c 65 74   return;.  delet
51f0: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 6c  eTable(db, pTabl
5200: 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e  e);.}.../*.** Un
5210: 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74  link the given t
5220: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61  able from the ha
5230: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68  sh tables and th
5240: 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  e delete the.** 
5250: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
5260: 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64  with all its ind
5270: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
5280: 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   keys..*/.void s
5290: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
52a0: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
52b0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
52c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
52d0: 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  bName){.  Table 
52e0: 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  *p;.  Db *pDb;..
52f0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
5300: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
5310: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
5320: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
5330: 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61 73  zTabName );.  as
5340: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
5350: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
5360: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 74 65   iDb, 0) );.  te
5370: 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61 6d 65  stcase( zTabName
5380: 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a 65  [0]==0 );  /* Ze
5390: 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65 20  ro-length table 
53a0: 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77 65  names are allowe
53b0: 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62  d */.  pDb = &db
53c0: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20  ->aDb[iDb];.  p 
53d0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
53e0: 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  ert(&pDb->pSchem
53f0: 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62  a->tblHash, zTab
5400: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Name, 0);.  sqli
5410: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
5420: 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  b, p);.  db->fla
5430: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
5440: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
5450: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b  *.** Given a tok
5460: 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72  en, return a str
5470: 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74  ing that consist
5480: 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66  s of the text of
5490: 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20   that.** token. 
54a0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
54b0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
54c0: 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65  ng.** is obtaine
54d0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
54e0: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
54f0: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
5500: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
5510: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75  on..**.** Any qu
5520: 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28 65  otation marks (e
5530: 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61 6d  x:  "name", 'nam
5540: 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60  e', [name], or `
5550: 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20 73  name`) that.** s
5560: 75 72 72 6f 75 6e 64 20 74 68 65 20 62 6f 64 79  urround the body
5570: 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 61 72   of the token ar
5580: 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a  e removed..**.**
5590: 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65   Tokens are ofte
55a0: 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20  n just pointers 
55b0: 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
55c0: 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73  l SQL text and s
55d0: 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30  o.** are not \00
55e0: 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64  0 terminated and
55f0: 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74   are not persist
5600: 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ent.  The return
5610: 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20  ed string.** is 
5620: 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20  \000 terminated 
5630: 61 6e 64 20 69 73 20 70 65 72 73 69 73 74 65 6e  and is persisten
5640: 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  t..*/.char *sqli
5650: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
5660: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f  (sqlite3 *db, To
5670: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63  ken *pName){.  c
5680: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
5690: 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
56a0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
56b0: 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61  StrNDup(db, (cha
56c0: 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  r*)pName->z, pNa
56d0: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69  me->n);.    sqli
56e0: 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  te3Dequote(zName
56f0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
5700: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  zName = 0;.  }. 
5710: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
5720: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
5730: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
5740: 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64  able stored in d
5750: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69  atabase number i
5760: 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  Db for.** writin
5770: 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  g. The table is 
5780: 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72  opened using cur
5790: 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  sor 0..*/.void s
57a0: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
57b0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20  Table(Parse *p, 
57c0: 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
57d0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
57e0: 56 64 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  Vdbe(p);.  sqlit
57f0: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  e3TableLock(p, i
5800: 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  Db, MASTER_ROOT,
5810: 20 31 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 29   1, MASTER_NAME)
5820: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
5830: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f  ddOp4Int(v, OP_O
5840: 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53  penWrite, 0, MAS
5850: 54 45 52 5f 52 4f 4f 54 2c 20 69 44 62 2c 20 35  TER_ROOT, iDb, 5
5860: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 54 61 62  );.  if( p->nTab
5870: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54  ==0 ){.    p->nT
5880: 61 62 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ab = 1;.  }.}../
5890: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
58a0: 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  Name points to a
58b0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
58c0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
58d0: 67 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66  g the name.** of
58e0: 20 61 20 64 61 74 61 62 61 73 65 20 28 22 6d 61   a database ("ma
58f0: 69 6e 22 2c 20 22 74 65 6d 70 22 20 6f 72 20 74  in", "temp" or t
5900: 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74  he name of an at
5910: 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73  tached db). This
5920: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
5930: 75 72 6e 73 20 74 68 65 20 69 6e 64 65 78 20 6f  urns the index o
5940: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61  f the named data
5950: 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b  base in db->aDb[
5960: 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20 69 66 20 74  ], or.** -1 if t
5970: 68 65 20 6e 61 6d 65 64 20 64 62 20 63 61 6e 6e  he named db cann
5980: 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
5990: 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44  int sqlite3FindD
59a0: 62 4e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64  bName(sqlite3 *d
59b0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
59c0: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
59d0: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   -1;         /* 
59e0: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
59f0: 2a 2f 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  */.  if( zName )
5a00: 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 3b 0a 20  {.    Db *pDb;. 
5a10: 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44     for(i=(db->nD
5a20: 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61  b-1), pDb=&db->a
5a30: 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Db[i]; i>=0; i--
5a40: 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  , pDb--){.      
5a50: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
5a60: 72 49 43 6d 70 28 70 44 62 2d 3e 7a 44 62 53 4e  rICmp(pDb->zDbSN
5a70: 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 20 62 72  ame, zName) ) br
5a80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
5a90: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a   return i;.}../*
5aa0: 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70  .** The token *p
5ab0: 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Name contains th
5ac0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61  e name of a data
5ad0: 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d 61  base (either "ma
5ae0: 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22  in" or.** "temp"
5af0: 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   or the name of 
5b00: 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e  an attached db).
5b10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
5b20: 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64  turns the.** ind
5b30: 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  ex of the named 
5b40: 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e  database in db->
5b50: 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20  aDb[], or -1 if 
5b60: 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a  the named db .**
5b70: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
5b80: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
5b90: 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64  indDb(sqlite3 *d
5ba0: 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  b, Token *pName)
5bb0: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
5bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
5be0: 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  base number */. 
5bf0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c10: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65        /* Name we
5c20: 20 61 72 65 20 73 65 61 72 63 68 69 6e 67 20 66   are searching f
5c30: 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20  or */.  zName = 
5c40: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
5c50: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
5c60: 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 46 69  .  i = sqlite3Fi
5c70: 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 4e 61  ndDbName(db, zNa
5c80: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
5c90: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
5ca0: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a  .  return i;.}..
5cb0: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20  /* The table or 
5cc0: 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20  view or trigger 
5cd0: 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64 20 74  name is passed t
5ce0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76  o this routine v
5cf0: 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61  ia tokens.** pNa
5d00: 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20  me1 and pName2. 
5d10: 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  If the table nam
5d20: 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c  e was fully qual
5d30: 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70  ified, for examp
5d40: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45  le:.**.** CREATE
5d50: 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28   TABLE xxx.yyy (
5d60: 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65  ...);.** .** The
5d70: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
5d80: 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61  to "xxx" and pNa
5d90: 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68  me2 "yyy". On th
5da0: 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a  e other hand if.
5db0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  ** the table nam
5dc0: 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71  e is not fully q
5dd0: 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a  ualified, i.e.:.
5de0: 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42  **.** CREATE TAB
5df0: 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a  LE yyy(...);.**.
5e00: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
5e10: 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61  s set to "yyy" a
5e20: 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e  nd pName2 is "".
5e30: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
5e40: 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70 70  ine sets the *pp
5e50: 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74  Unqual pointer t
5e60: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74  o point at the t
5e70: 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a  oken (pName1 or.
5e80: 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20  ** pName2) that 
5e90: 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61  stores the unqua
5ea0: 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d  lified table nam
5eb0: 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66  e.  The index of
5ec0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
5ed0: 20 22 78 78 78 22 20 69 73 20 72 65 74 75 72 6e   "xxx" is return
5ee0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
5ef0: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20  e3TwoPartName(. 
5f00: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
5f10: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
5f20: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
5f30: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
5f40: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
5f50: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78       /* The "xxx
5f60: 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78  " in the name "x
5f70: 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22  xx.yyy" or "xxx"
5f80: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
5f90: 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me2,      /* The
5fa0: 20 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61   "yyy" in the na
5fb0: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a  me "xxx.yyy" */.
5fc0: 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61    Token **pUnqua
5fd0: 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  l     /* Write t
5fe0: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f  he unqualified o
5ff0: 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20  bject name here 
6000: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b  */.){.  int iDb;
6010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6020: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
6030: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65  holding the obje
6040: 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ct */.  sqlite3 
6050: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
6060: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61  ;..  assert( pNa
6070: 6d 65 32 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  me2!=0 );.  if( 
6080: 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20  pName2->n>0 ){. 
6090: 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e     if( db->init.
60a0: 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20 20 73  busy ) {.      s
60b0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
60c0: 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74 20  Parse, "corrupt 
60d0: 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20  database");.    
60e0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
60f0: 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20   }.    *pUnqual 
6100: 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44  = pName2;.    iD
6110: 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
6120: 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20  b(db, pName1);. 
6130: 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a     if( iDb<0 ){.
6140: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
6150: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
6160: 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20  nknown database 
6170: 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  %T", pName1);.  
6180: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
6190: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
61a0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e    assert( db->in
61b0: 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d  it.iDb==0 || db-
61c0: 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 28 64  >init.busy || (d
61d0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
61e0: 45 5f 56 61 63 75 75 6d 29 21 3d 30 29 3b 0a 20  E_Vacuum)!=0);. 
61f0: 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69     iDb = db->ini
6200: 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71  t.iDb;.    *pUnq
6210: 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20  ual = pName1;.  
6220: 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a  }.  return iDb;.
6230: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
6240: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
6250: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54   check if the UT
6260: 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  F-8 string zName
6270: 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75   is a legal.** u
6280: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
6290: 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61  for a new schema
62a0: 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20   object (table, 
62b0: 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a  index, view or.*
62c0: 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20  * trigger). All 
62d0: 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20  names are legal 
62e0: 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61  except those tha
62f0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  t begin with the
6300: 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69   string.** "sqli
6310: 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20  te_" (in upper, 
6320: 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63  lower or mixed c
6330: 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69  ase). This porti
6340: 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70  on of the namesp
6350: 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76  ace.** is reserv
6360: 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ed for internal 
6370: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
6380: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
6390: 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  me(Parse *pParse
63a0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
63b0: 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ame){.  if( !pPa
63c0: 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  rse->db->init.bu
63d0: 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65  sy && pParse->ne
63e0: 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20  sted==0 .       
63f0: 20 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64     && (pParse->d
6400: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
6410: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d  E_WriteSchema)==
6420: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30  0.          && 0
6430: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
6440: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
6450: 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71  _", 7) ){.    sq
6460: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6470: 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61  arse, "object na
6480: 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  me reserved for 
6490: 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73  internal use: %s
64a0: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ", zName);.    r
64b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
64c0: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
64d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
64e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
64f0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
6500: 78 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a  x of a table.*/.
6510: 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 50 72  Index *sqlite3Pr
6520: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 54 61  imaryKeyIndex(Ta
6530: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e  ble *pTab){.  In
6540: 64 65 78 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  dex *p;.  for(p=
6550: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20  pTab->pIndex; p 
6560: 26 26 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79  && !IsPrimaryKey
6570: 49 6e 64 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70  Index(p); p=p->p
6580: 4e 65 78 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e  Next){}.  return
6590: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   p;.}../*.** Ret
65a0: 75 72 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f  urn the column o
65b0: 66 20 69 6e 64 65 78 20 70 49 64 78 20 74 68 61  f index pIdx tha
65c0: 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
65d0: 20 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e   table.** column
65e0: 20 69 43 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d   iCol.  Return -
65f0: 31 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  1 if not found..
6600: 2a 2f 0a 69 31 36 20 73 71 6c 69 74 65 33 43 6f  */.i16 sqlite3Co
6610: 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65  lumnOfIndex(Inde
6620: 78 20 2a 70 49 64 78 2c 20 69 31 36 20 69 43 6f  x *pIdx, i16 iCo
6630: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
6640: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
6650: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
6660: 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64     if( iCol==pId
6670: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29  x->aiColumn[i] )
6680: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
6690: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
66a0: 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74  *.** Begin const
66b0: 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ructing a new ta
66c0: 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
66d0: 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54  on in memory.  T
66e0: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
66f0: 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61  rst of several a
6700: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74  ction routines t
6710: 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69  hat get called i
6720: 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f  n response.** to
6730: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
6740: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70  statement.  In p
6750: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20  articular, this 
6760: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
6770: 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e  d.** after seein
6780: 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45  g tokens "CREATE
6790: 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e  " and "TABLE" an
67a0: 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  d the table name
67b0: 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20  . The isTemp.** 
67c0: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
67d0: 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  the table should
67e0: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
67f0: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
6800: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73  base.** file ins
6810: 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d  tead of in the m
6820: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
6830: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
6840: 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a  ally the case.**
6850: 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22   when the "TEMP"
6860: 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20   or "TEMPORARY" 
6870: 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69  keyword occurs i
6880: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45  n between.** CRE
6890: 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a  ATE and TABLE..*
68a0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62  *.** The new tab
68b0: 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69  le record is ini
68c0: 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74  tialized and put
68d0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   in pParse->pNew
68e0: 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72  Table..** As mor
68f0: 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  e of the CREATE 
6900: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
6910: 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74  is parsed, addit
6920: 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20  ional action.** 
6930: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65  routines will be
6940: 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d   called to add m
6950: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
6960: 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a  to this record..
6970: 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
6980: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
6990: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
69a0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
69b0: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
69c0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
69d0: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
69e0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
69f0: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
6a00: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61  .void sqlite3Sta
6a10: 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  rtTable(.  Parse
6a20: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
6a30: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
6a40: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
6a50: 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72  ,   /* First par
6a60: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
6a70: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
6a80: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
6a90: 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f  Name2,   /* Seco
6aa0: 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  nd part of the n
6ab0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
6ac0: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e   or view */.  in
6ad0: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f  t isTemp,      /
6ae0: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
6af0: 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a  s a TEMP table *
6b00: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20  /.  int isView, 
6b10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
6b20: 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a  this is a VIEW *
6b30: 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61  /.  int isVirtua
6b40: 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  l,   /* True if 
6b50: 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41  this is a VIRTUA
6b60: 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  L table */.  int
6b70: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a   noErr        /*
6b80: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
6b90: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
6ba0: 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
6bb0: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61  e *pTable;.  cha
6bc0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a  r *zName = 0; /*
6bd0: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
6be0: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
6bf0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
6c00: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
6c10: 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20   *v;.  int iDb; 
6c20: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
6c30: 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72  ase number to cr
6c40: 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  eate the table i
6c50: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
6c60: 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  ame;    /* Unqua
6c70: 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
6c80: 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61  he table to crea
6c90: 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d  te */..  if( db-
6ca0: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 64 62  >init.busy && db
6cb0: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d  ->init.newTnum==
6cc0: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63  1 ){.    /* Spec
6cd0: 69 61 6c 20 63 61 73 65 3a 20 20 50 61 72 73 69  ial case:  Parsi
6ce0: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
6cf0: 73 74 65 72 20 6f 72 20 73 71 6c 69 74 65 5f 74  ster or sqlite_t
6d00: 65 6d 70 5f 6d 61 73 74 65 72 20 73 63 68 65 6d  emp_master schem
6d10: 61 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 64  a */.    iDb = d
6d20: 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20  b->init.iDb;.   
6d30: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
6d40: 44 62 53 74 72 44 75 70 28 64 62 2c 20 53 43 48  DbStrDup(db, SCH
6d50: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b  EMA_TABLE(iDb));
6d60: 0a 20 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61  .    pName = pNa
6d70: 6d 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me1;.  }else{.  
6d80: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
6d90: 63 61 73 65 20 2a 2f 0a 20 20 20 20 69 44 62 20  case */.    iDb 
6da0: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
6db0: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
6dc0: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
6dd0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44  ame);.    if( iD
6de0: 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
6df0: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
6e00: 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20  DB && isTemp && 
6e10: 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69  pName2->n>0 && i
6e20: 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f  Db!=1 ){.      /
6e30: 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
6e40: 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20  temp table, the 
6e50: 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  name may not be 
6e60: 71 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73  qualified. Unles
6e70: 73 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  s .      ** the 
6e80: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73  database name is
6e90: 20 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20   "temp" anyway. 
6ea0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
6eb0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6ec0: 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62  , "temporary tab
6ed0: 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
6ee0: 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20  unqualified");. 
6ef0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
6f00: 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54   }.    if( !OMIT
6f10: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
6f20: 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 20 20 20  p ) iDb = 1;.   
6f30: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
6f40: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
6f50: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  , pName);.  }.  
6f60: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
6f70: 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 69  en = *pName;.  i
6f80: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
6f90: 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49  turn;.  if( SQLI
6fa0: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
6fb0: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
6fc0: 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
6fd0: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
6fe0: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
6ff0: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69    if( db->init.i
7000: 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d  Db==1 ) isTemp =
7010: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
7020: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
7030: 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20  ATION.  assert( 
7040: 69 73 54 65 6d 70 3d 3d 30 20 7c 7c 20 69 73 54  isTemp==0 || isT
7050: 65 6d 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  emp==1 );.  asse
7060: 72 74 28 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c  rt( isView==0 ||
7070: 20 69 73 56 69 65 77 3d 3d 31 20 29 3b 0a 20 20   isView==1 );.  
7080: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
7090: 73 74 20 75 38 20 61 43 6f 64 65 5b 5d 20 3d 20  st u8 aCode[] = 
70a0: 7b 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  {.       SQLITE_
70b0: 43 52 45 41 54 45 5f 54 41 42 4c 45 2c 0a 20 20  CREATE_TABLE,.  
70c0: 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41       SQLITE_CREA
70d0: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 2c 0a 20  TE_TEMP_TABLE,. 
70e0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45        SQLITE_CRE
70f0: 41 54 45 5f 56 49 45 57 2c 0a 20 20 20 20 20 20  ATE_VIEW,.      
7100: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
7110: 45 4d 50 5f 56 49 45 57 0a 20 20 20 20 7d 3b 0a  EMP_VIEW.    };.
7120: 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20      char *zDb = 
7130: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
7140: 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  SName;.    if( s
7150: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
7160: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
7170: 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
7180: 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20  BLE(isTemp), 0, 
7190: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
71a0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
71b0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
71c0: 69 66 28 20 21 69 73 56 69 72 74 75 61 6c 20 26  if( !isVirtual &
71d0: 26 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  & sqlite3AuthChe
71e0: 63 6b 28 70 50 61 72 73 65 2c 20 28 69 6e 74 29  ck(pParse, (int)
71f0: 61 43 6f 64 65 5b 69 73 54 65 6d 70 2b 32 2a 69  aCode[isTemp+2*i
7200: 73 56 69 65 77 5d 2c 0a 20 20 20 20 20 20 20 20  sView],.        
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
7230: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
7240: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
7250: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
7260: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
7270: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
7280: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  the new table na
7290: 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c  me does not coll
72a0: 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73  ide with an exis
72b0: 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
72c0: 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e  or table name in
72d0: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
72e0: 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72  se.  Issue an er
72f0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20  ror message if. 
7300: 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54 68 65   ** it does. The
7310: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66   exception is if
7320: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 62   the statement b
7330: 65 69 6e 67 20 70 61 72 73 65 64 20 77 61 73 20  eing parsed was 
7340: 70 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61  passed.  ** to a
7350: 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72  n sqlite3_declar
7360: 65 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e 20 49  e_vtab() call. I
7370: 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79  n that case only
7380: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
7390: 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70 65 73  s.  ** and types
73a0: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 73   will be used, s
73b0: 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  o there is no ne
73c0: 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6e  ed to test for n
73d0: 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f  amespace.  ** co
73e0: 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  llisions..  */. 
73f0: 20 69 66 28 20 21 49 4e 5f 44 45 43 4c 41 52 45   if( !IN_DECLARE
7400: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 63 68 61  _VTAB ){.    cha
7410: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
7420: 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  [iDb].zDbSName;.
7430: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
7440: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
7450: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
7460: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
7470: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
7480: 20 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d    }.    pTable =
7490: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
74a0: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  e(db, zName, zDb
74b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  );.    if( pTabl
74c0: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  e ){.      if( !
74d0: 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20  noErr ){.       
74e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
74f0: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
7500: 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %T already exist
7510: 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  s", pName);.    
7520: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7530: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
7540: 69 74 2e 62 75 73 79 20 7c 7c 20 43 4f 52 52 55  it.busy || CORRU
7550: 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 20  PT_DB );.       
7560: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
7570: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
7580: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
7590: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
75a0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
75b0: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
75c0: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
75d0: 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29  zName, zDb)!=0 )
75e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
75f0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7600: 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
7610: 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64  y an index named
7620: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
7630: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
7640: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
7650: 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20  }.  }..  pTable 
7660: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
7670: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
7680: 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20  (Table));.  if( 
7690: 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  pTable==0 ){.   
76a0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
76b0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
76c0: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
76d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
76e0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
76f0: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65  r++;.    goto be
7700: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7710: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a  .  }.  pTable->z
7720: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
7730: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
7740: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53  -1;.  pTable->pS
7750: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
7760: 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
7770: 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66 20  pTable->nTabRef 
7780: 3d 20 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  = 1;.  pTable->n
7790: 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
77a0: 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
77b0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
77c0: 35 37 36 29 20 29 3b 0a 20 20 61 73 73 65 72 74  576) );.  assert
77d0: 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ( pParse->pNewTa
77e0: 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72  ble==0 );.  pPar
77f0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
7800: 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66  pTable;..  /* If
7810: 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 67   this is the mag
7820: 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  ic sqlite_sequen
7830: 63 65 20 74 61 62 6c 65 20 75 73 65 64 20 62 79  ce table used by
7840: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a   autoincrement,.
7850: 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72 64    ** then record
7860: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
7870: 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  is table in the 
7880: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74  main database st
7890: 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20  ructure.  ** so 
78a0: 74 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e 20  that INSERT can 
78b0: 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 65  find the table e
78c0: 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e  asily..  */.#ifn
78d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
78e0: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
78f0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73  if( !pParse->nes
7900: 74 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a 4e  ted && strcmp(zN
7910: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71  ame, "sqlite_seq
7920: 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  uence")==0 ){.  
7930: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7940: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
7950: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
7960: 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68      pTable->pSch
7970: 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20 70  ema->pSeqTab = p
7980: 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69  Table;.  }.#endi
7990: 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  f..  /* Begin ge
79a0: 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64  nerating the cod
79b0: 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65  e that will inse
79c0: 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  rt the table rec
79d0: 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ord into.  ** th
79e0: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
79f0: 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20  table.  Note in 
7a00: 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20  particular that 
7a10: 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64  we must go ahead
7a20: 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61  .  ** and alloca
7a30: 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  te the record nu
7a40: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
7a50: 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42  le entry now.  B
7a60: 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50  efore any.  ** P
7a70: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
7a80: 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72  IQUE keywords ar
7a90: 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65  e parsed.  Those
7aa0: 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63   keywords will c
7ab0: 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65  ause.  ** indice
7ac0: 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  s to be created 
7ad0: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65  and the table re
7ae0: 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62  cord must come b
7af0: 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20  efore the .  ** 
7b00: 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c  indices.  Hence,
7b10: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
7b20: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
7b30: 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
7b40: 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a  ed.  ** now..  *
7b50: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
7b60: 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73  t.busy && (v = s
7b70: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
7b80: 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  arse))!=0 ){.   
7b90: 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 20 20   int addr1;.    
7ba0: 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a  int fileFormat;.
7bb0: 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72 65      int reg1, re
7bc0: 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 2f 2a  g2, reg3;.    /*
7bd0: 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73 20 61 6e   nullRow[] is an
7be0: 20 4f 50 5f 52 65 63 6f 72 64 20 65 6e 63 6f 64   OP_Record encod
7bf0: 69 6e 67 20 6f 66 20 61 20 72 6f 77 20 63 6f 6e  ing of a row con
7c00: 74 61 69 6e 69 6e 67 20 35 20 4e 55 4c 4c 73 20  taining 5 NULLs 
7c10: 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  */.    static co
7c20: 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c 52 6f 77  nst char nullRow
7c30: 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c 20 30 2c 20  [] = { 6, 0, 0, 
7c40: 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 73  0, 0, 0 };.    s
7c50: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
7c60: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
7c70: 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  , 1, iDb);..#ifn
7c80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7c90: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
7ca0: 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20 29   if( isVirtual )
7cb0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7cc0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
7cd0: 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23  VBegin);.    }.#
7ce0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
7cf0: 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74   the file format
7d00: 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e   and encoding in
7d10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
7d20: 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c  ve not been set,
7d30: 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65   .    ** set the
7d40: 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  m now..    */.  
7d50: 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65 2d    reg1 = pParse-
7d60: 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50  >regRowid = ++pP
7d70: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
7d80: 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e 72  reg2 = pParse->r
7d90: 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73  egRoot = ++pPars
7da0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67  e->nMem;.    reg
7db0: 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  3 = ++pParse->nM
7dc0: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
7dd0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7de0: 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  ReadCookie, iDb,
7df0: 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49 4c   reg3, BTREE_FIL
7e00: 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73  E_FORMAT);.    s
7e10: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
7e20: 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20  ree(v, iDb);.   
7e30: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
7e40: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
7e50: 5f 49 66 2c 20 72 65 67 33 29 3b 20 56 64 62 65  _If, reg3); Vdbe
7e60: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
7e70: 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64   fileFormat = (d
7e80: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
7e90: 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29  E_LegacyFileFmt)
7ea0: 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20  !=0 ?.          
7eb0: 20 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49          1 : SQLI
7ec0: 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d  TE_MAX_FILE_FORM
7ed0: 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  AT;.    sqlite3V
7ee0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7ef0: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
7f00: 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41  BTREE_FILE_FORMA
7f10: 54 2c 20 66 69 6c 65 46 6f 72 6d 61 74 29 3b 0a  T, fileFormat);.
7f20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7f30: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
7f40: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45  ookie, iDb, BTRE
7f50: 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2c  E_TEXT_ENCODING,
7f60: 20 45 4e 43 28 64 62 29 29 3b 0a 20 20 20 20 73   ENC(db));.    s
7f70: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
7f80: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20  re(v, addr1);.. 
7f90: 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20     /* This just 
7fa0: 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d  creates a place-
7fb0: 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e  holder record in
7fc0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
7fd0: 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  er table..    **
7fe0: 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61   The record crea
7ff0: 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ted does not con
8000: 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65  tain anything ye
8010: 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72  t.  It will be r
8020: 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62  eplaced.    ** b
8030: 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79  y the real entry
8040: 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74   in code generat
8050: 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64  ed at sqlite3End
8060: 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a  Table()..    **.
8070: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64      ** The rowid
8080: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74   for the new ent
8090: 72 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  ry is left in re
80a0: 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72  gister pParse->r
80b0: 65 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20  egRowid..    ** 
80c0: 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  The root page nu
80d0: 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20  mber of the new 
80e0: 74 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e  table is left in
80f0: 20 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67   reg pParse->reg
8100: 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65  Root..    ** The
8110: 20 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20   rowid and root 
8120: 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75  page number valu
8130: 65 73 20 61 72 65 20 6e 65 65 64 65 64 20 62 79  es are needed by
8140: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20   the code that. 
8150: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64     ** sqlite3End
8160: 54 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72  Table will gener
8170: 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20  ate..    */.#if 
8180: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8190: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
81a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
81b0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
81c0: 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
81d0: 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a  || isVirtual ){.
81e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
81f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
8200: 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b  teger, 0, reg2);
8210: 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
8220: 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70 50  f.    {.      pP
8230: 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20  arse->addrCrTab 
8240: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
8250: 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  Op2(v, OP_Create
8260: 54 61 62 6c 65 2c 20 69 44 62 2c 20 72 65 67 32  Table, iDb, reg2
8270: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
8280: 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61  ite3OpenMasterTa
8290: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  ble(pParse, iDb)
82a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
82b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
82c0: 77 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29  wRowid, 0, reg1)
82d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
82e0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c  eAddOp4(v, OP_Bl
82f0: 6f 62 2c 20 36 2c 20 72 65 67 33 2c 20 30 2c 20  ob, 6, reg3, 0, 
8300: 6e 75 6c 6c 52 6f 77 2c 20 50 34 5f 53 54 41 54  nullRow, P4_STAT
8310: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
8320: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8330: 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72 65 67 33  _Insert, 0, reg3
8340: 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c  , reg1);.    sql
8350: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
8360: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
8370: 44 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  D);.    sqlite3V
8380: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
8390: 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Close);.  }..  /
83a0: 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72  * Normal (non-er
83b0: 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a  ror) return. */.
83c0: 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20    return;..  /* 
83d0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
83e0: 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65  rs, we jump here
83f0: 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f   */.begin_table_
8400: 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33  error:.  sqlite3
8410: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
8420: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
8430: 2f 2a 20 53 65 74 20 70 72 6f 70 65 72 74 69 65  /* Set propertie
8440: 73 20 6f 66 20 61 20 74 61 62 6c 65 20 63 6f 6c  s of a table col
8450: 75 6d 6e 20 62 61 73 65 64 20 6f 6e 20 74 68 65  umn based on the
8460: 20 28 6d 61 67 69 63 61 6c 29 0a 2a 2a 20 6e 61   (magical).** na
8470: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
8480: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
8490: 45 4e 41 42 4c 45 5f 48 49 44 44 45 4e 5f 43 4f  ENABLE_HIDDEN_CO
84a0: 4c 55 4d 4e 53 0a 76 6f 69 64 20 73 71 6c 69 74  LUMNS.void sqlit
84b0: 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69  e3ColumnProperti
84c0: 65 73 46 72 6f 6d 4e 61 6d 65 28 54 61 62 6c 65  esFromName(Table
84d0: 20 2a 70 54 61 62 2c 20 43 6f 6c 75 6d 6e 20 2a   *pTab, Column *
84e0: 70 43 6f 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c  pCol){.  if( sql
84f0: 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 70 43  ite3_strnicmp(pC
8500: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 22 5f 5f 68 69  ol->zName, "__hi
8510: 64 64 65 6e 5f 5f 22 2c 20 31 30 29 3d 3d 30 20  dden__", 10)==0 
8520: 29 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c  ){.    pCol->col
8530: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
8540: 5f 48 49 44 44 45 4e 3b 0a 20 20 7d 65 6c 73 65  _HIDDEN;.  }else
8550: 20 69 66 28 20 70 54 61 62 20 26 26 20 70 43 6f   if( pTab && pCo
8560: 6c 21 3d 70 54 61 62 2d 3e 61 43 6f 6c 20 26 26  l!=pTab->aCol &&
8570: 20 28 70 43 6f 6c 5b 2d 31 5d 2e 63 6f 6c 46 6c   (pCol[-1].colFl
8580: 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49  ags & COLFLAG_HI
8590: 44 44 45 4e 29 20 29 7b 0a 20 20 20 20 70 54 61  DDEN) ){.    pTa
85a0: 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
85b0: 46 5f 4f 4f 4f 48 69 64 64 65 6e 3b 0a 20 20 7d  F_OOOHidden;.  }
85c0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
85d0: 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75  * Add a new colu
85e0: 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  mn to the table 
85f0: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
8600: 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a  constructed..**.
8610: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
8620: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
8630: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63   once for each c
8640: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
8650: 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  n.** in a CREATE
8660: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
8670: 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  .  sqlite3StartT
8680: 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c  able() gets call
8690: 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67  ed.** first to g
86a0: 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e  et things going.
86b0: 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74    Then this rout
86c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ine is called fo
86d0: 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e  r each.** column
86e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
86f0: 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65  3AddColumn(Parse
8700: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
8710: 2a 70 4e 61 6d 65 2c 20 54 6f 6b 65 6e 20 2a 70  *pName, Token *p
8720: 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Type){.  Table *
8730: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
8740: 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a  ar *z;.  char *z
8750: 54 79 70 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  Type;.  Column *
8760: 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  pCol;.  sqlite3 
8770: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
8780: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
8790: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
87a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66  =0 ) return;.#if
87b0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
87c0: 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c  MN.  if( p->nCol
87d0: 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  +1>db->aLimit[SQ
87e0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
87f0: 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  N] ){.    sqlite
8800: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8810: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
8820: 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a  mns on %s", p->z
8830: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
8840: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  n;.  }.#endif.  
8850: 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  z = sqlite3DbMal
8860: 6c 6f 63 52 61 77 28 64 62 2c 20 70 4e 61 6d 65  locRaw(db, pName
8870: 2d 3e 6e 20 2b 20 70 54 79 70 65 2d 3e 6e 20 2b  ->n + pType->n +
8880: 20 32 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20   2);.  if( z==0 
8890: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 63  ) return;.  memc
88a0: 70 79 28 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  py(z, pName->z, 
88b0: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 7a 5b 70  pName->n);.  z[p
88c0: 4e 61 6d 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  Name->n] = 0;.  
88d0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
88e0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
88f0: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
8900: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
8910: 74 72 69 63 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f  tricmp(z, p->aCo
8920: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
8930: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
8940: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8950: 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d  "duplicate colum
8960: 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b  n name: %s", z);
8970: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
8980: 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
8990: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
89a0: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e  .  }.  if( (p->n
89b0: 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Col & 0x7)==0 ){
89c0: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65  .    Column *aNe
89d0: 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  w;.    aNew = sq
89e0: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
89f0: 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43  b,p->aCol,(p->nC
8a00: 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e  ol+8)*sizeof(p->
8a10: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69  aCol[0]));.    i
8a20: 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
8a30: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8a40: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
8a50: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
8a60: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77    p->aCol = aNew
8a70: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26  ;.  }.  pCol = &
8a80: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d  p->aCol[p->nCol]
8a90: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c  ;.  memset(pCol,
8aa0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43   0, sizeof(p->aC
8ab0: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d  ol[0]));.  pCol-
8ac0: 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 20 73 71  >zName = z;.  sq
8ad0: 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65  lite3ColumnPrope
8ae0: 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 70 2c  rtiesFromName(p,
8af0: 20 70 43 6f 6c 29 3b 0a 20 0a 20 20 69 66 28 20   pCol);. .  if( 
8b00: 70 54 79 70 65 2d 3e 6e 3d 3d 30 20 29 7b 0a 20  pType->n==0 ){. 
8b10: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
8b20: 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66  s no type specif
8b30: 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76  ied, columns hav
8b40: 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66  e the default af
8b50: 66 69 6e 69 74 79 0a 20 20 20 20 2a 2a 20 27 42  finity.    ** 'B
8b60: 4c 4f 42 27 2e 20 2a 2f 0a 20 20 20 20 70 43 6f  LOB'. */.    pCo
8b70: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
8b80: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
8b90: 20 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d     pCol->szEst =
8ba0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
8bb0: 20 7a 54 79 70 65 20 3d 20 7a 20 2b 20 73 71 6c   zType = z + sql
8bc0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20  ite3Strlen30(z) 
8bd0: 2b 20 31 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  + 1;.    memcpy(
8be0: 7a 54 79 70 65 2c 20 70 54 79 70 65 2d 3e 7a 2c  zType, pType->z,
8bf0: 20 70 54 79 70 65 2d 3e 6e 29 3b 0a 20 20 20 20   pType->n);.    
8c00: 7a 54 79 70 65 5b 70 54 79 70 65 2d 3e 6e 5d 20  zType[pType->n] 
8c10: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
8c20: 44 65 71 75 6f 74 65 28 7a 54 79 70 65 29 3b 0a  Dequote(zType);.
8c30: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
8c40: 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69  ty = sqlite3Affi
8c50: 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20  nityType(zType, 
8c60: 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a 20  &pCol->szEst);. 
8c70: 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67     pCol->colFlag
8c80: 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53  s |= COLFLAG_HAS
8c90: 54 59 50 45 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e  TYPE;.  }.  p->n
8ca0: 43 6f 6c 2b 2b 3b 0a 20 20 70 50 61 72 73 65 2d  Col++;.  pParse-
8cb0: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e  >constraintName.
8cc0: 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n = 0;.}../*.** 
8cd0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8ce0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
8cf0: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
8d00: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
8d10: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
8d20: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
8d30: 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63    A "NOT NULL" c
8d40: 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a  onstraint has.**
8d50: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
8d60: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
8d70: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e  utine sets the n
8d80: 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a  otNull flag on.*
8d90: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72  * the column cur
8da0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
8db0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
8dc0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74  id sqlite3AddNot
8dd0: 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72  Null(Parse *pPar
8de0: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
8df0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
8e00: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
8e10: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
8e20: 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43  0 || NEVER(p->nC
8e30: 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a  ol<1) ) return;.
8e40: 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f    p->aCol[p->nCo
8e50: 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28  l-1].notNull = (
8e60: 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f  u8)onError;.}../
8e70: 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f  *.** Scan the co
8e80: 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a  lumn type name z
8e90: 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79  Type (length nTy
8ea0: 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74  pe) and return t
8eb0: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
8ec0: 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a   affinity type..
8ed0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8ee0: 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69  ne does a case-i
8ef0: 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63  ndependent searc
8f00: 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74  h of zType for t
8f10: 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67  he .** substring
8f20: 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s in the followi
8f30: 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65  ng table. If one
8f40: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
8f50: 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20  gs is.** found, 
8f60: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
8f70: 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72 65  g affinity is re
8f80: 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65  turned. If zType
8f90: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72   contains.** mor
8fa0: 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68  e than one of th
8fb0: 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e  e substrings, en
8fc0: 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68 65  tries toward the
8fd0: 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20   top of .** the 
8fe0: 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72  table take prior
8ff0: 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ity. For example
9000: 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27 42  , if zType is 'B
9010: 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c  LOBINT', .** SQL
9020: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
9030: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
9040: 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20 20  ** Substring    
9050: 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d   | Affinity.** -
9060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
9080: 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20 20  ** 'INT'        
9090: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   | SQLITE_AFF_IN
90a0: 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20  TEGER.** 'CHAR' 
90b0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
90c0: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f  AFF_TEXT.** 'CLO
90d0: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
90e0: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
90f0: 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20 53  TEXT'        | S
9100: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
9110: 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20  * 'BLOB'        
9120: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  | SQLITE_AFF_BLO
9130: 42 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20  B.** 'REAL'     
9140: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
9150: 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20  REAL.** 'FLOA'  
9160: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
9170: 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42  FF_REAL.** 'DOUB
9180: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
9190: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a  E_AFF_REAL.**.**
91a0: 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
91b0: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
91c0: 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72  e above table ar
91d0: 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49  e found,.** SQLI
91e0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69  TE_AFF_NUMERIC i
91f0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63  s returned..*/.c
9200: 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e  har sqlite3Affin
9210: 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68  ityType(const ch
9220: 61 72 20 2a 7a 49 6e 2c 20 75 38 20 2a 70 73 7a  ar *zIn, u8 *psz
9230: 45 73 74 29 7b 0a 20 20 75 33 32 20 68 20 3d 20  Est){.  u32 h = 
9240: 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20  0;.  char aff = 
9250: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
9260: 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  IC;.  const char
9270: 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20   *zChar = 0;..  
9280: 61 73 73 65 72 74 28 20 7a 49 6e 21 3d 30 20 29  assert( zIn!=0 )
9290: 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30  ;.  while( zIn[0
92a0: 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c  ] ){.    h = (h<
92b0: 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70  <8) + sqlite3Upp
92c0: 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29  erToLower[(*zIn)
92d0: 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b  &0xff];.    zIn+
92e0: 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28  +;.    if( h==((
92f0: 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31  'c'<<24)+('h'<<1
9300: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29  6)+('a'<<8)+'r')
9310: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
9320: 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20  /* CHAR */.     
9330: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9340: 46 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7a 43  F_TEXT;.      zC
9350: 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d  har = zIn;.    }
9360: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63  else if( h==(('c
9370: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
9380: 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29  +('o'<<8)+'b') )
9390: 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20  {       /* CLOB 
93a0: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
93b0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
93c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
93d0: 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27  =(('t'<<24)+('e'
93e0: 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27  <<16)+('x'<<8)+'
93f0: 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  t') ){       /* 
9400: 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66  TEXT */.      af
9410: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
9420: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
9430: 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29  f( h==(('b'<<24)
9440: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
9450: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
9460: 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20    /* BLOB */.   
9470: 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
9480: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
9490: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
94a0: 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20  AFF_REAL) ){.   
94b0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
94c0: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20  AFF_BLOB;.      
94d0: 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20  if( zIn[0]=='(' 
94e0: 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23  ) zChar = zIn;.#
94f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9500: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
9510: 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  T.    }else if( 
9520: 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27  h==(('r'<<24)+('
9530: 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  e'<<16)+('a'<<8)
9540: 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'l')          /
9550: 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20  * REAL */.      
9560: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
9570: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
9580: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9590: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
95a0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
95b0: 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'f'<<24)+('l'<<1
95c0: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29  6)+('o'<<8)+'a')
95d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f            /* FLO
95e0: 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  A */.        && 
95f0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
9600: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
9610: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9620: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
9630: 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c  e if( h==(('d'<<
9640: 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27  24)+('o'<<16)+('
9650: 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  u'<<8)+'b')     
9660: 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a       /* DOUB */.
9670: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
9680: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
9690: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
96a0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
96b0: 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  L;.#endif.    }e
96c0: 6c 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46  lse if( (h&0x00F
96d0: 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31  FFFFF)==(('i'<<1
96e0: 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29  6)+('n'<<8)+'t')
96f0: 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f   ){    /* INT */
9700: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
9710: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
9720: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9730: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
9740: 20 70 73 7a 45 73 74 20 69 73 20 6e 6f 74 20 4e   pszEst is not N
9750: 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65 73  ULL, store an es
9760: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66 69  timate of the fi
9770: 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a 20  eld size.  The. 
9780: 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20   ** estimate is 
9790: 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20 74  scaled so that t
97a0: 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e  he size of an in
97b0: 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a  teger is 1.  */.
97c0: 20 20 69 66 28 20 70 73 7a 45 73 74 20 29 7b 0a    if( pszEst ){.
97d0: 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 31 3b      *pszEst = 1;
97e0: 20 20 20 2f 2a 20 64 65 66 61 75 6c 74 20 73 69     /* default si
97f0: 7a 65 20 69 73 20 61 70 70 72 6f 78 20 34 20 62  ze is approx 4 b
9800: 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ytes */.    if( 
9810: 61 66 66 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e  aff<SQLITE_AFF_N
9820: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
9830: 69 66 28 20 7a 43 68 61 72 20 29 7b 0a 20 20 20  if( zChar ){.   
9840: 20 20 20 20 20 77 68 69 6c 65 28 20 7a 43 68 61       while( zCha
9850: 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[0] ){.        
9860: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 64    if( sqlite3Isd
9870: 69 67 69 74 28 7a 43 68 61 72 5b 30 5d 29 20 29  igit(zChar[0]) )
9880: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
9890: 74 20 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t v = 0;.       
98a0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74 49       sqlite3GetI
98b0: 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76 29 3b  nt32(zChar, &v);
98c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 20 3d  .            v =
98d0: 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 20 20   v/4 + 1;.      
98e0: 20 20 20 20 20 20 69 66 28 20 76 3e 32 35 35 20        if( v>255 
98f0: 29 20 76 20 3d 20 32 35 35 3b 0a 20 20 20 20 20  ) v = 255;.     
9900: 20 20 20 20 20 20 20 2a 70 73 7a 45 73 74 20 3d         *pszEst =
9910: 20 76 3b 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20   v; /* BLOB(k), 
9920: 56 41 52 43 48 41 52 28 6b 29 2c 20 43 48 41 52  VARCHAR(k), CHAR
9930: 28 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29  (k) -> r=(k/4+1)
9940: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
9950: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
9960: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68   }.          zCh
9970: 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ar++;.        }.
9980: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9990: 20 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 35       *pszEst = 5
99a0: 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58  ;   /* BLOB, TEX
99b0: 54 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20  T, CLOB -> r=5  
99c0: 28 61 70 70 72 6f 78 20 32 30 20 62 79 74 65 73  (approx 20 bytes
99d0: 29 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )*/.      }.    
99e0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  }.  }.  return a
99f0: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ff;.}../*.** The
9a00: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
9a10: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
9a20: 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
9a30: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
9a40: 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61  umn.** of the ta
9a50: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
9a60: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
9a70: 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20  ..**.** Default 
9a80: 76 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e  value expression
9a90: 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61  s must be consta
9aa0: 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78  nt.  Raise an ex
9ab0: 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a  ception if this.
9ac0: 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  ** is not the ca
9ad0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
9ae0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
9af0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
9b00: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
9b10: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
9b20: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
9b30: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
9b40: 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66  id sqlite3AddDef
9b50: 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20  aultValue(Parse 
9b60: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 53 70 61  *pParse, ExprSpa
9b70: 6e 20 2a 70 53 70 61 6e 29 7b 0a 20 20 54 61 62  n *pSpan){.  Tab
9b80: 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20  le *p;.  Column 
9b90: 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33  *pCol;.  sqlite3
9ba0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
9bb0: 62 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  b;.  p = pParse-
9bc0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
9bd0: 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 70 43  ( p!=0 ){.    pC
9be0: 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70  ol = &(p->aCol[p
9bf0: 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20  ->nCol-1]);.    
9c00: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
9c10: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
9c20: 74 69 6f 6e 28 70 53 70 61 6e 2d 3e 70 45 78 70  tion(pSpan->pExp
9c30: 72 2c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  r, db->init.busy
9c40: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
9c50: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9c60: 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75  e, "default valu
9c70: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d  e of column [%s]
9c80: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
9c90: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ",.          pCo
9ca0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  l->zName);.    }
9cb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
9cc0: 20 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69   copy of pExpr i
9cd0: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  s used instead o
9ce0: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20  f the original, 
9cf0: 61 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e  as pExpr contain
9d00: 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e  s.      ** token
9d10: 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
9d20: 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e  volatile memory.
9d30: 20 54 68 65 20 27 73 70 61 6e 27 20 6f 66 20 74   The 'span' of t
9d40: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  he expression.  
9d50: 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
9d60: 65 64 20 62 79 20 70 72 61 67 6d 61 20 74 61 62  ed by pragma tab
9d70: 6c 65 5f 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a  le_info..      *
9d80: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 78 3b 0a  /.      Expr x;.
9d90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
9da0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  rDelete(db, pCol
9db0: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
9dc0: 6d 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69  memset(&x, 0, si
9dd0: 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20 20  zeof(x));.      
9de0: 78 2e 6f 70 20 3d 20 54 4b 5f 53 50 41 4e 3b 0a  x.op = TK_SPAN;.
9df0: 20 20 20 20 20 20 78 2e 75 2e 7a 54 6f 6b 65 6e        x.u.zToken
9e00: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
9e10: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
9e20: 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20  Span->zStart,.  
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e50: 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a    (int)(pSpan->z
9e60: 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74  End - pSpan->zSt
9e70: 61 72 74 29 29 3b 0a 20 20 20 20 20 20 78 2e 70  art));.      x.p
9e80: 4c 65 66 74 20 3d 20 70 53 70 61 6e 2d 3e 70 45  Left = pSpan->pE
9e90: 78 70 72 3b 0a 20 20 20 20 20 20 78 2e 66 6c 61  xpr;.      x.fla
9ea0: 67 73 20 3d 20 45 50 5f 53 6b 69 70 3b 0a 20 20  gs = EP_Skip;.  
9eb0: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
9ec0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
9ed0: 28 64 62 2c 20 26 78 2c 20 45 58 50 52 44 55 50  (db, &x, EXPRDUP
9ee0: 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20  _REDUCE);.      
9ef0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9f00: 2c 20 78 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  , x.u.zToken);. 
9f10: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
9f20: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
9f30: 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a   pSpan->pExpr);.
9f40: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77 61 72  }../*.** Backwar
9f50: 64 73 20 43 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds Compatibility
9f60: 20 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20 48 69   Hack:.** .** Hi
9f70: 73 74 6f 72 69 63 61 6c 20 76 65 72 73 69 6f 6e  storical version
9f80: 73 20 6f 66 20 53 51 4c 69 74 65 20 61 63 63 65  s of SQLite acce
9f90: 70 74 65 64 20 73 74 72 69 6e 67 73 20 61 73 20  pted strings as 
9fa0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 0a  column names in.
9fb0: 2a 2a 20 69 6e 64 65 78 65 73 20 61 6e 64 20 50  ** indexes and P
9fc0: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
9fd0: 72 61 69 6e 74 73 20 61 6e 64 20 69 6e 20 55 4e  raints and in UN
9fe0: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73  IQUE constraints
9ff0: 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  .  Example:.**.*
a000: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
a010: 4c 45 20 78 79 7a 28 61 2c 62 2c 63 2c 64 2c 65  LE xyz(a,b,c,d,e
a020: 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 27 61 27  ,PRIMARY KEY('a'
a030: 29 2c 55 4e 49 51 55 45 28 27 62 27 2c 27 63 27  ),UNIQUE('b','c'
a040: 20 43 4f 4c 4c 41 54 45 20 74 72 69 6d 29 0a 2a   COLLATE trim).*
a050: 2a 20 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  *     CREATE IND
a060: 45 58 20 61 62 63 20 4f 4e 20 78 79 7a 28 27 63  EX abc ON xyz('c
a070: 27 2c 27 64 27 20 44 45 53 43 2c 27 65 27 20 43  ','d' DESC,'e' C
a080: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 44 45  OLLATE nocase DE
a090: 53 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SC);.**.** This 
a0a0: 69 73 20 67 6f 6f 66 79 2e 20 20 42 75 74 20 74  is goofy.  But t
a0b0: 6f 20 70 72 65 73 65 72 76 65 20 62 61 63 6b 77  o preserve backw
a0c0: 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
a0d0: 74 79 20 77 65 20 63 6f 6e 74 69 6e 75 65 20 74  ty we continue t
a0e0: 6f 0a 2a 2a 20 61 63 63 65 70 74 20 69 74 2e 20  o.** accept it. 
a0f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
a100: 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  es the necessary
a110: 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 20 20 49 74   conversion.  It
a120: 20 63 6f 6e 76 65 72 74 73 0a 2a 2a 20 74 68 65   converts.** the
a130: 20 65 78 70 72 65 73 73 69 6f 6e 20 67 69 76 65   expression give
a140: 6e 20 69 6e 20 69 74 73 20 61 72 67 75 6d 65 6e  n in its argumen
a150: 74 20 66 72 6f 6d 20 61 20 54 4b 5f 53 54 52 49  t from a TK_STRI
a160: 4e 47 20 69 6e 74 6f 20 61 20 54 4b 5f 49 44 0a  NG into a TK_ID.
a170: 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ** if the expres
a180: 73 69 6f 6e 20 69 73 20 6a 75 73 74 20 61 20 54  sion is just a T
a190: 4b 5f 53 54 52 49 4e 47 20 77 69 74 68 20 61 6e  K_STRING with an
a1a0: 20 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c 41 54   optional COLLAT
a1b0: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 49 66 20  E clause..** If 
a1c0: 74 68 65 20 65 70 78 72 65 73 73 69 6f 6e 20 69  the epxression i
a1d0: 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72  s anything other
a1e0: 20 74 68 61 6e 20 54 4b 5f 53 54 52 49 4e 47 2c   than TK_STRING,
a1f0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
a200: 69 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  is.** unchanged.
a210: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a220: 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49  sqlite3StringToI
a230: 64 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  d(Expr *p){.  if
a240: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49  ( p->op==TK_STRI
a250: 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 6f 70 20  NG ){.    p->op 
a260: 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c 73 65  = TK_ID;.  }else
a270: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
a280: 4f 4c 4c 41 54 45 20 26 26 20 70 2d 3e 70 4c 65  OLLATE && p->pLe
a290: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  ft->op==TK_STRIN
a2a0: 47 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 65 66  G ){.    p->pLef
a2b0: 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20  t->op = TK_ID;. 
a2c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69   }.}../*.** Desi
a2d0: 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52  gnate the PRIMAR
a2e0: 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61  Y KEY for the ta
a2f0: 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61  ble.  pList is a
a300: 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a   list of names .
a310: 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68  ** of columns th
a320: 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d  at form the prim
a330: 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69  ary key.  If pLi
a340: 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  st is NULL, then
a350: 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63   the.** most rec
a360: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
a370: 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  mn of the table 
a380: 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  is the primary k
a390: 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c  ey..**.** A tabl
a3a0: 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f  e can have at mo
a3b0: 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b  st one primary k
a3c0: 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c  ey.  If the tabl
a3d0: 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a  e already has.**
a3e0: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28   a primary key (
a3f0: 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
a400: 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b  second primary k
a410: 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20  ey) then create 
a420: 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a  an.** error..**.
a430: 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52  ** If the PRIMAR
a440: 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69  Y KEY is on a si
a450: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73  ngle column whos
a460: 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e  e datatype is IN
a470: 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77  TEGER,.** then w
a480: 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73  e will try to us
a490: 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73  e that column as
a4a0: 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74   the rowid.  Set
a4b0: 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79   the Table.iPKey
a4c0: 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
a4d0: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
a4e0: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
a4f0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
a500: 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d  .** INTEGER PRIM
a510: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20  ARY KEY column. 
a520: 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20   Table.iPKey is 
a530: 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65  set to -1 if the
a540: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45  re is.** no INTE
a550: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
a560: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65  .**.** If the ke
a570: 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45  y is not an INTE
a580: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
a590: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75   then create a u
a5a0: 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66  nique.** index f
a5b0: 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20  or the key.  No 
a5c0: 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
a5d0: 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49   for INTEGER PRI
a5e0: 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f  MARY KEYs..*/.vo
a5f0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69  id sqlite3AddPri
a600: 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65  maryKey(.  Parse
a610: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
a620: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
a630: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
a640: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
a650: 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f  f field names to
a660: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
a670: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
a680: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
a690: 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65   with a uniquene
a6a0: 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  ss conflict */. 
a6b0: 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20   int autoInc,   
a6c0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
a6d0: 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  e AUTOINCREMENT 
a6e0: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
a6f0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  nt */.  int sort
a700: 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c  Order     /* SQL
a710: 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51  ITE_SO_ASC or SQ
a720: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a  LITE_SO_DESC */.
a730: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
a740: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
a750: 61 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  able;.  Column *
a760: 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pCol = 0;.  int 
a770: 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20  iCol = -1, i;.  
a780: 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69 66 28  int nTerm;.  if(
a790: 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   pTab==0 ) goto 
a7a0: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
a7b0: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61  ;.  if( pTab->ta
a7c0: 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50  bFlags & TF_HasP
a7d0: 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20 20  rimaryKey ){.   
a7e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a7f0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
a800: 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61  "table \"%s\" ha
a810: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
a820: 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54  primary key", pT
a830: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
a840: 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79  goto primary_key
a850: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61  _exit;.  }.  pTa
a860: 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
a870: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 3b  F_HasPrimaryKey;
a880: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
a890: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
a8a0: 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  ab->nCol - 1;.  
a8b0: 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e    pCol = &pTab->
a8c0: 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  aCol[iCol];.    
a8d0: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
a8e0: 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  = COLFLAG_PRIMKE
a8f0: 59 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 31  Y;.    nTerm = 1
a900: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
a910: 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  Term = pList->nE
a920: 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  xpr;.    for(i=0
a930: 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b  ; i<nTerm; i++){
a940: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 45  .      Expr *pCE
a950: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
a960: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69  rSkipCollate(pLi
a970: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
a980: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a990: 43 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  CExpr!=0 );.    
a9a0: 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54    sqlite3StringT
a9b0: 6f 49 64 28 70 43 45 78 70 72 29 3b 0a 20 20 20  oId(pCExpr);.   
a9c0: 20 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f     if( pCExpr->o
a9d0: 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
a9e0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
a9f0: 7a 43 4e 61 6d 65 20 3d 20 70 43 45 78 70 72 2d  zCName = pCExpr-
aa00: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
aa10: 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
aa20: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
aa30: 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iCol++){.       
aa40: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
aa50: 72 49 43 6d 70 28 7a 43 4e 61 6d 65 2c 20 70 54  rICmp(zCName, pT
aa60: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
aa70: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
aa80: 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26          pCol = &
aa90: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
aaa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
aab0: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol->colFlags |= 
aac0: 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b  COLFLAG_PRIMKEY;
aad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
aae0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
aaf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ab00: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
ab10: 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26 26  ( nTerm==1.   &&
ab20: 20 70 43 6f 6c 0a 20 20 20 26 26 20 73 71 6c 69   pCol.   && sqli
ab30: 74 65 33 53 74 72 49 43 6d 70 28 73 71 6c 69 74  te3StrICmp(sqlit
ab40: 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f  e3ColumnType(pCo
ab50: 6c 2c 22 22 29 2c 20 22 49 4e 54 45 47 45 52 22  l,""), "INTEGER"
ab60: 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72 74 4f  )==0.   && sortO
ab70: 72 64 65 72 21 3d 53 51 4c 49 54 45 5f 53 4f 5f  rder!=SQLITE_SO_
ab80: 44 45 53 43 0a 20 20 29 7b 0a 20 20 20 20 70 54  DESC.  ){.    pT
ab90: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c  ab->iPKey = iCol
aba0: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43  ;.    pTab->keyC
abb0: 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  onf = (u8)onErro
abc0: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  r;.    assert( a
abd0: 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74  utoInc==0 || aut
abe0: 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70  oInc==1 );.    p
abf0: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
ac00: 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f   autoInc*TF_Auto
ac10: 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 20 20 69  increment;.    i
ac20: 66 28 20 70 4c 69 73 74 20 29 20 70 50 61 72 73  f( pList ) pPars
ac30: 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 20  e->iPkSortOrder 
ac40: 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f  = pList->a[0].so
ac50: 72 74 4f 72 64 65 72 3b 0a 20 20 7d 65 6c 73 65  rtOrder;.  }else
ac60: 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a   if( autoInc ){.
ac70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ac80: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
ac90: 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  T.    sqlite3Err
aca0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41  orMsg(pParse, "A
acb0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20  UTOINCREMENT is 
acc0: 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20  only allowed on 
acd0: 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54  an ".       "INT
ace0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
acf0: 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  ");.#endif.  }el
ad00: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  se{.    sqlite3C
ad10: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
ad20: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73  e, 0, 0, 0, pLis
ad30: 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20  t, onError, 0,. 
ad40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad50: 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 6f 72            0, sor
ad60: 74 4f 72 64 65 72 2c 20 30 2c 20 53 51 4c 49 54  tOrder, 0, SQLIT
ad70: 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52  E_IDXTYPE_PRIMAR
ad80: 59 4b 45 59 29 3b 0a 20 20 20 20 70 4c 69 73 74  YKEY);.    pList
ad90: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61   = 0;.  }..prima
ada0: 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73  ry_key_exit:.  s
adb0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
adc0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
add0: 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72   pList);.  retur
ade0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  n;.}../*.** Add 
adf0: 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73  a new CHECK cons
ae00: 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61  traint to the ta
ae10: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
ae20: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
ae30: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ae40: 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61  3AddCheckConstra
ae50: 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
ae60: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
ae70: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
ae80: 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70   Expr *pCheckExp
ae90: 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20  r  /* The check 
aea0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
aeb0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
aec0: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62  OMIT_CHECK.  Tab
aed0: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
aee0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
aef0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
af00: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
af10: 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c  pTab && !IN_DECL
af20: 41 52 45 5f 56 54 41 42 0a 20 20 20 26 26 20 21  ARE_VTAB.   && !
af30: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 65  sqlite3BtreeIsRe
af40: 61 64 6f 6e 6c 79 28 64 62 2d 3e 61 44 62 5b 64  adonly(db->aDb[d
af50: 62 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e 70 42 74  b->init.iDb].pBt
af60: 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  ).  ){.    pTab-
af70: 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65  >pCheck = sqlite
af80: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
af90: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43  pParse, pTab->pC
afa0: 68 65 63 6b 2c 20 70 43 68 65 63 6b 45 78 70 72  heck, pCheckExpr
afb0: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
afc0: 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d  e->constraintNam
afd0: 65 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  e.n ){.      sql
afe0: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
aff0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ame(pParse, pTab
b000: 2d 3e 70 43 68 65 63 6b 2c 20 26 70 50 61 72 73  ->pCheck, &pPars
b010: 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d  e->constraintNam
b020: 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 1);.    }.  }
b030: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
b040: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
b050: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
b060: 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20  , pCheckExpr);. 
b070: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
b080: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  the collation fu
b090: 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nction of the mo
b0a0: 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73  st recently pars
b0b0: 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a  ed table column.
b0c0: 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65  ** to the CollSe
b0d0: 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64  q given..*/.void
b0e0: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61   sqlite3AddColla
b0f0: 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  teType(Parse *pP
b100: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  arse, Token *pTo
b110: 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ken){.  Table *p
b120: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
b130: 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20  r *zColl;       
b140: 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74         /* Dequot
b150: 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  ed name of colla
b160: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f  tion sequence */
b170: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
b180: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
b190: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
b1a0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
b1b0: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64  = p->nCol-1;.  d
b1c0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
b1d0: 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    zColl = sqlite
b1e0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
b1f0: 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66  b, pToken);.  if
b200: 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72  ( !zColl ) retur
b210: 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  n;..  if( sqlite
b220: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
b230: 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Parse, zColl) ){
b240: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
b250: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
b260: 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b  ree(db, p->aCol[
b270: 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70  i].zColl);.    p
b280: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20  ->aCol[i].zColl 
b290: 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20  = zColl;.  .    
b2a0: 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
b2b0: 20 69 73 20 64 65 63 6c 61 72 65 64 20 61 73 20   is declared as 
b2c0: 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20  "<name> PRIMARY 
b2d0: 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70  KEY COLLATE <typ
b2e0: 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  e>",.    ** then
b2f0: 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61   an index may ha
b300: 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  ve been created 
b310: 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62  on this column b
b320: 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
b330: 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20   collation type 
b340: 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65  was added. Corre
b350: 63 74 20 74 68 69 73 20 69 66 20 69 74 20 69 73  ct this if it is
b360: 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a   the case..    *
b370: 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  /.    for(pIdx=p
b380: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
b390: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
b3a0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
b3b0: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d   pIdx->nKeyCol==
b3c0: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
b3d0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
b3e0: 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==i ){.        p
b3f0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d  Idx->azColl[0] =
b400: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
b410: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
b420: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
b430: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
b440: 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  zColl);.  }.}../
b450: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
b460: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 63  on returns the c
b470: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
b480: 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e  e for database n
b490: 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e  ative text.** en
b4a0: 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65  coding identifie
b4b0: 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20  d by the string 
b4c0: 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e  zName, length nN
b4d0: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ame..**.** If th
b4e0: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
b4f0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69  ation sequence i
b500: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c  s not available,
b510: 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   or not availabl
b520: 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61  e.** in the data
b530: 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f  base native enco
b540: 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74  ding, the collat
b550: 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69  ion factory is i
b560: 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71  nvoked to.** req
b570: 75 65 73 74 20 69 74 2e 20 49 66 20 74 68 65 20  uest it. If the 
b580: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
b590: 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c  y does not suppl
b5a0: 79 20 73 75 63 68 20 61 20 73 65 71 75 65 6e 63  y such a sequenc
b5b0: 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65  e,.** and the se
b5c0: 71 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61  quence is availa
b5d0: 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74  ble in another t
b5e0: 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ext encoding, th
b5f0: 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65  en that is.** re
b600: 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a  turned instead..
b610: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73  **.** If no vers
b620: 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75  ions of the requ
b630: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  ested collations
b640: 20 73 65 71 75 65 6e 63 65 20 61 72 65 20 61 76   sequence are av
b650: 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61  ailable, or.** a
b660: 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63  nother error occ
b670: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
b680: 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
b690: 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74 74  or message writt
b6a0: 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73  en into.** pPars
b6b0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
b6c0: 75 74 69 6e 65 20 69 73 20 61 20 77 72 61 70 70  utine is a wrapp
b6d0: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
b6e0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20  3FindCollSeq(). 
b6f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
b700: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c   invokes the col
b710: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
b720: 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c  f the named coll
b730: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
b740: 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e  found.** and gen
b750: 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20  erates an error 
b760: 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53  message..**.** S
b770: 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33  ee also: sqlite3
b780: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73  FindCollSeq(), s
b790: 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71  qlite3GetCollSeq
b7a0: 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  ().*/.CollSeq *s
b7b0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
b7c0: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
b7d0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
b7e0: 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Name){.  sqlite3
b7f0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b800: 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e  b;.  u8 enc = EN
b810: 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74  C(db);.  u8 init
b820: 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  busy = db->init.
b830: 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  busy;.  CollSeq 
b840: 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c  *pColl;..  pColl
b850: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
b860: 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a  llSeq(db, enc, z
b870: 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b  Name, initbusy);
b880: 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79  .  if( !initbusy
b890: 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21   && (!pColl || !
b8a0: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a  pColl->xCmp) ){.
b8b0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
b8c0: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50  te3GetCollSeq(pP
b8d0: 61 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c  arse, enc, pColl
b8e0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20  , zName);.  }.. 
b8f0: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
b900: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
b910: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
b920: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73   increment the s
b930: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a  chema cookie..**
b940: 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63  .** The schema c
b950: 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f  ookie is used to
b960: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20   determine when 
b970: 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74  the schema for t
b980: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
b990: 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65  hanges.  After e
b9a0: 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ach schema chang
b9b0: 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61  e, the cookie va
b9c0: 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  lue.** changes. 
b9d0: 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   When a process 
b9e0: 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20  first reads the 
b9f0: 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64  schema it record
ba00: 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e  s the.** cookie.
ba10: 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68    Thereafter, wh
ba20: 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74  enever it goes t
ba30: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
ba40: 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65  abase,.** it che
ba50: 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  cks the cookie t
ba60: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
ba70: 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63  schema has not c
ba80: 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20  hanged.** since 
ba90: 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64  it was last read
baa0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61  ..**.** This pla
bab0: 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  n is not complet
bac0: 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66  ely bullet-proof
bad0: 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  .  It is possibl
bae0: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68  e for.** the sch
baf0: 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75  ema to change mu
bb00: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64  ltiple times and
bb10: 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20   for the cookie 
bb20: 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63  to be.** set bac
bb30: 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65  k to prior value
bb40: 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68  .  But schema ch
bb50: 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71  anges are infreq
bb60: 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20  uent.** and the 
bb70: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68  probability of h
bb80: 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20  itting the same 
bb90: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20  cookie value is 
bba0: 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65  only.** 1 chance
bbb0: 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65   in 2^32.  So we
bbc0: 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e  're safe enough.
bbd0: 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54  .**.** IMPLEMENT
bbe0: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 33 34 32 33  ATION-OF: R-3423
bbf0: 30 2d 35 36 30 34 39 20 53 51 4c 69 74 65 20 61  0-56049 SQLite a
bc00: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69 6e 63  utomatically inc
bc10: 72 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20 73  rements.** the s
bc20: 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 77 68  chema-version wh
bc30: 65 6e 65 76 65 72 20 74 68 65 20 73 63 68 65 6d  enever the schem
bc40: 61 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a 76 6f  a changes..*/.vo
bc50: 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  id sqlite3Change
bc60: 43 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50  Cookie(Parse *pP
bc70: 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
bc80: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
bc90: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
bca0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
bcb0: 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
bcc0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
bcd0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
bce0: 20 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33   0) );.  sqlite3
bcf0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
bd00: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
bd10: 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45   BTREE_SCHEMA_VE
bd20: 52 53 49 4f 4e 2c 20 0a 20 20 20 20 20 20 20 20  RSION, .        
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
bd40: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
bd50: 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b  ->schema_cookie+
bd60: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61  1);.}../*.** Mea
bd70: 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
bd80: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65  of characters ne
bd90: 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74  eded to output t
bda0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e  he given.** iden
bdb0: 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d  tifier.  The num
bdc0: 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63  ber returned inc
bdd0: 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73  ludes any quotes
bde0: 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65   used.** but doe
bdf0: 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68  s not include th
be00: 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f  e null terminato
be10: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74  r..**.** The est
be20: 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76  imate is conserv
be30: 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74  ative.  It might
be40: 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20   be larger that 
be50: 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c  what is.** reall
be60: 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  y needed..*/.sta
be70: 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e  tic int identLen
be80: 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  gth(const char *
be90: 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66  z){.  int n;.  f
bea0: 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c  or(n=0; *z; n++,
beb0: 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a   z++){.    if( *
bec0: 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d  z=='"' ){ n++; }
bed0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20  .  }.  return n 
bee0: 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  + 2;.}../*.** Th
bef0: 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
bf00: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
bf10: 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66  o an output buff
bf20: 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a  er. The second .
bf30: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
bf40: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
bf50: 69 6e 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e  integer that con
bf60: 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74  tains the offset
bf70: 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20   at.** which to 
bf80: 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f  write into the o
bf90: 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68  utput buffer. Th
bfa0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69  is function copi
bfb0: 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65  es the.** nul-te
bfc0: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
bfd0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
bfe0: 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74 65  e third paramete
bff0: 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c  r, zSignedIdent,
c000: 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69  .** to the speci
c010: 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74  fied offset in t
c020: 68 65 20 62 75 66 66 65 72 20 61 6e 64 20 75 70  he buffer and up
c030: 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72  dates *pIdx to r
c040: 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66  efer.** to the f
c050: 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20  irst byte after 
c060: 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 77 72  the last byte wr
c070: 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74  itten before ret
c080: 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49  urning..** .** I
c090: 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69  f the string zSi
c0a0: 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73  gnedIdent consis
c0b0: 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61  ts entirely of a
c0c0: 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20  lpha-numeric.** 
c0d0: 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73  characters, does
c0e0: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
c0f0: 61 20 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e  a digit and is n
c100: 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72  ot an SQL keywor
c110: 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  d,.** then it is
c120: 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f   copied to the o
c130: 75 74 70 75 74 20 62 75 66 66 65 72 20 65 78 61  utput buffer exa
c140: 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f  ctly as it is. O
c150: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20  therwise,.** it 
c160: 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20  is quoted using 
c170: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a  double-quotes..*
c180: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64  /.static void id
c190: 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20  entPut(char *z, 
c1a0: 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20  int *pIdx, char 
c1b0: 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a  *zSignedIdent){.
c1c0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
c1d0: 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67  *zIdent = (unsig
c1e0: 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65  ned char*)zSigne
c1f0: 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c  dIdent;.  int i,
c200: 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20   j, needQuote;. 
c210: 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66   i = *pIdx;..  f
c220: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
c230: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; j++){.    if(
c240: 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d   !sqlite3Isalnum
c250: 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a  (zIdent[j]) && z
c260: 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20  Ident[j]!='_' ) 
c270: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65  break;.  }.  nee
c280: 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33  dQuote = sqlite3
c290: 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30  Isdigit(zIdent[0
c2a0: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  ]).            |
c2b0: 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64  | sqlite3Keyword
c2c0: 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21  Code(zIdent, j)!
c2d0: 3d 54 4b 5f 49 44 0a 20 20 20 20 20 20 20 20 20  =TK_ID.         
c2e0: 20 20 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21     || zIdent[j]!
c2f0: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  =0.            |
c300: 7c 20 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28 20 6e  | j==0;..  if( n
c310: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
c320: 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a  ] = '"';.  for(j
c330: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
c340: 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20  ++){.    z[i++] 
c350: 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20  = zIdent[j];.   
c360: 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d   if( zIdent[j]==
c370: 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  '"' ) z[i++] = '
c380: 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65  "';.  }.  if( ne
c390: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
c3a0: 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d   = '"';.  z[i] =
c3b0: 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b   0;.  *pIdx = i;
c3c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
c3d0: 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  te a CREATE TABL
c3e0: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72  E statement appr
c3f0: 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
c400: 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20  given.** table. 
c410: 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20   Memory to hold 
c420: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  the text of the 
c430: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74  statement is obt
c440: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71  ained.** from sq
c450: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
c460: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
c470: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
c480: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
c490: 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61  c char *createTa
c4a0: 62 6c 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20  bleStmt(sqlite3 
c4b0: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a  *db, Table *p){.
c4c0: 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20    int i, k, n;. 
c4d0: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
c4e0: 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65  char *zSep, *zSe
c4f0: 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c  p2, *zEnd;.  Col
c500: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d  umn *pCol;.  n =
c510: 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d   0;.  for(pCol =
c520: 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69   p->aCol, i=0; i
c530: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
c540: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d  Col++){.    n +=
c550: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f   identLength(pCo
c560: 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20  l->zName) + 5;. 
c570: 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c   }.  n += identL
c580: 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b  ength(p->zName);
c590: 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a  .  if( n<50 ){ .
c5a0: 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20      zSep = "";. 
c5b0: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a     zSep2 = ",";.
c5c0: 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a      zEnd = ")";.
c5d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65    }else{.    zSe
c5e0: 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20  p = "\n  ";.    
c5f0: 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b  zSep2 = ",\n  ";
c600: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29  .    zEnd = "\n)
c610: 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35  ";.  }.  n += 35
c620: 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20   + 6*p->nCol;.  
c630: 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 44  zStmt = sqlite3D
c640: 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29  bMallocRaw(0, n)
c650: 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30  ;.  if( zStmt==0
c660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
c670: 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
c680: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
c690: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
c6a0: 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45  f(n, zStmt, "CRE
c6b0: 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20  ATE TABLE ");.  
c6c0: 6b 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  k = sqlite3Strle
c6d0: 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64  n30(zStmt);.  id
c6e0: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
c6f0: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a  , p->zName);.  z
c700: 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b  Stmt[k++] = '(';
c710: 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61  .  for(pCol=p->a
c720: 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e  Col, i=0; i<p->n
c730: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
c740: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ){.    static co
c750: 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  nst char * const
c760: 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20   azType[] = {.  
c770: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
c780: 41 46 46 5f 42 4c 4f 42 20 20 20 20 2a 2f 20 22  AFF_BLOB    */ "
c790: 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ",.        /* SQ
c7a0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20  LITE_AFF_TEXT   
c7b0: 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20   */ " TEXT",.   
c7c0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
c7d0: 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20  FF_NUMERIC */ " 
c7e0: 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  NUM",.        /*
c7f0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
c800: 47 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20  GER */ " INT",. 
c810: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
c820: 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20  _AFF_REAL    */ 
c830: 22 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20  " REAL".    };. 
c840: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
c850: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
c860: 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e;..    sqlite3_
c870: 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a  snprintf(n-k, &z
c880: 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a  Stmt[k], zSep);.
c890: 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33      k += sqlite3
c8a0: 53 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b  Strlen30(&zStmt[
c8b0: 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20  k]);.    zSep = 
c8c0: 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74  zSep2;.    ident
c8d0: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
c8e0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
c8f0: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61   assert( pCol->a
c900: 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41  ffinity-SQLITE_A
c910: 46 46 5f 42 4c 4f 42 20 3e 3d 20 30 20 29 3b 0a  FF_BLOB >= 0 );.
c920: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
c930: 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54  ->affinity-SQLIT
c940: 45 5f 41 46 46 5f 42 4c 4f 42 20 3c 20 41 72 72  E_AFF_BLOB < Arr
c950: 61 79 53 69 7a 65 28 61 7a 54 79 70 65 29 20 29  aySize(azType) )
c960: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
c970: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
c980: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
c990: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c9a0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
c9b0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
c9c0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
c9d0: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
c9e0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
c9f0: 45 52 49 43 20 29 3b 0a 20 20 20 20 74 65 73 74  ERIC );.    test
ca00: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
ca10: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
ca20: 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20  _INTEGER );.    
ca30: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
ca40: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
ca50: 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20  _AFF_REAL );.   
ca60: 20 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 61 7a   .    zType = az
ca70: 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e  Type[pCol->affin
ca80: 69 74 79 20 2d 20 53 51 4c 49 54 45 5f 41 46 46  ity - SQLITE_AFF
ca90: 5f 42 4c 4f 42 5d 3b 0a 20 20 20 20 6c 65 6e 20  _BLOB];.    len 
caa0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
cab0: 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 61 73  0(zType);.    as
cac0: 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69  sert( pCol->affi
cad0: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
cae0: 5f 42 4c 4f 42 20 0a 20 20 20 20 20 20 20 20 20  _BLOB .         
caf0: 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69     || pCol->affi
cb00: 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33 41 66 66  nity==sqlite3Aff
cb10: 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c  inityType(zType,
cb20: 20 30 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70   0) );.    memcp
cb30: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79  y(&zStmt[k], zTy
cb40: 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20  pe, len);.    k 
cb50: 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65  += len;.    asse
cb60: 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a  rt( k<=n );.  }.
cb70: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
cb80: 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b  tf(n-k, &zStmt[k
cb90: 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a  ], "%s", zEnd);.
cba0: 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a    return zStmt;.
cbb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20  }../*.** Resize 
cbc0: 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  an Index object 
cbd0: 74 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e  to hold N column
cbe0: 73 20 74 6f 74 61 6c 2e 20 20 52 65 74 75 72 6e  s total.  Return
cbf0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
cc00: 20 73 75 63 63 65 73 73 20 61 6e 64 20 53 51 4c   success and SQL
cc10: 49 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20  ITE_NOMEM on an 
cc20: 4f 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74  OOM error..*/.st
cc30: 61 74 69 63 20 69 6e 74 20 72 65 73 69 7a 65 49  atic int resizeI
cc40: 6e 64 65 78 4f 62 6a 65 63 74 28 73 71 6c 69 74  ndexObject(sqlit
cc50: 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70  e3 *db, Index *p
cc60: 49 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 63  Idx, int N){.  c
cc70: 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20 69  har *zExtra;.  i
cc80: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20  nt nByte;.  if( 
cc90: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e  pIdx->nColumn>=N
cca0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
ccb0: 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
ccc0: 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d 3d  Idx->isResized==
ccd0: 30 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28  0 );.  nByte = (
cce0: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b 20  sizeof(char*) + 
ccf0: 73 69 7a 65 6f 66 28 69 31 36 29 20 2b 20 31 29  sizeof(i16) + 1)
cd00: 2a 4e 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 73  *N;.  zExtra = s
cd10: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
cd20: 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  ro(db, nByte);. 
cd30: 20 69 66 28 20 7a 45 78 74 72 61 3d 3d 30 20 29   if( zExtra==0 )
cd40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
cd50: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d  OMEM_BKPT;.  mem
cd60: 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78  cpy(zExtra, pIdx
cd70: 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66  ->azColl, sizeof
cd80: 28 63 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e 43  (char*)*pIdx->nC
cd90: 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e  olumn);.  pIdx->
cda0: 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20  azColl = (const 
cdb0: 63 68 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a 20  char**)zExtra;. 
cdc0: 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f   zExtra += sizeo
cdd0: 66 28 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65  f(char*)*N;.  me
cde0: 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64  mcpy(zExtra, pId
cdf0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a  x->aiColumn, siz
ce00: 65 6f 66 28 69 31 36 29 2a 70 49 64 78 2d 3e 6e  eof(i16)*pIdx->n
ce10: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d  Column);.  pIdx-
ce20: 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36  >aiColumn = (i16
ce30: 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74  *)zExtra;.  zExt
ce40: 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36  ra += sizeof(i16
ce50: 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45  )*N;.  memcpy(zE
ce60: 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f 72  xtra, pIdx->aSor
ce70: 74 4f 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e 43  tOrder, pIdx->nC
ce80: 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e  olumn);.  pIdx->
ce90: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
cea0: 2a 29 7a 45 78 74 72 61 3b 0a 20 20 70 49 64 78  *)zExtra;.  pIdx
ceb0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20  ->nColumn = N;. 
cec0: 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64   pIdx->isResized
ced0: 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
cee0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
cef0: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
cf00: 74 6f 74 61 6c 20 72 6f 77 20 77 69 64 74 68 20  total row width 
cf10: 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a  for a table..*/.
cf20: 73 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69  static void esti
cf30: 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28 54  mateTableWidth(T
cf40: 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 75  able *pTab){.  u
cf50: 6e 73 69 67 6e 65 64 20 77 54 61 62 6c 65 20 3d  nsigned wTable =
cf60: 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75   0;.  const Colu
cf70: 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 69  mn *pTabCol;.  i
cf80: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 54  nt i;.  for(i=pT
cf90: 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43 6f  ab->nCol, pTabCo
cfa0: 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e  l=pTab->aCol; i>
cfb0: 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b  0; i--, pTabCol+
cfc0: 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c 65 20 2b  +){.    wTable +
cfd0: 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73 74  = pTabCol->szEst
cfe0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
cff0: 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77 54 61 62  ->iPKey<0 ) wTab
d000: 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73 7a  le++;.  pTab->sz
d010: 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  TabRow = sqlite3
d020: 4c 6f 67 45 73 74 28 77 54 61 62 6c 65 2a 34 29  LogEst(wTable*4)
d030: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  ;.}../*.** Estim
d040: 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20  ate the average 
d050: 73 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 66 6f  size of a row fo
d060: 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  r an index..*/.s
d070: 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d  tatic void estim
d080: 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 49 6e  ateIndexWidth(In
d090: 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e  dex *pIdx){.  un
d0a0: 73 69 67 6e 65 64 20 77 49 6e 64 65 78 20 3d 20  signed wIndex = 
d0b0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  0;.  int i;.  co
d0c0: 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  nst Column *aCol
d0d0: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
d0e0: 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30  >aCol;.  for(i=0
d0f0: 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; i<pIdx->nColum
d100: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31 36  n; i++){.    i16
d110: 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   x = pIdx->aiCol
d120: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  umn[i];.    asse
d130: 72 74 28 20 78 3c 70 49 64 78 2d 3e 70 54 61 62  rt( x<pIdx->pTab
d140: 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  le->nCol );.    
d150: 77 49 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f 20  wIndex += x<0 ? 
d160: 31 20 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61  1 : aCol[pIdx->a
d170: 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73  iColumn[i]].szEs
d180: 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73  t;.  }.  pIdx->s
d190: 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c 69 74 65  zIdxRow = sqlite
d1a0: 33 4c 6f 67 45 73 74 28 77 49 6e 64 65 78 2a 34  3LogEst(wIndex*4
d1b0: 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  );.}../* Return 
d1c0: 74 72 75 65 20 69 66 20 76 61 6c 75 65 20 78 20  true if value x 
d1d0: 69 73 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66 20  is found any of 
d1e0: 74 68 65 20 66 69 72 73 74 20 6e 43 6f 6c 20 65  the first nCol e
d1f0: 6e 74 72 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b  ntries of aiCol[
d200: 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ].*/.static int 
d210: 68 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20  hasColumn(const 
d220: 69 31 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20  i16 *aiCol, int 
d230: 6e 43 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20  nCol, int x){.  
d240: 77 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20  while( nCol-- > 
d250: 30 20 29 20 69 66 28 20 78 3d 3d 2a 28 61 69 43  0 ) if( x==*(aiC
d260: 6f 6c 2b 2b 29 20 29 20 72 65 74 75 72 6e 20 31  ol++) ) return 1
d270: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
d280: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d290: 69 6e 65 20 72 75 6e 73 20 61 74 20 74 68 65 20  ine runs at the 
d2a0: 65 6e 64 20 6f 66 20 70 61 72 73 69 6e 67 20 61  end of parsing a
d2b0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
d2c0: 61 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20  atement that.** 
d2d0: 68 61 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f  has a WITHOUT RO
d2e0: 57 49 44 20 63 6c 61 75 73 65 2e 20 20 54 68 65  WID clause.  The
d2f0: 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75   job of this rou
d300: 74 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76 65  tine is to conve
d310: 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72  rt both.** inter
d320: 6e 61 6c 20 73 63 68 65 6d 61 20 64 61 74 61 20  nal schema data 
d330: 73 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 74  structures and t
d340: 68 65 20 67 65 6e 65 72 61 74 65 64 20 56 44 42  he generated VDB
d350: 45 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20 74  E code so that t
d360: 68 65 79 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f  hey.** are appro
d370: 70 72 69 61 74 65 20 66 6f 72 20 61 20 57 49 54  priate for a WIT
d380: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
d390: 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 72 6f   instead of a ro
d3a0: 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68  wid table..** Ch
d3b0: 61 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a  anges include:.*
d3c0: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 53 65  *.**     (1)  Se
d3d0: 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66  t all columns of
d3e0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
d3f0: 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 74   schema object t
d400: 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a  o be NOT NULL..*
d410: 2a 20 20 20 20 20 28 32 29 20 20 43 6f 6e 76 65  *     (2)  Conve
d420: 72 74 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65  rt the OP_Create
d430: 54 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50  Table into an OP
d440: 5f 43 72 65 61 74 65 49 6e 64 65 78 2e 20 20 54  _CreateIndex.  T
d450: 68 65 72 65 20 69 73 0a 2a 2a 20 20 20 20 20 20  here is.**      
d460: 20 20 20 20 6e 6f 20 72 6f 77 69 64 20 62 74 72      no rowid btr
d470: 65 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54  ee for a WITHOUT
d480: 20 52 4f 57 49 44 2e 20 20 49 6e 73 74 65 61 64   ROWID.  Instead
d490: 2c 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a  , the canonical.
d4a0: 2a 2a 20 20 20 20 20 20 20 20 20 20 64 61 74 61  **          data
d4b0: 20 73 74 6f 72 61 67 65 20 69 73 20 61 20 63 6f   storage is a co
d4c0: 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62 74 72  vering index btr
d4d0: 65 65 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20 20  ee..**     (3)  
d4e0: 42 79 70 61 73 73 20 74 68 65 20 63 72 65 61 74  Bypass the creat
d4f0: 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ion of the sqlit
d500: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65  e_master table e
d510: 6e 74 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  ntry.**         
d520: 20 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59   for the PRIMARY
d530: 20 4b 45 59 20 61 73 20 74 68 65 20 70 72 69 6d   KEY as the prim
d540: 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 69 73  ary key index is
d550: 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20   now.**         
d560: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
d570: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
d580: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6f 66 20   table entry of 
d590: 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66  the table itself
d5a0: 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53 65  ..**     (4)  Se
d5b0: 74 20 74 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d  t the Index.tnum
d5c0: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
d5d0: 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  KEY Index object
d5e0: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
d5f0: 20 20 20 20 73 63 68 65 6d 61 20 74 6f 20 74 68      schema to th
d600: 65 20 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20  e rootpage from 
d610: 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a  the main table..
d620: 2a 2a 20 20 20 20 20 28 35 29 20 20 41 64 64 20  **     (5)  Add 
d630: 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  all table column
d640: 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59  s to the PRIMARY
d650: 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63   KEY Index objec
d660: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f  t.**          so
d670: 20 74 68 61 74 20 74 68 65 20 50 52 49 4d 41 52   that the PRIMAR
d680: 59 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72  Y KEY is a cover
d690: 69 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20  ing index.  The 
d6a0: 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20  surplus.**      
d6b0: 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20      columns are 
d6c0: 70 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e  part of KeyInfo.
d6d0: 6e 58 46 69 65 6c 64 20 61 6e 64 20 61 72 65 20  nXField and are 
d6e0: 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  not used for.** 
d6f0: 20 20 20 20 20 20 20 20 20 73 6f 72 74 69 6e 67           sorting
d700: 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e   or lookup or un
d710: 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b 73 2e  iqueness checks.
d720: 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52 65 70  .**     (6)  Rep
d730: 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64 20 74  lace the rowid t
d740: 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d  ail on all autom
d750: 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74  atically generat
d760: 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20 20  ed UNIQUE.**    
d770: 20 20 20 20 20 20 69 6e 64 69 63 65 73 20 77 69        indices wi
d780: 74 68 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  th the PRIMARY K
d790: 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a  EY columns..**.*
d7a0: 2a 20 46 6f 72 20 76 69 72 74 75 61 6c 20 74 61  * For virtual ta
d7b0: 62 6c 65 73 2c 20 6f 6e 6c 79 20 28 31 29 20 69  bles, only (1) i
d7c0: 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2f 0a  s performed..*/.
d7d0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 76  static void conv
d7e0: 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69  ertToWithoutRowi
d7f0: 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  dTable(Parse *pP
d800: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
d810: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  b){.  Index *pId
d820: 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b  x;.  Index *pPk;
d830: 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e  .  int nPk;.  in
d840: 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65  t i, j;.  sqlite
d850: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
d860: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  db;.  Vdbe *v = 
d870: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a  pParse->pVdbe;..
d880: 20 20 2f 2a 20 4d 61 72 6b 20 65 76 65 72 79 20    /* Mark every 
d890: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
d8a0: 6d 6e 20 61 73 20 4e 4f 54 20 4e 55 4c 4c 20 28  mn as NOT NULL (
d8b0: 65 78 63 65 70 74 20 66 6f 72 20 69 6d 70 6f 73  except for impos
d8c0: 74 65 72 20 74 61 62 6c 65 73 29 0a 20 20 2a 2f  ter tables).  */
d8d0: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
d8e0: 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29  .imposterTable )
d8f0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
d900: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
d910: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  ){.      if( (pT
d920: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46  ab->aCol[i].colF
d930: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50  lags & COLFLAG_P
d940: 52 49 4d 4b 45 59 29 21 3d 30 20 29 7b 0a 20 20  RIMKEY)!=0 ){.  
d950: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
d960: 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 4f 45  [i].notNull = OE
d970: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
d980: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
d990: 54 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 72  The remaining tr
d9a0: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 20 6f 6e  ansformations on
d9b0: 6c 79 20 61 70 70 6c 79 20 74 6f 20 62 2d 74 72  ly apply to b-tr
d9c0: 65 65 20 74 61 62 6c 65 73 2c 20 6e 6f 74 20 74  ee tables, not t
d9d0: 6f 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74  o.  ** virtual t
d9e0: 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 49  ables */.  if( I
d9f0: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
da00: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 43   return;..  /* C
da10: 6f 6e 76 65 72 74 20 74 68 65 20 4f 50 5f 43 72  onvert the OP_Cr
da20: 65 61 74 65 54 61 62 6c 65 20 6f 70 63 6f 64 65  eateTable opcode
da30: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 6f 72 6d   that would norm
da40: 61 6c 6c 79 20 63 72 65 61 74 65 20 74 68 65 0a  ally create the.
da50: 20 20 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 66    ** root-page f
da60: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74  or the table int
da70: 6f 20 61 6e 20 4f 50 5f 43 72 65 61 74 65 49 6e  o an OP_CreateIn
da80: 64 65 78 20 6f 70 63 6f 64 65 2e 20 20 54 68 65  dex opcode.  The
da90: 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63 72 65 61   index.  ** crea
daa0: 74 65 64 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  ted will become 
dab0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
dac0: 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66  index..  */.  if
dad0: 28 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72  ( pParse->addrCr
dae0: 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
daf0: 74 28 20 76 20 29 3b 0a 20 20 20 20 73 71 6c 69  t( v );.    sqli
db00: 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63  te3VdbeChangeOpc
db10: 6f 64 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 61  ode(v, pParse->a
db20: 64 64 72 43 72 54 61 62 2c 20 4f 50 5f 43 72 65  ddrCrTab, OP_Cre
db30: 61 74 65 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a  ateIndex);.  }..
db40: 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
db50: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
db60: 78 2e 20 20 4f 72 2c 20 69 66 20 74 68 69 73 20  x.  Or, if this 
db70: 74 61 62 6c 65 20 77 61 73 20 6f 72 69 67 69 6e  table was origin
db80: 61 6c 6c 79 0a 20 20 2a 2a 20 61 6e 20 49 4e 54  ally.  ** an INT
db90: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
dba0: 20 74 61 62 6c 65 2c 20 63 72 65 61 74 65 20 61   table, create a
dbb0: 20 6e 65 77 20 50 52 49 4d 41 52 59 20 4b 45 59   new PRIMARY KEY
dbc0: 20 69 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a 20 20   index. .  */.  
dbd0: 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e  if( pTab->iPKey>
dbe0: 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  =0 ){.    ExprLi
dbf0: 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 54  st *pList;.    T
dc00: 6f 6b 65 6e 20 69 70 6b 54 6f 6b 65 6e 3b 0a 20  oken ipkToken;. 
dc10: 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49     sqlite3TokenI
dc20: 6e 69 74 28 26 69 70 6b 54 6f 6b 65 6e 2c 20 70  nit(&ipkToken, p
dc30: 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
dc40: 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  iPKey].zName);. 
dc50: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
dc60: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
dc70: 28 70 50 61 72 73 65 2c 20 30 2c 20 0a 20 20 20  (pParse, 0, .   
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
dc90: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
dca0: 64 62 2c 20 54 4b 5f 49 44 2c 20 26 69 70 6b 54  db, TK_ID, &ipkT
dcb0: 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 69  oken, 0));.    i
dcc0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
dcd0: 74 75 72 6e 3b 0a 20 20 20 20 70 4c 69 73 74 2d  turn;.    pList-
dce0: 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
dcf0: 3d 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72  = pParse->iPkSor
dd00: 74 4f 72 64 65 72 3b 0a 20 20 20 20 61 73 73 65  tOrder;.    asse
dd10: 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  rt( pParse->pNew
dd20: 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20  Table==pTab );. 
dd30: 20 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65     sqlite3Create
dd40: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c  Index(pParse, 0,
dd50: 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 70 54   0, 0, pList, pT
dd60: 61 62 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c 20  ab->keyConf, 0, 
dd70: 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  0, 0, 0,.       
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd90: 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50  SQLITE_IDXTYPE_P
dda0: 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20 20  RIMARYKEY);.    
ddb0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
ddc0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
ddd0: 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33     pPk = sqlite3
dde0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
ddf0: 70 54 61 62 29 3b 0a 20 20 20 20 70 54 61 62 2d  pTab);.    pTab-
de00: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 7d  >iPKey = -1;.  }
de10: 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20  else{.    pPk = 
de20: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
de30: 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 0a 20  yIndex(pTab);.. 
de40: 20 20 20 2f 2a 20 42 79 70 61 73 73 20 74 68 65     /* Bypass the
de50: 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65   creation of the
de60: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 62 74 72   PRIMARY KEY btr
de70: 65 65 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  ee and the sqlit
de80: 65 5f 6d 61 73 74 65 72 0a 20 20 20 20 2a 2a 20  e_master.    ** 
de90: 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 54 68 69  table entry. Thi
dea0: 73 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72  s is only requir
deb0: 65 64 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20  ed if currently 
dec0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 0a  generating VDBE.
ded0: 20 20 20 20 2a 2a 20 63 6f 64 65 20 66 6f 72 20      ** code for 
dee0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 28  a CREATE TABLE (
def0: 6e 6f 74 20 77 68 65 6e 20 70 61 72 73 69 6e 67  not when parsing
df00: 20 6f 6e 65 20 61 73 20 70 61 72 74 20 6f 66 20   one as part of 
df10: 72 65 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 61  reading.    ** a
df20: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
df30: 29 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 76  ).  */.    if( v
df40: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
df50: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
df60: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
df70: 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63  te3VdbeChangeOpc
df80: 6f 64 65 28 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d  ode(v, pPk->tnum
df90: 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20  , OP_Goto);.    
dfa0: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
dfb0: 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 64 75   Remove all redu
dfc0: 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 20 66 72  ndant columns fr
dfd0: 6f 6d 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  om the PRIMARY K
dfe0: 45 59 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  EY.  For example
dff0: 2c 20 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20  , change.    ** 
e000: 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62  "PRIMARY KEY(a,b
e010: 2c 61 2c 62 2c 63 2c 62 2c 63 2c 64 29 22 20 69  ,a,b,c,b,c,d)" i
e020: 6e 74 6f 20 6a 75 73 74 20 22 50 52 49 4d 41 52  nto just "PRIMAR
e030: 59 20 4b 45 59 28 61 2c 62 2c 63 2c 64 29 22 2e  Y KEY(a,b,c,d)".
e040: 20 20 4c 61 74 65 72 0a 20 20 20 20 2a 2a 20 63    Later.    ** c
e050: 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 65 20  ode assumes the 
e060: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 74  PRIMARY KEY cont
e070: 61 69 6e 73 20 6e 6f 20 72 65 70 65 61 74 65 64  ains no repeated
e080: 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f   columns..    */
e090: 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 31 3b 20  .    for(i=j=1; 
e0a0: 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  i<pPk->nKeyCol; 
e0b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
e0c0: 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61  hasColumn(pPk->a
e0d0: 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d  iColumn, j, pPk-
e0e0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b  >aiColumn[i]) ){
e0f0: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e 43  .        pPk->nC
e100: 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d  olumn--;.      }
e110: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
e120: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d  k->aiColumn[j++]
e130: 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
e140: 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [i];.      }.   
e150: 20 7d 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b 65 79   }.    pPk->nKey
e160: 43 6f 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20 61  Col = j;.  }.  a
e170: 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29 3b  ssert( pPk!=0 );
e180: 0a 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72 69  .  pPk->isCoveri
e190: 6e 67 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 64  ng = 1;.  if( !d
e1a0: 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72  b->init.imposter
e1b0: 54 61 62 6c 65 20 29 20 70 50 6b 2d 3e 75 6e 69  Table ) pPk->uni
e1c0: 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20  qNotNull = 1;.  
e1d0: 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43  nPk = pPk->nKeyC
e1e0: 6f 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 6f  ol;..  /* The ro
e1f0: 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 50  ot page of the P
e200: 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 74 68  RIMARY KEY is th
e210: 65 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67  e table root pag
e220: 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d  e */.  pPk->tnum
e230: 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a   = pTab->tnum;..
e240: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
e250: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
e260: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
e270: 55 4e 49 51 55 45 20 69 6e 64 69 63 65 73 20 62  UNIQUE indices b
e280: 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20 2a  y converting.  *
e290: 2a 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69  * the final rowi
e2a0: 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e  d column into on
e2b0: 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e  e or more column
e2c0: 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  s of the PRIMARY
e2d0: 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   KEY..  */.  for
e2e0: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
e2f0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
e300: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
e310: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20   int n;.    if( 
e320: 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
e330: 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e  x(pIdx) ) contin
e340: 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d  ue;.    for(i=n=
e350: 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a  0; i<nPk; i++){.
e360: 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f        if( !hasCo
e370: 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c  lumn(pIdx->aiCol
e380: 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43  umn, pIdx->nKeyC
e390: 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ol, pPk->aiColum
e3a0: 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20 20  n[i]) ) n++;.   
e3b0: 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20   }.    if( n==0 
e3c0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
e3d0: 20 69 6e 64 65 78 20 69 73 20 61 20 73 75 70 65   index is a supe
e3e0: 72 73 65 74 20 6f 66 20 74 68 65 20 70 72 69 6d  rset of the prim
e3f0: 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20  ary key */.     
e400: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d   pIdx->nColumn =
e410: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a   pIdx->nKeyCol;.
e420: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
e430: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65      }.    if( re
e440: 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  sizeIndexObject(
e450: 64 62 2c 20 70 49 64 78 2c 20 70 49 64 78 2d 3e  db, pIdx, pIdx->
e460: 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65 74  nKeyCol+n) ) ret
e470: 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  urn;.    for(i=0
e480: 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  , j=pIdx->nKeyCo
e490: 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a  l; i<nPk; i++){.
e4a0: 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f        if( !hasCo
e4b0: 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c  lumn(pIdx->aiCol
e4c0: 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43  umn, pIdx->nKeyC
e4d0: 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ol, pPk->aiColum
e4e0: 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  n[i]) ){.       
e4f0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
e500: 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  j] = pPk->aiColu
e510: 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70  mn[i];.        p
e520: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d  Idx->azColl[j] =
e530: 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b   pPk->azColl[i];
e540: 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  .        j++;.  
e550: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e560: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
e570: 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65  olumn>=pIdx->nKe
e580: 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61 73  yCol+n );.    as
e590: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
e5a0: 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20  umn>=j );.  }.. 
e5b0: 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61 62 6c   /* Add all tabl
e5c0: 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65  e columns to the
e5d0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
e5e0: 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  ex.  */.  if( nP
e5f0: 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  k<pTab->nCol ){.
e600: 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e      if( resizeIn
e610: 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 50  dexObject(db, pP
e620: 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  k, pTab->nCol) )
e630: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72   return;.    for
e640: 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70  (i=0, j=nPk; i<p
e650: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
e660: 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43  .      if( !hasC
e670: 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c  olumn(pPk->aiCol
e680: 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20 20  umn, j, i) ){.  
e690: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
e6a0: 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  pPk->nColumn );.
e6b0: 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43          pPk->aiC
e6c0: 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20  olumn[j] = i;.  
e6d0: 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c        pPk->azCol
e6e0: 6c 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 53 74  l[j] = sqlite3St
e6f0: 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 20  rBINARY;.       
e700: 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   j++;.      }.  
e710: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
e720: 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20  pPk->nColumn==j 
e730: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
e740: 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a  Tab->nCol==j );.
e750: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b    }else{.    pPk
e760: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62  ->nColumn = pTab
e770: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ->nCol;.  }.}../
e780: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e790: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  e is called to r
e7a0: 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20  eport the final 
e7b0: 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ")" that termina
e7c0: 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20  tes.** a CREATE 
e7d0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
e7e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
e7f0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
e800: 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75  other action rou
e810: 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20  tines have been 
e820: 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61  building.** is a
e830: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65  dded to the inte
e840: 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73  rnal hash tables
e850: 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  , assuming no er
e860: 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63  rors have.** occ
e870: 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  urred..**.** An 
e880: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61  entry for the ta
e890: 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74  ble is made in t
e8a0: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
e8b0: 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a  on disk, unless.
e8c0: 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  ** this is a tem
e8d0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20  porary table or 
e8e0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
e8f0: 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74  .  When db->init
e900: 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d  .busy==1.** it m
e910: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
e920: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
e930: 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61  aster table beca
e940: 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63  use we just.** c
e950: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20  onnected to the 
e960: 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61  database or beca
e970: 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  use the sqlite_m
e980: 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a  aster table has.
e990: 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e  ** recently chan
e9a0: 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72  ged, so the entr
e9b0: 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  y for this table
e9c0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
e9d0: 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  in.** the sqlite
e9e0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20  _master table.  
e9f0: 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  We do not want t
ea00: 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69  o create it agai
ea10: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
ea20: 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74  pSelect argument
ea30: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
ea40: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
ea50: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20   routine.** was 
ea60: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
ea70: 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74   a table generat
ea80: 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43  ed from a .** "C
ea90: 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20  REATE TABLE ... 
eaa0: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73  AS SELECT ..." s
eab0: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63  tatement.  The c
eac0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a  olumn names of.*
ead0: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * the new table 
eae0: 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72  will match the r
eaf0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
eb00: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
eb10: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
eb20: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
eb30: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
eb40: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
eb50: 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20    Token *pCons, 
eb60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
eb70: 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72   ',' token after
eb80: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
eb90: 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   defn. */.  Toke
eba0: 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20  n *pEnd,        
ebb0: 20 20 20 20 2f 2a 20 54 68 65 20 27 29 27 20 62      /* The ')' b
ebc0: 65 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69 6e  efore options in
ebd0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
ebe0: 45 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70 74  E */.  u8 tabOpt
ebf0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
ec00: 2a 20 45 78 74 72 61 20 74 61 62 6c 65 20 6f 70  * Extra table op
ec10: 74 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20 30  tions. Usually 0
ec20: 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  . */.  Select *p
ec30: 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f  Select         /
ec40: 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20  * Select from a 
ec50: 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53  "CREATE ... AS S
ec60: 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54  ELECT" */.){.  T
ec70: 61 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20  able *p;        
ec80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
ec90: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  new table */.  s
eca0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
ecb0: 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20  rse->db; /* The 
ecc0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
ecd0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ion */.  int iDb
ece0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ecf0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
ed00: 6e 20 77 68 69 63 68 20 74 68 65 20 74 61 62 6c  n which the tabl
ed10: 65 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e 64  e lives */.  Ind
ed20: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
ed30: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d 70         /* An imp
ed40: 6c 69 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68  lied index of th
ed50: 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66  e table */..  if
ed60: 28 20 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65  ( pEnd==0 && pSe
ed70: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  lect==0 ){.    r
ed80: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
ed90: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
eda0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 70 20 3d 20  Failed );.  p = 
edb0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
edc0: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  e;.  if( p==0 ) 
edd0: 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
ede0: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
edf0: 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b  y || !pSelect );
ee00: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
ee10: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
ee20: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
ee30: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
ee40: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
ee50: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72  qlite_master" or
ee60: 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61   "sqlite_temp_ma
ee70: 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74  ster" table on t
ee80: 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f  he disk..  ** So
ee90: 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f   do not write to
eea0: 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e   the disk again.
eeb0: 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f    Extract the ro
eec0: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  ot page number. 
eed0: 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c   ** for the tabl
eee0: 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69  e from the db->i
eef0: 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  nit.newTnum fiel
ef00: 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75  d.  (The page nu
ef10: 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  mber.  ** should
ef20: 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74   have been put t
ef30: 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69  here by the sqli
ef40: 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65  teOpenCb routine
ef50: 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  .).  **.  ** If 
ef60: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
ef70: 6d 62 65 72 20 69 73 20 31 2c 20 74 68 61 74 20  mber is 1, that 
ef80: 6d 65 61 6e 73 20 74 68 69 73 20 69 73 20 74 68  means this is th
ef90: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a  e sqlite_master.
efa0: 20 20 2a 2a 20 74 61 62 6c 65 20 69 74 73 65 6c    ** table itsel
efb0: 66 2e 20 20 53 6f 20 6d 61 72 6b 20 69 74 20 72  f.  So mark it r
efc0: 65 61 64 2d 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a 20  ead-only..  */. 
efd0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
efe0: 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75  sy ){.    p->tnu
eff0: 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
f000: 54 6e 75 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d  Tnum;.    if( p-
f010: 3e 74 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e 74 61  >tnum==1 ) p->ta
f020: 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 52 65 61  bFlags |= TF_Rea
f030: 64 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  donly;.  }..  /*
f040: 20 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73   Special process
f050: 69 6e 67 20 66 6f 72 20 57 49 54 48 4f 55 54 20  ing for WITHOUT 
f060: 52 4f 57 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a  ROWID Tables */.
f070: 20 20 69 66 28 20 74 61 62 4f 70 74 73 20 26 20    if( tabOpts & 
f080: 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20  TF_WithoutRowid 
f090: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74  ){.    if( (p->t
f0a0: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
f0b0: 6f 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20  oincrement) ){. 
f0c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
f0d0: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
f0e0: 20 20 20 20 20 20 20 22 41 55 54 4f 49 4e 43 52         "AUTOINCR
f0f0: 45 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65  EMENT not allowe
f100: 64 20 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f 57  d on WITHOUT ROW
f110: 49 44 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ID tables");.   
f120: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
f130: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62  .    if( (p->tab
f140: 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72  Flags & TF_HasPr
f150: 69 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a  imaryKey)==0 ){.
f160: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
f170: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 50  orMsg(pParse, "P
f180: 52 49 4d 41 52 59 20 4b 45 59 20 6d 69 73 73 69  RIMARY KEY missi
f190: 6e 67 20 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c  ng on table %s",
f1a0: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20   p->zName);.    
f1b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
f1c0: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57  tabFlags |= TF_W
f1d0: 69 74 68 6f 75 74 52 6f 77 69 64 20 7c 20 54 46  ithoutRowid | TF
f1e0: 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b  _NoVisibleRowid;
f1f0: 0a 20 20 20 20 20 20 63 6f 6e 76 65 72 74 54 6f  .      convertTo
f200: 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c  WithoutRowidTabl
f210: 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  e(pParse, p);.  
f220: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62 20 3d    }.  }..  iDb =
f230: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
f240: 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63  Index(db, p->pSc
f250: 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20  hema);..#ifndef 
f260: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
f270: 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e  K.  /* Resolve n
f280: 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43  ames in all CHEC
f290: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70  K constraint exp
f2a0: 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
f2b0: 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29   if( p->pCheck )
f2c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
f2d0: 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63  olveSelfReferenc
f2e0: 65 28 70 50 61 72 73 65 2c 20 70 2c 20 4e 43 5f  e(pParse, p, NC_
f2f0: 49 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e 70  IsCheck, 0, p->p
f300: 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64  Check);.  }.#end
f310: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
f320: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
f330: 29 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74 69 6d  ) */..  /* Estim
f340: 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20  ate the average 
f350: 72 6f 77 20 73 69 7a 65 20 66 6f 72 20 74 68 65  row size for the
f360: 20 74 61 62 6c 65 20 61 6e 64 20 66 6f 72 20 61   table and for a
f370: 6c 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64 69 63  ll implied indic
f380: 65 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61 74 65  es */.  estimate
f390: 54 61 62 6c 65 57 69 64 74 68 28 70 29 3b 0a 20  TableWidth(p);. 
f3a0: 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e   for(pIdx=p->pIn
f3b0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
f3c0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
f3d0: 20 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57    estimateIndexW
f3e0: 69 64 74 68 28 70 49 64 78 29 3b 0a 20 20 7d 0a  idth(pIdx);.  }.
f3f0: 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69  .  /* If not ini
f400: 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20  tializing, then 
f410: 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20  create a record 
f420: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
f430: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51  e.  ** in the SQ
f440: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
f450: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
f460: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
f470: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52  this is a TEMPOR
f480: 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65  ARY table, write
f490: 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20   the entry into 
f4a0: 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20  the auxiliary.  
f4b0: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
f4c0: 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  of into the main
f4d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
f4e0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
f4f0: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
f500: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
f510: 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   *v;.    char *z
f520: 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65  Type;    /* "vie
f530: 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f  w" or "table" */
f540: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
f550: 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f  2;   /* "VIEW" o
f560: 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20  r "TABLE" */.   
f570: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20   char *zStmt;   
f580: 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
f590: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20  CREATE TABLE or 
f5a0: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
f5b0: 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20  ement */..    v 
f5c0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
f5d0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
f5e0: 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
f5f0: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c  return;..    sql
f600: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
f610: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a  , OP_Close, 0);.
f620: 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20  .    /* .    ** 
f630: 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65  Initialize zType
f640: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 65   for the new vie
f650: 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20 20  w or table..    
f660: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  */.    if( p->pS
f670: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
f680: 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74    /* A regular t
f690: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54  able */.      zT
f6a0: 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20  ype = "table";. 
f6b0: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54       zType2 = "T
f6c0: 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53  ABLE";.#ifndef S
f6d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
f6e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f6f0: 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20   /* A view */.  
f700: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65      zType = "vie
f710: 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32  w";.      zType2
f720: 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69   = "VIEW";.#endi
f730: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
f740: 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45  If this is a CRE
f750: 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20  ATE TABLE xx AS 
f760: 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63  SELECT ..., exec
f770: 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20  ute the SELECT. 
f780: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
f790: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
f7a0: 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72  new table. The r
f7b0: 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20  oot-page number 
f7c0: 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  for the.    ** n
f7d0: 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20 72  ew table is in r
f7e0: 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
f7f0: 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a  regRoot..    **.
f800: 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20      ** Once the 
f810: 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20  SELECT has been 
f820: 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33  coded by sqlite3
f830: 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20  Select(), it is 
f840: 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74  in a.    ** suit
f850: 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75  able state to qu
f860: 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ery for the colu
f870: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70  mn names and typ
f880: 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20  es to be used.  
f890: 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20    ** by the new 
f8a0: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  table..    **.  
f8b0: 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61    ** A shared-ca
f8c0: 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69  che write-lock i
f8d0: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
f8e0: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e  o write to the n
f8f0: 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a  ew table,.    **
f900: 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63   as a schema-loc
f910: 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  k must have alre
f920: 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ady been obtaine
f930: 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20  d to create it. 
f940: 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73  Since.    ** a s
f950: 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75  chema-lock exclu
f960: 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61  des all other da
f970: 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68  tabase users, th
f980: 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75  e write-lock wou
f990: 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64  ld.    ** be red
f9a0: 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  undant..    */. 
f9b0: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
f9c0: 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  {.      SelectDe
f9d0: 73 74 20 64 65 73 74 3b 20 20 20 20 2f 2a 20 57  st dest;    /* W
f9e0: 68 65 72 65 20 74 68 65 20 53 45 4c 45 43 54 20  here the SELECT 
f9f0: 73 68 6f 75 6c 64 20 73 74 6f 72 65 20 72 65 73  should store res
fa00: 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ults */.      in
fa10: 74 20 72 65 67 59 69 65 6c 64 3b 20 20 20 20 20  t regYield;     
fa20: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
fa30: 6c 64 69 6e 67 20 63 6f 2d 72 6f 75 74 69 6e 65  lding co-routine
fa40: 20 65 6e 74 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a   entry-point */.
fa50: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
fa60: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70  p;        /* Top
fa70: 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69   of the co-routi
fa80: 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ne */.      int 
fa90: 72 65 67 52 65 63 3b 20 20 20 20 20 20 20 20 20  regRec;         
faa0: 2f 2a 20 41 20 72 65 63 6f 72 64 20 74 6f 20 62  /* A record to b
fab0: 65 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 68  e insert into th
fac0: 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
fad0: 20 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69       int regRowi
fae0: 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  d;       /* Rowi
faf0: 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20 72 6f  d of the next ro
fb00: 77 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20  w to insert */. 
fb10: 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e 73       int addrIns
fb20: 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 6f 70 20  Loop;    /* Top 
fb30: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
fb40: 69 6e 73 65 72 74 69 6e 67 20 72 6f 77 73 20 2a  inserting rows *
fb50: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
fb60: 53 65 6c 54 61 62 3b 20 20 20 20 20 2f 2a 20 41  SelTab;     /* A
fb70: 20 74 61 62 6c 65 20 74 68 61 74 20 64 65 73 63   table that desc
fb80: 72 69 62 65 73 20 74 68 65 20 53 45 4c 45 43 54  ribes the SELECT
fb90: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 20   results */..   
fba0: 20 20 20 72 65 67 59 69 65 6c 64 20 3d 20 2b 2b     regYield = ++
fbb0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
fbc0: 20 20 20 20 72 65 67 52 65 63 20 3d 20 2b 2b 70      regRec = ++p
fbd0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
fbe0: 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b     regRowid = ++
fbf0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
fc00: 20 20 20 20 61 73 73 65 72 74 28 70 50 61 72 73      assert(pPars
fc10: 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20  e->nTab==1);.   
fc20: 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
fc30: 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  rt(pParse);.    
fc40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fc50: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op3(v, OP_OpenWr
fc60: 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e  ite, 1, pParse->
fc70: 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20  regRoot, iDb);. 
fc80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fc90: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
fca0: 41 47 5f 50 32 49 53 52 45 47 29 3b 0a 20 20 20  AG_P2ISREG);.   
fcb0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
fcc0: 3d 20 32 3b 0a 20 20 20 20 20 20 61 64 64 72 54  = 2;.      addrT
fcd0: 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
fce0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
fcf0: 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
fd00: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
fd10: 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
fd20: 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 61 64   regYield, 0, ad
fd30: 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 73 71  drTop);.      sq
fd40: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
fd50: 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43  nit(&dest, SRT_C
fd60: 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
fd70: 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ld);.      sqlit
fd80: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
fd90: 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29   pSelect, &dest)
fda0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fdb0: 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
fdc0: 76 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20  v, regYield);.  
fdd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
fde0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
fdf0: 6f 70 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 69  op - 1);.      i
fe00: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
fe10: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
fe20: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
fe30: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
fe40: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
fe50: 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ct);.      if( p
fe60: 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75  SelTab==0 ) retu
fe70: 72 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rn;.      assert
fe80: 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ( p->aCol==0 );.
fe90: 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20        p->nCol = 
fea0: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
feb0: 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70       p->aCol = p
fec0: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
fed0: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
fee0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65  l = 0;.      pSe
fef0: 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
ff00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
ff10: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65  eteTable(db, pSe
ff20: 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 61 64 64  lTab);.      add
ff30: 72 49 6e 73 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  rInsLoop = sqlit
ff40: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
ff50: 4f 50 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e 69  OP_Yield, dest.i
ff60: 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 56  SDParm);.      V
ff70: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
ff80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ff90: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
ffa0: 6b 65 52 65 63 6f 72 64 2c 20 64 65 73 74 2e 69  keRecord, dest.i
ffb0: 53 64 73 74 2c 20 64 65 73 74 2e 6e 53 64 73 74  Sdst, dest.nSdst
ffc0: 2c 20 72 65 67 52 65 63 29 3b 0a 20 20 20 20 20  , regRec);.     
ffd0: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66   sqlite3TableAff
ffe0: 69 6e 69 74 79 28 76 2c 20 70 2c 20 30 29 3b 0a  inity(v, p, 0);.
fff0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10000 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
10010 77 52 6f 77 69 64 2c 20 31 2c 20 72 65 67 52 6f  wRowid, 1, regRo
10020 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
10030 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10040 20 4f 50 5f 49 6e 73 65 72 74 2c 20 31 2c 20 72   OP_Insert, 1, r
10050 65 67 52 65 63 2c 20 72 65 67 52 6f 77 69 64 29  egRec, regRowid)
10060 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10070 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 49  dbeGoto(v, addrI
10080 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73  nsLoop);.      s
10090 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
100a0 72 65 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f  re(v, addrInsLoo
100b0 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
100c0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
100d0 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20  P_Close, 1);.   
100e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75   }..    /* Compu
100f0 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  te the complete 
10100 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
10110 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  TE statement */.
10120 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
10130 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  ){.      zStmt =
10140 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74   createTableStmt
10150 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c  (db, p);.    }el
10160 73 65 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20  se{.      Token 
10170 2a 70 45 6e 64 32 20 3d 20 74 61 62 4f 70 74 73  *pEnd2 = tabOpts
10180 20 3f 20 26 70 50 61 72 73 65 2d 3e 73 4c 61 73   ? &pParse->sLas
10190 74 54 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20  tToken : pEnd;. 
101a0 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70       n = (int)(p
101b0 45 6e 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65  End2->z - pParse
101c0 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b  ->sNameToken.z);
101d0 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 64 32  .      if( pEnd2
101e0 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20  ->z[0]!=';' ) n 
101f0 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20  += pEnd2->n;.   
10200 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
10210 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20  e3MPrintf(db, . 
10220 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
10230 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65   %s %.*s", zType
10240 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e  2, n, pParse->sN
10250 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20  ameToken.z.     
10260 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   );.    }..    /
10270 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65  * A slot for the
10280 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65   record has alre
10290 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
102a0 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a  ed in the .    *
102b0 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  * SQLITE_MASTER 
102c0 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20  table.  We just 
102d0 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20 74  need to update t
102e0 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c  hat slot with al
102f0 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66  l.    ** the inf
10300 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63  ormation we've c
10310 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f  ollected..    */
10320 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
10330 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
10340 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51        "UPDATE %Q
10350 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22  .%s ".         "
10360 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e  SET type='%s', n
10370 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65  ame=%Q, tbl_name
10380 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25  =%Q, rootpage=#%
10390 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20  d, sql=%Q ".    
103a0 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d     "WHERE rowid=
103b0 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e  #%d",.      db->
103c0 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
103d0 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a  e, MASTER_NAME,.
103e0 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20        zType,.   
103f0 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
10400 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
10410 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f     pParse->regRo
10420 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c  ot,.      zStmt,
10430 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
10440 65 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20  egRowid.    );. 
10450 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
10460 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20  (db, zStmt);.   
10470 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
10480 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
10490 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
104a0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
104b0 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65  EMENT.    /* Che
104c0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
104d0 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  need to create a
104e0 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  n sqlite_sequenc
104f0 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20  e table for.    
10500 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b  ** keeping track
10510 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   of autoincremen
10520 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20  t keys..    */. 
10530 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c     if( (p->tabFl
10540 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
10550 72 65 6d 65 6e 74 29 21 3d 30 20 29 7b 0a 20 20  rement)!=0 ){.  
10560 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
10570 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20  b->aDb[iDb];.   
10580 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
10590 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
105a0 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
105b0 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
105c0 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62  pSchema->pSeqTab
105d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
105e0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
105f0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
10600 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
10610 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75  E %Q.sqlite_sequ
10620 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c  ence(name,seq)",
10630 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
10640 7a 44 62 53 4e 61 6d 65 0a 20 20 20 20 20 20 20  zDbSName.       
10650 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
10660 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
10670 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74 68   Reparse everyth
10680 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75  ing to update ou
10690 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20  r internal data 
106a0 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20  structures */.  
106b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
106c0 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c  ParseSchemaOp(v,
106d0 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20   iDb,.          
106e0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
106f0 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25  db, "tbl_name='%
10700 71 27 20 41 4e 44 20 74 79 70 65 21 3d 27 74 72  q' AND type!='tr
10710 69 67 67 65 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d  igger'", p->zNam
10720 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  e));.  }...  /* 
10730 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f  Add the table to
10740 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
10750 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
10760 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
10770 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
10780 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54  it.busy ){.    T
10790 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
107a0 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
107b0 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  = p->pSchema;.  
107c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
107d0 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
107e0 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
107f0 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
10800 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53  e3HashInsert(&pS
10810 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
10820 70 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a 20 20  p->zName, p);.  
10830 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20    if( pOld ){.  
10840 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
10850 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  Old );  /* Mallo
10860 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
10870 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e  ed inside HashIn
10880 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  sert() */.      
10890 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
108a0 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  db);.      retur
108b0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  n;.    }.    pPa
108c0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
108d0 20 30 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67   0;.    db->flag
108e0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
108f0 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e  rnChanges;..#ifn
10900 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10910 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69  ALTERTABLE.    i
10920 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29  f( !p->pSelect )
10930 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
10940 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e  ar *zName = (con
10950 73 74 20 63 68 61 72 20 2a 29 70 50 61 72 73 65  st char *)pParse
10960 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a  ->sNameToken.z;.
10970 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b        int nName;
10980 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
10990 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73  pSelect && pCons
109a0 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20   && pEnd );.    
109b0 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d    if( pCons->z==
109c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  0 ){.        pCo
109d0 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  ns = pEnd;.     
109e0 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d   }.      nName =
109f0 20 28 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68   (int)((const ch
10a00 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20  ar *)pCons->z - 
10a10 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d  zName);.      p-
10a20 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20  >addColOffset = 
10a30 31 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38  13 + sqlite3Utf8
10a40 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e  CharLen(zName, n
10a50 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Name);.    }.#en
10a60 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  dif.  }.}..#ifnd
10a70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
10a80 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  IEW./*.** The pa
10a90 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
10aa0 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72  routine in order
10ab0 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
10ac0 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71   VIEW.*/.void sq
10ad0 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28  lite3CreateView(
10ae0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
10af0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  ,     /* The par
10b00 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
10b10 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c    Token *pBegin,
10b20 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41       /* The CREA
10b30 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
10b40 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65  gins the stateme
10b50 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nt */.  Token *p
10b60 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68  Name1,     /* Th
10b70 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c  e token that hol
10b80 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ds the name of t
10b90 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  he view */.  Tok
10ba0 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
10bb0 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
10bc0 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
10bd0 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
10be0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 4e 61    ExprList *pCNa
10bf0 6d 65 73 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c  mes, /* Optional
10c00 20 6c 69 73 74 20 6f 66 20 76 69 65 77 20 63 6f   list of view co
10c10 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
10c20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
10c30 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73     /* A SELECT s
10c40 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69  tatement that wi
10c50 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
10c60 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  w view */.  int 
10c70 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  isTemp,        /
10c80 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d  * TRUE for a TEM
10c90 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20  PORARY view */. 
10ca0 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20   int noErr      
10cb0 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20      /* Suppress 
10cc0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
10cd0 66 20 56 49 45 57 20 61 6c 72 65 61 64 79 20 65  f VIEW already e
10ce0 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61  xists */.){.  Ta
10cf0 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b  ble *p;.  int n;
10d00 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
10d10 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  ;.  Token sEnd;.
10d20 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a    DbFixer sFix;.
10d30 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d    Token *pName =
10d40 20 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20   0;.  int iDb;. 
10d50 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
10d60 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
10d70 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30  ( pParse->nVar>0
10d80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
10d90 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10da0 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20  "parameters are 
10db0 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76  not allowed in v
10dc0 69 65 77 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f  iews");.    goto
10dd0 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69   create_view_fai
10de0 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  l;.  }.  sqlite3
10df0 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73  StartTable(pPars
10e00 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
10e10 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c  2, isTemp, 1, 0,
10e20 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70   noErr);.  p = p
10e30 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
10e40 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
10e50 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
10e60 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f  oto create_view_
10e70 66 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54  fail;.  sqlite3T
10e80 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
10e90 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
10ea0 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44  2, &pName);.  iD
10eb0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
10ec0 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e  aToIndex(db, p->
10ed0 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69  pSchema);.  sqli
10ee0 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
10ef0 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
10f00 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  view", pName);. 
10f10 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 53   if( sqlite3FixS
10f20 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65  elect(&sFix, pSe
10f30 6c 65 63 74 29 20 29 20 67 6f 74 6f 20 63 72 65  lect) ) goto cre
10f40 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a  ate_view_fail;..
10f50 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79    /* Make a copy
10f60 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53   of the entire S
10f70 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
10f80 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
10f90 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73   view..  ** This
10fa0 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20   will force all 
10fb0 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a  the Expr.token.z
10fc0 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79   values to be dy
10fd0 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61  namically.  ** a
10fe0 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20  llocated rather 
10ff0 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68  than point to th
11000 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d  e input string -
11010 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61   which means tha
11020 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c  t.  ** they will
11030 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74   persist after t
11040 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74  he current sqlit
11050 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72  e3_exec() call r
11060 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70  eturns..  */.  p
11070 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
11080 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
11090 20 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55   pSelect, EXPRDU
110a0 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 70 2d 3e  P_REDUCE);.  p->
110b0 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33  pCheck = sqlite3
110c0 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
110d0 70 43 4e 61 6d 65 73 2c 20 45 58 50 52 44 55 50  pCNames, EXPRDUP
110e0 5f 52 45 44 55 43 45 29 3b 0a 20 20 69 66 28 20  _REDUCE);.  if( 
110f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11100 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76   ) goto create_v
11110 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20  iew_fail;..  /* 
11120 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f  Locate the end o
11130 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45  f the CREATE VIE
11140 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61  W statement.  Ma
11150 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f  ke sEnd point to
11160 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20  .  ** the end.. 
11170 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61   */.  sEnd = pPa
11180 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b  rse->sLastToken;
11190 0a 20 20 61 73 73 65 72 74 28 20 73 45 6e 64 2e  .  assert( sEnd.
111a0 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28  z[0]!=0 );.  if(
111b0 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20   sEnd.z[0]!=';' 
111c0 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d  ){.    sEnd.z +=
111d0 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73   sEnd.n;.  }.  s
111e0 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d  End.n = 0;.  n =
111f0 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20   (int)(sEnd.z - 
11200 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 61 73  pBegin->z);.  as
11210 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 7a  sert( n>0 );.  z
11220 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20   = pBegin->z;.  
11230 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73  while( sqlite3Is
11240 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b  space(z[n-1]) ){
11250 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a   n--; }.  sEnd.z
11260 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45   = &z[n-1];.  sE
11270 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20  nd.n = 1;..  /* 
11280 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61  Use sqlite3EndTa
11290 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68 65  ble() to add the
112a0 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c   view to the SQL
112b0 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
112c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64   */.  sqlite3End
112d0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c  Table(pParse, 0,
112e0 20 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 0a   &sEnd, 0, 0);..
112f0 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c  create_view_fail
11300 3a 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  :.  sqlite3Selec
11310 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
11320 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ect);.  sqlite3E
11330 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
11340 2c 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20 72 65  , pCNames);.  re
11350 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
11360 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
11370 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  EW */..#if !defi
11380 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
11390 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
113a0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
113b0 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a  RTUALTABLE)./*.*
113c0 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
113d0 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20  cture pTable is 
113e0 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20  really a VIEW.  
113f0 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65  Fill in the name
11400 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  s of.** the colu
11410 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20  mns of the view 
11420 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74  in the pTable st
11430 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
11440 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
11450 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
11460 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c   error is seen l
11470 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
11480 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
11490 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  >zErrMsg..*/.int
114a0 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
114b0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65  olumnNames(Parse
114c0 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
114d0 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c  *pTable){.  Tabl
114e0 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a  e *pSelTab;   /*
114f0 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72   A fake table fr
11500 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20  om which we get 
11510 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
11520 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
11530 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66  ;     /* Copy of
11540 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74   the SELECT that
11550 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
11560 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  view */.  int nE
11570 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  rr = 0;     /* N
11580 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
11590 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20  encountered */. 
115a0 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
115b0 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c     /* Temporaril
115c0 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62  y holds the numb
115d0 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73  er of cursors as
115e0 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  signed */.  sqli
115f0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
11600 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
11610 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f  se connection fo
11620 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
11630 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
11640 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
11650 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f 78  TION.  sqlite3_x
11660 61 75 74 68 20 78 41 75 74 68 3b 20 20 20 20 20  auth xAuth;     
11670 20 20 2f 2a 20 53 61 76 65 64 20 78 41 75 74 68    /* Saved xAuth
11680 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 23 65 6e 64   pointer */.#end
11690 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  if..  assert( pT
116a0 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66  able );..#ifndef
116b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
116c0 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
116d0 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43  sqlite3VtabCallC
116e0 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70  onnect(pParse, p
116f0 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65  Table) ){.    re
11700 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
11710 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56  R;.  }.  if( IsV
11720 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29  irtual(pTable) )
11730 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
11740 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
11750 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a  E_OMIT_VIEW.  /*
11760 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c   A positive nCol
11770 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d   means the colum
11780 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69  ns names for thi
11790 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20  s view are.  ** 
117a0 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20  already known.. 
117b0 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
117c0 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72  ->nCol>0 ) retur
117d0 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67  n 0;..  /* A neg
117e0 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20  ative nCol is a 
117f0 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d  special marker m
11800 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61  eaning that we a
11810 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a  re currently.  *
11820 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70  * trying to comp
11830 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ute the column n
11840 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74  ames.  If we ent
11850 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
11860 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61  with.  ** a nega
11870 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65  tive nCol, it me
11880 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ans two or more 
11890 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f  views form a loo
118a0 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  p, like this:.  
118b0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  **.  **     CREA
118c0 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53  TE VIEW one AS S
118d0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f  ELECT * FROM two
118e0 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
118f0 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45  E VIEW two AS SE
11900 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b  LECT * FROM one;
11910 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
11920 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61  lly, the error a
11930 62 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67  bove is now caug
11940 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63  ht prior to reac
11950 68 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e  hing this point.
11960 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f  .  ** But the fo
11970 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20  llowing test is 
11980 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20  still important 
11990 61 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20  as it does come 
119a0 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66  up.  ** in the f
119b0 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a  ollowing:.  ** .
119c0 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
119d0 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61  TABLE main.ex1(a
119e0 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  );.  **     CREA
119f0 54 45 20 54 45 4d 50 20 56 49 45 57 20 65 78 31  TE TEMP VIEW ex1
11a00 20 41 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f   AS SELECT a FRO
11a10 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20  M ex1;.  **     
11a20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65  SELECT * FROM te
11a30 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69  mp.ex1;.  */.  i
11a40 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c  f( pTable->nCol<
11a50 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
11a60 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11a70 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72   "view %s is cir
11a80 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22  cularly defined"
11a90 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
11aa0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
11ab0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54    }.  assert( pT
11ac0 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b  able->nCol>=0 );
11ad0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
11ae0 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
11af0 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63  ans we need to c
11b00 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65  ompute the table
11b10 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74   names..  ** Not
11b20 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20  e that the call 
11b30 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  to sqlite3Result
11b40 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69  SetOfSelect() wi
11b50 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20  ll expand any.  
11b60 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20  ** "*" elements 
11b70 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73  in the results s
11b80 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61  et of the view a
11b90 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63  nd will assign c
11ba0 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74  ursors.  ** to t
11bb0 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  he elements of t
11bc0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
11bd0 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77   But we do not w
11be0 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65  ant these change
11bf0 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72  s.  ** to be per
11c00 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20  manent.  So the 
11c10 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64  computation is d
11c20 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66  one on a copy of
11c30 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a   the SELECT.  **
11c40 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
11c50 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
11c60 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
11c70 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
11c80 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c   );.  pSel = sql
11c90 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
11ca0 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
11cb0 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65  t, 0);.  if( pSe
11cc0 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61  l ){.    n = pPa
11cd0 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73  rse->nTab;.    s
11ce0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
11cf0 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
11d00 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a  e, pSel->pSrc);.
11d10 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
11d20 20 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c   = -1;.    db->l
11d30 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c  ookaside.bDisabl
11d40 65 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  e++;.#ifndef SQL
11d50 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
11d60 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68  ZATION.    xAuth
11d70 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20   = db->xAuth;.  
11d80 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b    db->xAuth = 0;
11d90 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73  .    pSelTab = s
11da0 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
11db0 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
11dc0 70 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78  pSel);.    db->x
11dd0 41 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65  Auth = xAuth;.#e
11de0 6c 73 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20  lse.    pSelTab 
11df0 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
11e00 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
11e10 65 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66  e, pSel);.#endif
11e20 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  .    pParse->nTa
11e30 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70  b = n;.    if( p
11e40 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 20 29 7b  Table->pCheck ){
11e50 0a 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45  .      /* CREATE
11e60 20 56 49 45 57 20 6e 61 6d 65 28 61 72 67 6c 69   VIEW name(argli
11e70 73 74 29 20 41 53 20 2e 2e 2e 0a 20 20 20 20 20  st) AS ....     
11e80 20 2a 2a 20 54 68 65 20 6e 61 6d 65 73 20 6f 66   ** The names of
11e90 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   the columns in 
11ea0 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 74 61  the table are ta
11eb0 6b 65 6e 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a  ken from.      *
11ec0 2a 20 61 72 67 6c 69 73 74 20 77 68 69 63 68 20  * arglist which 
11ed0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 54 61  is stored in pTa
11ee0 62 6c 65 2d 3e 70 43 68 65 63 6b 2e 20 20 54 68  ble->pCheck.  Th
11ef0 65 20 70 43 68 65 63 6b 20 66 69 65 6c 64 0a 20  e pCheck field. 
11f00 20 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79       ** normally
11f10 20 68 6f 6c 64 73 20 43 48 45 43 4b 20 63 6f 6e   holds CHECK con
11f20 73 74 72 61 69 6e 74 73 20 6f 6e 20 61 6e 20 6f  straints on an o
11f30 72 64 69 6e 61 72 79 20 74 61 62 6c 65 2c 20 62  rdinary table, b
11f40 75 74 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ut for.      ** 
11f50 61 20 56 49 45 57 20 69 74 20 68 6f 6c 64 73 20  a VIEW it holds 
11f60 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  the list of colu
11f70 6d 6e 20 6e 61 6d 65 73 2e 0a 20 20 20 20 20 20  mn names..      
11f80 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
11f90 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
11fa0 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ist(pParse, pTab
11fb0 6c 65 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20  le->pCheck, .   
11fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
11fe0 54 61 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54  Table->nCol, &pT
11ff0 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  able->aCol);.   
12000 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
12010 63 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20  cFailed==0 .    
12020 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45     && pParse->nE
12030 72 72 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  rr==0.       && 
12040 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 70 53  pTable->nCol==pS
12050 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  el->pEList->nExp
12060 72 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  r.      ){.     
12070 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
12080 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
12090 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
120a0 2c 20 70 54 61 62 6c 65 2c 20 70 53 65 6c 29 3b  , pTable, pSel);
120b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
120c0 73 65 20 69 66 28 20 70 53 65 6c 54 61 62 20 29  se if( pSelTab )
120d0 7b 0a 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54  {.      /* CREAT
120e0 45 20 56 49 45 57 20 6e 61 6d 65 20 41 53 2e 2e  E VIEW name AS..
120f0 2e 20 20 77 69 74 68 6f 75 74 20 61 6e 20 61 72  .  without an ar
12100 67 75 6d 65 6e 74 20 6c 69 73 74 2e 20 20 43 6f  gument list.  Co
12110 6e 73 74 72 75 63 74 0a 20 20 20 20 20 20 2a 2a  nstruct.      **
12120 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
12130 73 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43  s from the SELEC
12140 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
12150 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
12160 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  w..      */.    
12170 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
12180 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
12190 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
121a0 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
121b0 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61  .      pTable->a
121c0 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
121d0 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  Col;.      pSelT
121e0 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
121f0 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
12200 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  l = 0;.      ass
12210 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
12220 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
12230 30 2c 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  0, pTable->pSche
12240 6d 61 29 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ma) );.    }else
12250 7b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  {.      pTable->
12260 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
12270 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nErr++;.    }.  
12280 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
12290 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62  able(db, pSelTab
122a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
122b0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
122c0 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  Sel);.    db->lo
122d0 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65  okaside.bDisable
122e0 2d 2d 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  --;.  } else {. 
122f0 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20     nErr++;.  }. 
12300 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
12310 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 20 7c 3d  ->schemaFlags |=
12320 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
12330 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
12340 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
12350 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
12360 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
12370 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
12380 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
12390 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
123a0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f  VIRTUALTABLE) */
123b0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
123c0 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
123d0 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
123e0 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65  n names from eve
123f0 72 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62  ry VIEW in datab
12400 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74  ase idx..*/.stat
12410 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69  ic void sqliteVi
12420 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74  ewResetAll(sqlit
12430 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29  e3 *db, int idx)
12440 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
12450 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12460 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
12470 64 28 64 62 2c 20 69 64 78 2c 20 30 29 20 29 3b  d(db, idx, 0) );
12480 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f  .  if( !DbHasPro
12490 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
124a0 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20  B_UnresetViews) 
124b0 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
124c0 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
124d0 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e  t(&db->aDb[idx].
124e0 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
124f0 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73  ); i;i=sqliteHas
12500 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54  hNext(i)){.    T
12510 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
12520 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
12530 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
12540 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73  elect ){.      s
12550 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75  qlite3DeleteColu
12560 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62  mnNames(db, pTab
12570 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61  );.      pTab->a
12580 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Col = 0;.      p
12590 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
125a0 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65     }.  }.  DbCle
125b0 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  arProperty(db, i
125c0 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
125d0 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  ews);.}.#else.# 
125e0 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65  define sqliteVie
125f0 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23  wResetAll(A,B).#
12600 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12610 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a  OMIT_VIEW */../*
12620 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12630 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
12640 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73  he VDBE to adjus
12650 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  t the internal s
12660 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79  chema.** used by
12670 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65   SQLite when the
12680 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76   btree layer mov
12690 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20  es a table root 
126a0 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f  page. The.** roo
126b0 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c  t-page of a tabl
126c0 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61  e or index in da
126d0 74 61 62 61 73 65 20 69 44 62 20 68 61 73 20 63  tabase iDb has c
126e0 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f  hanged from iFro
126f0 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a  m.** to iTo..**.
12700 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a  ** Ticket #1728:
12710 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62    The symbol tab
12720 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63  le might still c
12730 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69  ontain informati
12740 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20  on.** on tables 
12750 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74  and/or indices t
12760 68 61 74 20 61 72 65 20 74 68 65 20 70 72 6f 63  hat are the proc
12770 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c  ess of being del
12780 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20  eted..** If you 
12790 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65  are unlucky, one
127a0 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65   of those delete
127b0 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62  d indices or tab
127c0 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76  les might.** hav
127d0 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70  e the same rootp
127e0 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68  age number as th
127f0 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20  e real table or 
12800 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a  index that is.**
12810 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53   being moved.  S
12820 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70  o we cannot stop
12830 20 73 65 61 72 63 68 69 6e 67 20 61 66 74 65 72   searching after
12840 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
12850 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65   .** because the
12860 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67   first match mig
12870 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66  ht be for one of
12880 20 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64   the deleted ind
12890 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65  ices.** or table
128a0 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61  s and not the ta
128b0 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69  ble/index that i
128c0 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67  s actually being
128d0 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75   moved..** We mu
128e0 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70  st continue loop
128f0 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61  ing until all ta
12900 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73  bles and indices
12910 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67   with.** rootpag
12920 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65  e==iFrom have be
12930 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  en converted to 
12940 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20  have a rootpage 
12950 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64  of iTo.** in ord
12960 65 72 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e  er to be certain
12970 20 74 68 61 74 20 77 65 20 67 6f 74 20 74 68 65   that we got the
12980 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23   right one..*/.#
12990 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
129a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f  IT_AUTOVACUUM.vo
129b0 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61  id sqlite3RootPa
129c0 67 65 4d 6f 76 65 64 28 73 71 6c 69 74 65 33 20  geMoved(sqlite3 
129d0 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e  *db, int iDb, in
129e0 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
129f0 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  ){.  HashElem *p
12a00 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48  Elem;.  Hash *pH
12a10 61 73 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  ash;.  Db *pDb;.
12a20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12a30 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
12a40 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
12a50 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
12a60 62 5b 69 44 62 5d 3b 0a 20 20 70 48 61 73 68 20  b[iDb];.  pHash 
12a70 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  = &pDb->pSchema-
12a80 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28  >tblHash;.  for(
12a90 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
12aa0 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45  First(pHash); pE
12ab0 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
12ac0 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
12ad0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
12ae0 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
12af0 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
12b00 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d  if( pTab->tnum==
12b10 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
12b20 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Tab->tnum = iTo;
12b30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61  .    }.  }.  pHa
12b40 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65  sh = &pDb->pSche
12b50 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66  ma->idxHash;.  f
12b60 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
12b70 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b  ashFirst(pHash);
12b80 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
12b90 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
12ba0 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  em)){.    Index 
12bb0 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61  *pIdx = sqliteHa
12bc0 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
12bd0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75     if( pIdx->tnu
12be0 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  m==iFrom ){.    
12bf0 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69    pIdx->tnum = i
12c00 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  To;.    }.  }.}.
12c10 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
12c20 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73  ite code to eras
12c30 65 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  e the table with
12c40 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
12c50 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20  e from database 
12c60 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69  iDb..** Also wri
12c70 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66  te code to modif
12c80 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  y the sqlite_mas
12c90 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e  ter table and in
12ca0 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a  ternal schema.**
12cb0 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20   if a root-page 
12cc0 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  of another table
12cd0 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65   is moved by the
12ce0 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69   btree-layer whi
12cf0 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69  lst.** erasing i
12d00 54 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20  Table (this can 
12d10 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
12d20 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
12d30 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  ase)..*/ .static
12d40 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f   void destroyRoo
12d50 74 50 61 67 65 28 50 61 72 73 65 20 2a 70 50 61  tPage(Parse *pPa
12d60 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c  rse, int iTable,
12d70 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
12d80 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
12d90 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
12da0 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
12db0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
12dc0 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  se);.  assert( i
12dd0 54 61 62 6c 65 3e 31 20 29 3b 0a 20 20 73 71 6c  Table>1 );.  sql
12de0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
12df0 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54  , OP_Destroy, iT
12e00 61 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a  able, r1, iDb);.
12e10 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
12e20 74 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64  t(pParse);.#ifnd
12e30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
12e40 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f  UTOVACUUM.  /* O
12e50 50 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73  P_Destroy stores
12e60 20 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72   an in integer r
12e70 31 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67  1. If this integ
12e80 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a  er.  ** is non-z
12e90 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ero, then it is 
12ea0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
12eb0 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20  mber of a table 
12ec0 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f  moved to.  ** lo
12ed0 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54  cation iTable. T
12ee0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
12ef0 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73  e modifies the s
12f00 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
12f10 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65  le to.  ** refle
12f20 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20  ct this..  **.  
12f30 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e  ** The "#NNN" in
12f40 20 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70   the SQL is a sp
12f50 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74  ecial constant t
12f60 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76  hat means whatev
12f70 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73  er value.  ** is
12f80 20 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e   in register NNN
12f90 2e 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72  .  See grammar r
12fa0 75 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ules associated 
12fb0 77 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49  with the TK_REGI
12fc0 53 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20  STER.  ** token 
12fd0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
12fe0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f  nformation..  */
12ff0 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
13000 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
13010 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
13020 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25  s SET rootpage=%
13030 64 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20  d WHERE #%d AND 
13040 72 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20  rootpage=#%d",. 
13050 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
13060 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
13070 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20  e, MASTER_NAME, 
13080 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b  iTable, r1, r1);
13090 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
130a0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
130b0 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a  pParse, r1);.}..
130c0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45  /*.** Write VDBE
130d0 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74   code to erase t
130e0 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c  able pTab and al
130f0 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64  l associated ind
13100 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a  ices on disk..**
13110 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20   Code to update 
13120 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
13130 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74  r tables and int
13140 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66  ernal schema def
13150 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63  initions.** in c
13160 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20  ase a root-page 
13170 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f  belonging to ano
13180 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
13190 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
131a0 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73   layer.** is als
131b0 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61  o added (this ca
131c0 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e  n happen with an
131d0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
131e0 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  abase)..*/.stati
131f0 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61  c void destroyTa
13200 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
13210 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  e, Table *pTab){
13220 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
13230 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
13240 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
13250 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
13260 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
13270 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
13280 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73  >pSchema);.  des
13290 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
132a0 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  rse, pTab->tnum,
132b0 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64   iDb);.  for(pId
132c0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
132d0 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
132e0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73  >pNext){.    des
132f0 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
13300 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  rse, pIdx->tnum,
13310 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65   iDb);.  }.#else
13320 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
13330 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74  abase may be aut
13340 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65  o-vacuum capable
13350 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54   (if SQLITE_OMIT
13360 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a  _AUTOVACUUM.  **
13370 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29   is not defined)
13380 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70  , then it is imp
13390 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f  ortant to call O
133a0 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65  P_Destroy on the
133b0 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  .  ** table and 
133c0 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73  index root-pages
133d0 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74   in order, start
133e0 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d  ing with the num
133f0 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c  erically .  ** l
13400 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
13410 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75   number. This gu
13420 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f  arantees that no
13430 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70  ne of the root-p
13440 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  ages.  ** to be 
13450 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c  destroyed is rel
13460 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72  ocated by an ear
13470 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e  lier OP_Destroy.
13480 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a   i.e. if the.  *
13490 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65  * following were
134a0 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a   coded:.  **.  *
134b0 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30  * OP_Destroy 4 0
134c0 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f  .  ** ....  ** O
134d0 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20  P_Destroy 5 0.  
134e0 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74  **.  ** and root
134f0 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64   page 5 happened
13500 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65   to be the large
13510 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  st root-page num
13520 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ber in the.  ** 
13530 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72  database, then r
13540 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64  oot page 5 would
13550 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67   be moved to pag
13560 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a  e 4 by the .  **
13570 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30   "OP_Destroy 4 0
13580 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75  " opcode. The su
13590 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73  bsequent "OP_Des
135a0 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20  troy 5 0" would 
135b0 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d  hit.  ** a free-
135c0 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  list page..  */.
135d0 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61    int iTab = pTa
135e0 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69  b->tnum;.  int i
135f0 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a  Destroyed = 0;..
13600 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
13610 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
13620 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20     int iLargest 
13630 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44  = 0;..    if( iD
13640 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69  estroyed==0 || i
13650 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29  Tab<iDestroyed )
13660 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74  {.      iLargest
13670 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20   = iTab;.    }. 
13680 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
13690 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
136a0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
136b0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64  ){.      int iId
136c0 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a  x = pIdx->tnum;.
136d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
136e0 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  dx->pSchema==pTa
136f0 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
13700 20 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f      if( (iDestro
13710 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c  yed==0 || (iIdx<
13720 69 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20  iDestroyed)) && 
13730 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b  iIdx>iLargest ){
13740 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73  .        iLarges
13750 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20  t = iIdx;.      
13760 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
13770 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20  iLargest==0 ){. 
13780 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
13790 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
137a0 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
137b0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
137c0 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
137d0 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 61  Schema);.      a
137e0 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
137f0 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d   iDb<pParse->db-
13800 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 64 65  >nDb );.      de
13810 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
13820 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20  arse, iLargest, 
13830 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73  iDb);.      iDes
13840 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73  troyed = iLarges
13850 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  t;.    }.  }.#en
13860 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  dif.}../*.** Rem
13870 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ove entries from
13880 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
13890 4e 20 74 61 62 6c 65 73 20 28 66 6f 72 20 4e 20  N tables (for N 
138a0 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61  in (1,2,3)).** a
138b0 66 74 65 72 20 61 20 44 52 4f 50 20 49 4e 44 45  fter a DROP INDE
138c0 58 20 6f 72 20 44 52 4f 50 20 54 41 42 4c 45 20  X or DROP TABLE 
138d0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  command..*/.stat
138e0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43  ic void sqlite3C
138f0 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 0a  learStatTables(.
13900 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
13910 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13920 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
13930 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20  */.  int iDb,   
13940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13950 68 65 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  he database numb
13960 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  er */.  const ch
13970 61 72 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f  ar *zType,     /
13980 2a 20 22 69 64 78 22 20 6f 72 20 22 74 62 6c 22  * "idx" or "tbl"
13990 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
139a0 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20   *zName      /* 
139b0 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f 72  Name of index or
139c0 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69   table */.){.  i
139d0 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
139e0 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50  ar *zDbName = pP
139f0 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
13a00 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 66  b].zDbSName;.  f
13a10 6f 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b  or(i=1; i<=4; i+
13a20 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 61  +){.    char zTa
13a30 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74  b[24];.    sqlit
13a40 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
13a50 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73  of(zTab),zTab,"s
13a60 71 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69 29  qlite_stat%d",i)
13a70 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
13a80 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
13a90 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62  e->db, zTab, zDb
13aa0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73  Name) ){.      s
13ab0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
13ac0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
13ad0 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
13ae0 51 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25 51  Q.%s WHERE %s=%Q
13af0 22 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e 61  ",.        zDbNa
13b00 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c  me, zTab, zType,
13b10 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a   zName.      );.
13b20 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
13b30 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
13b40 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65   to drop a table
13b50 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
13b60 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 50  3CodeDropTable(P
13b70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
13b80 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69  ble *pTab, int i
13b90 44 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b  Db, int isView){
13ba0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
13bb0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
13bc0 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65  se->db;.  Trigge
13bd0 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 44  r *pTrigger;.  D
13be0 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
13bf0 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73  b[iDb];..  v = s
13c00 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
13c10 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
13c20 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   v!=0 );.  sqlit
13c30 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
13c40 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
13c50 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
13c60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
13c70 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49  UALTABLE.  if( I
13c80 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
13c90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
13ca0 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42  eAddOp0(v, OP_VB
13cb0 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  egin);.  }.#endi
13cc0 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  f..  /* Drop all
13cd0 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69   triggers associ
13ce0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
13cf0 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
13d00 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20  d. Code.  ** is 
13d10 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d  generated to rem
13d20 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ove entries from
13d30 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61   sqlite_master a
13d40 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74  nd/or.  ** sqlit
13d50 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66  e_temp_master if
13d60 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
13d70 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c    pTrigger = sql
13d80 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28  ite3TriggerList(
13d90 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
13da0 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72   while( pTrigger
13db0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
13dc0 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
13dd0 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
13de0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54 72   || .        pTr
13df0 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
13e00 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
13e10 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ma );.    sqlite
13e20 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28  3DropTriggerPtr(
13e30 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  pParse, pTrigger
13e40 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 20  );.    pTrigger 
13e50 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78  = pTrigger->pNex
13e60 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  t;.  }..#ifndef 
13e70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
13e80 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52  INCREMENT.  /* R
13e90 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65  emove any entrie
13ea0 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  s of the sqlite_
13eb0 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61  sequence table a
13ec0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20  ssociated with. 
13ed0 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
13ee0 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69  ing dropped. Thi
13ef0 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65  s is done before
13f00 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72   the table is dr
13f10 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74 68  opped.  ** at th
13f20 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69  e btree level, i
13f30 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74  n case the sqlit
13f40 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
13f50 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d   needs to.  ** m
13f60 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  ove as a result 
13f70 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e  of the drop (can
13f80 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
13f90 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20  vacuum mode)..  
13fa0 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  */.  if( pTab->t
13fb0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
13fc0 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20  oincrement ){.  
13fd0 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
13fe0 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
13ff0 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
14000 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
14010 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ce WHERE name=%Q
14020 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44  ",.      pDb->zD
14030 62 53 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e  bSName, pTab->zN
14040 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23  ame.    );.  }.#
14050 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70  endif..  /* Drop
14060 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54   all SQLITE_MAST
14070 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64  ER table and ind
14080 65 78 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ex entries that 
14090 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20 2a  refer to the.  *
140a0 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f  * table. The pro
140b0 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20  gram name loops 
140c0 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74  through the mast
140d0 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c  er table and del
140e0 65 74 65 73 0a 20 20 2a 2a 20 65 76 65 72 79 20  etes.  ** every 
140f0 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73 20  row that refers 
14100 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68  to a table of th
14110 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  e same name as t
14120 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a  he one being.  *
14130 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67  * dropped. Trigg
14140 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20  ers are handled 
14150 73 65 70 61 72 61 74 65 6c 79 20 62 65 63 61 75  separately becau
14160 73 65 20 61 20 74 72 69 67 67 65 72 20 63 61 6e  se a trigger can
14170 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64   be.  ** created
14180 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74   in the temp dat
14190 61 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72  abase that refer
141a0 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20  s to a table in 
141b0 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 64 61 74  another.  ** dat
141c0 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  abase..  */.  sq
141d0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
141e0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
141f0 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
14200 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d  %s WHERE tbl_nam
14210 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27  e=%Q and type!='
14220 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20  trigger'",.     
14230 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20   pDb->zDbSName, 
14240 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70 54 61  MASTER_NAME, pTa
14250 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b->zName);.  if(
14260 20 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56   !isView && !IsV
14270 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
14280 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65      destroyTable
14290 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
142a0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65    }..  /* Remove
142b0 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
142c0 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69   from SQLite's i
142d0 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61  nternal schema a
142e0 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74  nd modify.  ** t
142f0 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
14300 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  ..  */.  if( IsV
14310 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
14320 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14330 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73  ddOp4(v, OP_VDes
14340 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c  troy, iDb, 0, 0,
14350 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
14360 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
14370 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
14380 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20  DropTable, iDb, 
14390 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  0, 0, pTab->zNam
143a0 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  e, 0);.  sqlite3
143b0 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
143c0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c  rse, iDb);.  sql
143d0 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
143e0 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  db, iDb);.}../*.
143f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14400 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  is called to do 
14410 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52  the work of a DR
14420 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  OP TABLE stateme
14430 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20  nt..** pName is 
14440 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
14450 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70  table to be drop
14460 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ped..*/.void sql
14470 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61  ite3DropTable(Pa
14480 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
14490 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
144a0 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45   isView, int noE
144b0 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  rr){.  Table *pT
144c0 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ab;.  Vdbe *v;. 
144d0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
144e0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
144f0 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d   iDb;..  if( db-
14500 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
14510 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
14520 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
14530 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
14540 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73  >nErr==0 );.  as
14550 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
14560 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 73 71  c==1 );.  if( sq
14570 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
14580 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65  pParse) ) goto e
14590 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
145a0 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62    if( noErr ) db
145b0 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2b 2b 3b  ->suppressErr++;
145c0 0a 20 20 61 73 73 65 72 74 28 20 69 73 56 69 65  .  assert( isVie
145d0 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d  w==0 || isView==
145e0 4c 4f 43 41 54 45 5f 56 49 45 57 20 29 3b 0a 20  LOCATE_VIEW );. 
145f0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
14600 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70  ocateTableItem(p
14610 50 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20 26  Parse, isView, &
14620 70 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20  pName->a[0]);.  
14630 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e  if( noErr ) db->
14640 73 75 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a  suppressErr--;..
14650 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
14660 0a 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29  .    if( noErr )
14670 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
14680 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50  fyNamedSchema(pP
14690 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  arse, pName->a[0
146a0 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
146b0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
146c0 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44  _table;.  }.  iD
146d0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
146e0 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
146f0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61  b->pSchema);.  a
14700 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
14710 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
14720 0a 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73  .  /* If pTab is
14730 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
14740 2c 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f  , call ViewGetCo
14750 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65  lumnNames() to e
14760 6e 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73  nsure.  ** it is
14770 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20   initialized..  
14780 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
14790 61 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c 69  al(pTab) && sqli
147a0 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
147b0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
147c0 61 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ab) ){.    goto 
147d0 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
147e0 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
147f0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
14800 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
14810 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e  nt code;.    con
14820 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
14830 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
14840 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
14850 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
14860 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  [iDb].zDbSName;.
14870 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
14880 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69  zArg2 = 0;.    i
14890 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
148a0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
148b0 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
148c0 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20   0, zDb)){.     
148d0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
148e0 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
148f0 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
14900 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
14910 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
14920 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
14930 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
14940 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  MP_VIEW;.      }
14950 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
14960 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
14970 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23  _VIEW;.      }.#
14980 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14990 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
149a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
149b0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
149c0 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51  .      code = SQ
149d0 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45  LITE_DROP_VTABLE
149e0 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20  ;.      zArg2 = 
149f0 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
14a00 28 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f 64  (db, pTab)->pMod
14a10 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a  ->zName;.#endif.
14a20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14a30 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
14a40 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
14a50 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
14a60 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
14a70 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
14a80 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
14a90 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  = SQLITE_DROP_TA
14aa0 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
14ab0 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
14ac0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
14ad0 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e  se, code, pTab->
14ae0 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44  zName, zArg2, zD
14af0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
14b00 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14b10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14b20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
14b30 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
14b40 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e  DELETE, pTab->zN
14b50 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
14b60 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
14b70 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
14b80 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
14b90 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
14ba0 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
14bb0 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
14bc0 20 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33   .    && sqlite3
14bd0 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
14be0 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 74  Name, "sqlite_st
14bf0 61 74 22 2c 20 31 31 29 21 3d 30 20 29 7b 0a 20  at", 11)!=0 ){. 
14c00 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14c10 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
14c20 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
14c30 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e  dropped", pTab->
14c40 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
14c50 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14c60 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
14c70 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
14c80 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50    /* Ensure DROP
14c90 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73   TABLE is not us
14ca0 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e  ed on a view, an
14cb0 64 20 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e  d DROP VIEW is n
14cc0 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20  ot used.  ** on 
14cd0 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  a table..  */.  
14ce0 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54  if( isView && pT
14cf0 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
14d00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
14d10 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
14d20 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f  se DROP TABLE to
14d30 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73   delete table %s
14d40 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
14d50 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
14d60 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
14d70 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
14d80 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
14d90 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
14da0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
14db0 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64  e DROP VIEW to d
14dc0 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20  elete view %s", 
14dd0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
14de0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
14df0 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  _table;.  }.#end
14e00 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
14e10 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
14e20 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
14e30 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
14e40 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20  .  ** on disk.. 
14e50 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
14e60 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
14e70 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
14e80 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
14e90 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
14ea0 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20  se, 1, iDb);.   
14eb0 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61   sqlite3ClearSta
14ec0 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20  tTables(pParse, 
14ed0 69 44 62 2c 20 22 74 62 6c 22 2c 20 70 54 61 62  iDb, "tbl", pTab
14ee0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
14ef0 6c 69 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65  lite3FkDropTable
14f00 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20  (pParse, pName, 
14f10 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
14f20 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28  e3CodeDropTable(
14f30 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44  pParse, pTab, iD
14f40 62 2c 20 69 73 56 69 65 77 29 3b 0a 20 20 7d 0a  b, isView);.  }.
14f50 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65  .exit_drop_table
14f60 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
14f70 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61  stDelete(db, pNa
14f80 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  me);.}../*.** Th
14f90 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
14fa0 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
14fb0 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79   new foreign key
14fc0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a   on the table.**
14fd0 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
14fe0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
14ff0 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69  pFromCol determi
15000 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e  nes which column
15010 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72  s.** in the curr
15020 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20  ent table point 
15030 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  to the foreign k
15040 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c  ey.  If pFromCol
15050 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e  ==0 then.** conn
15060 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74  ect the key to t
15070 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
15080 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73  nserted.  pTo is
15090 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20   the name of.** 
150a0 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72  the table referr
150b0 65 64 20 74 6f 20 28 61 2e 6b 2e 61 20 74 68 65  ed to (a.k.a the
150c0 20 22 70 61 72 65 6e 74 22 20 74 61 62 6c 65 29   "parent" table)
150d0 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c  .  pToCol is a l
150e0 69 73 74 0a 2a 2a 20 6f 66 20 74 61 62 6c 65 73  ist.** of tables
150f0 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70   in the parent p
15100 54 6f 20 74 61 62 6c 65 2e 20 20 66 6c 61 67 73  To table.  flags
15110 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a   contains all.**
15120 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
15130 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  ut the conflict 
15140 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
15150 69 74 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a  ithms specified.
15160 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c  ** in the ON DEL
15170 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61  ETE, ON UPDATE a
15180 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61  nd ON INSERT cla
15190 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46  uses..**.** An F
151a0 4b 65 79 20 73 74 72 75 63 74 75 72 65 20 69 73  Key structure is
151b0 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64   created and add
151c0 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
151d0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64  currently.** und
151e0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
151f0 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70  in the pParse->p
15200 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a  NewTable field..
15210 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67  **.** The foreig
15220 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72  n key is set for
15230 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65   IMMEDIATE proce
15240 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71  ssing.  A subseq
15250 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20  uent call.** to 
15260 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
15270 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63  ignKey() might c
15280 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45  hange this to DE
15290 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20  FERRED..*/.void 
152a0 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72  sqlite3CreateFor
152b0 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65  eignKey(.  Parse
152c0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
152d0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
152e0 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
152f0 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20   *pFromCol,  /* 
15300 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20  Columns in this 
15310 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74  table that point
15320 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20   to other table 
15330 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c  */.  Token *pTo,
15340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
15350 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74  e of the other t
15360 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
15370 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f  st *pToCol,    /
15380 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  * Columns in the
15390 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
153a0 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
153b0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69         /* Confli
153c0 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
153d0 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a  gorithms. */.){.
153e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
153f0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e  pParse->db;.#ifn
15400 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15410 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b  FOREIGN_KEY.  FK
15420 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20  ey *pFKey = 0;. 
15430 20 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a   FKey *pNextTo;.
15440 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61    Table *p = pPa
15450 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
15460 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69    int nByte;.  i
15470 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  nt i;.  int nCol
15480 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20  ;.  char *z;..  
15490 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29  assert( pTo!=0 )
154a0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
154b0 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
154c0 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
154d0 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30   if( pFromCol==0
154e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   ){.    int iCol
154f0 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
15500 20 20 69 66 28 20 4e 45 56 45 52 28 69 43 6f 6c    if( NEVER(iCol
15510 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  <0) ) goto fk_en
15520 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f  d;.    if( pToCo
15530 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
15540 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  pr!=1 ){.      s
15550 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15560 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20  Parse, "foreign 
15570 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20  key on %s".     
15580 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66      " should ref
15590 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20  erence only one 
155a0 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
155b0 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d  %T",.         p-
155c0 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
155d0 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67  e, pTo);.      g
155e0 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
155f0 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a  }.    nCol = 1;.
15600 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43    }else if( pToC
15610 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45  ol && pToCol->nE
15620 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  xpr!=pFromCol->n
15630 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Expr ){.    sqli
15640 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15650 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d  se,.        "num
15660 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
15670 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f  n foreign key do
15680 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
15690 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20   number of ".   
156a0 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e       "columns in
156b0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
156c0 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74  table");.    got
156d0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73  o fk_end;.  }els
156e0 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46  e{.    nCol = pF
156f0 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20  romCol->nExpr;. 
15700 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a   }.  nByte = siz
15710 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e  eof(*pFKey) + (n
15720 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46  Col-1)*sizeof(pF
15730 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20  Key->aCol[0]) + 
15740 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66  pTo->n + 1;.  if
15750 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
15760 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f  for(i=0; i<pToCo
15770 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  l->nExpr; i++){.
15780 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73        nByte += s
15790 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
157a0 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
157b0 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20  e) + 1;.    }.  
157c0 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69  }.  pFKey = sqli
157d0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
157e0 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  db, nByte );.  i
157f0 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20  f( pFKey==0 ){. 
15800 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
15810 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72    }.  pFKey->pFr
15820 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d  om = p;.  pFKey-
15830 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e  >pNextFrom = p->
15840 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68  pFKey;.  z = (ch
15850 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c  ar*)&pFKey->aCol
15860 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d  [nCol];.  pFKey-
15870 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63  >zTo = z;.  memc
15880 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54  py(z, pTo->z, pT
15890 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e  o->n);.  z[pTo->
158a0 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  n] = 0;.  sqlite
158b0 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a  3Dequote(z);.  z
158c0 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20   += pTo->n+1;.  
158d0 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43  pFKey->nCol = nC
158e0 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43  ol;.  if( pFromC
158f0 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b  ol==0 ){.    pFK
15900 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f  ey->aCol[0].iFro
15910 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  m = p->nCol-1;. 
15920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
15930 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
15940 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  ){.      int j;.
15950 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
15960 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  <p->nCol; j++){.
15970 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
15980 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43  te3StrICmp(p->aC
15990 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72  ol[j].zName, pFr
159a0 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
159b0 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
159c0 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69     pFKey->aCol[i
159d0 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20  ].iFrom = j;.   
159e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
159f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15a00 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e        if( j>=p->
15a10 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
15a20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15a30 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
15a40 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75     "unknown colu
15a50 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72  mn \"%s\" in for
15a60 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
15a70 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  ion", .         
15a80 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
15a90 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
15aa0 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
15ab0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
15ac0 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
15ad0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
15ae0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
15af0 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
15b00 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e  trlen30(pToCol->
15b10 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
15b20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69     pFKey->aCol[i
15b30 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20  ].zCol = z;.    
15b40 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43    memcpy(z, pToC
15b50 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  ol->a[i].zName, 
15b60 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d  n);.      z[n] =
15b70 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e   0;.      z += n
15b80 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  +1;.    }.  }.  
15b90 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
15ba0 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e  d = 0;.  pFKey->
15bb0 61 41 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38  aAction[0] = (u8
15bc0 29 28 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b  )(flags & 0xff);
15bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
15be0 4e 20 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 20  N DELETE action 
15bf0 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74  */.  pFKey->aAct
15c00 69 6f 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 66  ion[1] = (u8)((f
15c10 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78  lags >> 8 ) & 0x
15c20 66 66 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50  ff);    /* ON UP
15c30 44 41 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a  DATE action */..
15c40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15c50 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
15c60 28 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65  (db, 0, p->pSche
15c70 6d 61 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f  ma) );.  pNextTo
15c80 20 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74   = (FKey *)sqlit
15c90 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d  e3HashInsert(&p-
15ca0 3e 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61  >pSchema->fkeyHa
15cb0 73 68 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79  sh, .      pFKey
15cc0 2d 3e 7a 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70  ->zTo, (void *)p
15cd0 46 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66 28 20  FKey.  );.  if( 
15ce0 70 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29  pNextTo==pFKey )
15cf0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d  {.    sqlite3Oom
15d00 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 67  Fault(db);.    g
15d10 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a  oto fk_end;.  }.
15d20 20 20 69 66 28 20 70 4e 65 78 74 54 6f 20 29 7b    if( pNextTo ){
15d30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
15d40 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30  xtTo->pPrevTo==0
15d50 20 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70   );.    pFKey->p
15d60 4e 65 78 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f  NextTo = pNextTo
15d70 3b 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70  ;.    pNextTo->p
15d80 50 72 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a  PrevTo = pFKey;.
15d90 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74    }..  /* Link t
15da0 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74  he foreign key t
15db0 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74  o the table as t
15dc0 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20  he last step..  
15dd0 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20  */.  p->pFKey = 
15de0 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d  pFKey;.  pFKey =
15df0 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73   0;..fk_end:.  s
15e00 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
15e10 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20   pFKey);.#endif 
15e20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
15e30 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
15e40 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  KEY) */.  sqlite
15e50 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
15e60 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20  db, pFromCol);. 
15e70 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
15e80 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f  Delete(db, pToCo
15e90 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  l);.}../*.** Thi
15ea0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
15eb0 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54  led when an INIT
15ec0 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20  IALLY IMMEDIATE 
15ed0 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  or INITIALLY DEF
15ee0 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20  ERRED.** clause 
15ef0 69 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20  is seen as part 
15f00 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  of a foreign key
15f10 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68   definition.  Th
15f20 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20  e isDeferred.** 
15f30 70 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66  parameter is 1 f
15f40 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  or INITIALLY DEF
15f50 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20  ERRED and 0 for 
15f60 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
15f70 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61  ATE..** The beha
15f80 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74  vior of the most
15f90 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65   recently create
15fa0 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  d foreign key is
15fb0 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63   adjusted.** acc
15fc0 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69  ordingly..*/.voi
15fd0 64 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f  d sqlite3DeferFo
15fe0 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a  reignKey(Parse *
15ff0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65  pParse, int isDe
16000 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66  ferred){.#ifndef
16010 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
16020 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65  EIGN_KEY.  Table
16030 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a   *pTab;.  FKey *
16040 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54  pFKey;.  if( (pT
16050 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
16060 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70  wTable)==0 || (p
16070 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b  FKey = pTab->pFK
16080 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ey)==0 ) return;
16090 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 65 66  .  assert( isDef
160a0 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65  erred==0 || isDe
160b0 66 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20  ferred==1 ); /* 
160c0 45 56 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31  EV: R-30323-2191
160d0 37 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73  7 */.  pFKey->is
160e0 44 65 66 65 72 72 65 64 20 3d 20 28 75 38 29 69  Deferred = (u8)i
160f0 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69  sDeferred;.#endi
16100 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  f.}../*.** Gener
16110 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
16120 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66  ll erase and ref
16130 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e  ill index *pIdx.
16140 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65    This is.** use
16150 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
16160 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20  a newly created 
16170 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f  index or to reco
16180 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e  mpute the.** con
16190 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  tent of an index
161a0 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20   in response to 
161b0 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  a REINDEX comman
161c0 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52  d..**.** if memR
161d0 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  ootPage is not n
161e0 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e  egative, it mean
161f0 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78  s that the index
16200 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65   is newly.** cre
16210 61 74 65 64 2e 20 20 54 68 65 20 72 65 67 69 73  ated.  The regis
16220 74 65 72 20 73 70 65 63 69 66 69 65 64 20 62 79  ter specified by
16230 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e   memRootPage con
16240 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  tains the.** roo
16250 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
16260 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20   the index.  If 
16270 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e  memRootPage is n
16280 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a  egative, then.**
16290 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61   the index alrea
162a0 64 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75  dy exists and mu
162b0 73 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65  st be cleared be
162c0 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c  fore being refil
162d0 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72  led and.** the r
162e0 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
162f0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
16300 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65  taken from pInde
16310 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74  x->tnum..*/.stat
16320 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52  ic void sqlite3R
16330 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65  efillIndex(Parse
16340 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
16350 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d  *pIndex, int mem
16360 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62  RootPage){.  Tab
16370 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
16380 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54  x->pTable;  /* T
16390 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
163a0 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
163b0 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d  t iTab = pParse-
163c0 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20  >nTab++;     /* 
163d0 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65  Btree cursor use
163e0 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  d for pTab */.  
163f0 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73  int iIdx = pPars
16400 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
16410 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75  * Btree cursor u
16420 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a  sed for pIndex *
16430 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 65 72 3b  /.  int iSorter;
16440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16450 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65     /* Cursor ope
16460 6e 65 64 20 62 79 20 4f 70 65 6e 53 6f 72 74 65  ned by OpenSorte
16470 72 20 28 69 66 20 69 6e 20 75 73 65 29 20 2a 2f  r (if in use) */
16480 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20  .  int addr1;   
16490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164a0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
164b0 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20  top of loop */. 
164c0 20 69 6e 74 20 61 64 64 72 32 3b 20 20 20 20 20   int addr2;     
164d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164e0 2f 2a 20 41 64 64 72 65 73 73 20 74 6f 20 6a 75  /* Address to ju
164f0 6d 70 20 74 6f 20 66 6f 72 20 6e 65 78 74 20 69  mp to for next i
16500 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  teration */.  in
16510 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  t tnum;         
16520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16530 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64  Root page of ind
16540 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ex */.  int iPar
16550 74 49 64 78 4c 61 62 65 6c 3b 20 20 20 20 20 20  tIdxLabel;      
16560 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74         /* Jump t
16570 6f 20 74 68 69 73 20 6c 61 62 65 6c 20 74 6f 20  o this label to 
16580 73 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20  skip a row */.  
16590 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
165a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
165b0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
165c0 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61  into this virtua
165d0 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b  l machine */.  K
165e0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20  eyInfo *pKey;   
165f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16600 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64   KeyInfo for ind
16610 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  ex */.  int regR
16620 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20  ecord;          
16630 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
16640 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d  er holding assem
16650 62 6c 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72  bled index recor
16660 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
16670 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
16680 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
16690 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
166a0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20   */.  int iDb = 
166b0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
166c0 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d  ndex(db, pIndex-
166d0 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e  >pSchema);..#ifn
166e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
166f0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
16700 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
16710 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
16720 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e  ITE_REINDEX, pIn
16730 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20  dex->zName, 0,. 
16740 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
16750 5d 2e 7a 44 62 53 4e 61 6d 65 20 29 20 29 7b 0a  ].zDbSName ) ){.
16760 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
16770 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71  #endif..  /* Req
16780 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
16790 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  k on the table t
167a0 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f  o perform this o
167b0 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  peration */.  sq
167c0 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
167d0 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
167e0 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d  ->tnum, 1, pTab-
167f0 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20  >zName);..  v = 
16800 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
16810 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
16820 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
16830 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d  f( memRootPage>=
16840 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  0 ){.    tnum = 
16850 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d  memRootPage;.  }
16860 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d  else{.    tnum =
16870 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20   pIndex->tnum;. 
16880 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69   }.  pKey = sqli
16890 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65  te3KeyInfoOfInde
168a0 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
168b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
168c0 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  y!=0 || db->mall
168d0 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
168e0 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 0a 20 20 2f  se->nErr );..  /
168f0 2a 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65  * Open the sorte
16900 72 20 63 75 72 73 6f 72 20 69 66 20 77 65 20 61  r cursor if we a
16910 72 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a  re to use one. *
16920 2f 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50  /.  iSorter = pP
16930 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
16940 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16950 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  4(v, OP_SorterOp
16960 65 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20  en, iSorter, 0, 
16970 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c  pIndex->nKeyCol,
16980 20 28 63 68 61 72 2a 29 0a 20 20 20 20 20 20 20   (char*).       
16990 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
169a0 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
169b0 4b 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Key), P4_KEYINFO
169c0 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  );..  /* Open th
169d0 65 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68  e table. Loop th
169e0 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f  rough all rows o
169f0 66 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e 73  f the table, ins
16a00 65 72 74 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a  erting index.  *
16a10 2a 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74  * records into t
16a20 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20  he sorter. */.  
16a30 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
16a40 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69  (pParse, iTab, i
16a50 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
16a60 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20  nRead);.  addr1 
16a70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
16a80 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
16a90 2c 20 69 54 61 62 2c 20 30 29 3b 20 56 64 62 65  , iTab, 0); Vdbe
16aa0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 72  Coverage(v);.  r
16ab0 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
16ac0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
16ad0 72 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  rse);..  sqlite3
16ae0 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
16af0 28 70 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69  (pParse,pIndex,i
16b00 54 61 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c  Tab,regRecord,0,
16b10 26 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30  &iPartIdxLabel,0
16b20 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ,0);.  sqlite3Vd
16b30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
16b40 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f  orterInsert, iSo
16b50 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29  rter, regRecord)
16b60 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
16b70 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70  vePartIdxLabel(p
16b80 50 61 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c  Parse, iPartIdxL
16b90 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  abel);.  sqlite3
16ba0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16bb0 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
16bc0 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  r1+1); VdbeCover
16bd0 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
16be0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
16bf0 20 61 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d   addr1);.  if( m
16c00 65 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73  emRootPage<0 ) s
16c10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16c20 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e  (v, OP_Clear, tn
16c30 75 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  um, iDb);.  sqli
16c40 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
16c50 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69   OP_OpenWrite, i
16c60 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20  Idx, tnum, iDb, 
16c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16c80 20 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65       (char *)pKe
16c90 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  y, P4_KEYINFO);.
16ca0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
16cb0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
16cc0 42 55 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f  BULKCSR|((memRoo
16cd0 74 50 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47  tPage>=0)?OPFLAG
16ce0 5f 50 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20  _P2ISREG:0));.. 
16cf0 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
16d00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16d10 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f  _SorterSort, iSo
16d20 72 74 65 72 2c 20 30 29 3b 20 56 64 62 65 43 6f  rter, 0); VdbeCo
16d30 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28  verage(v);.  if(
16d40 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
16d50 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69 6e  Index) ){.    in
16d60 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t j2 = sqlite3Vd
16d70 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
16d80 20 2b 20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65   + 3;.    sqlite
16d90 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6a 32 29  3VdbeGoto(v, j2)
16da0 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  ;.    addr2 = sq
16db0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
16dc0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
16dd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
16de0 74 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f  t(v, OP_SorterCo
16df0 6d 70 61 72 65 2c 20 69 53 6f 72 74 65 72 2c 20  mpare, iSorter, 
16e00 6a 32 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20  j2, regRecord,. 
16e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
16e30 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f  nKeyCol); VdbeCo
16e40 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
16e50 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73  qlite3UniqueCons
16e60 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 4f  traint(pParse, O
16e70 45 5f 41 62 6f 72 74 2c 20 70 49 6e 64 65 78 29  E_Abort, pIndex)
16e80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
16e90 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
16ea0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
16eb0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
16ec0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16ed0 53 6f 72 74 65 72 44 61 74 61 2c 20 69 53 6f 72  SorterData, iSor
16ee0 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20  ter, regRecord, 
16ef0 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  iIdx);.  sqlite3
16f00 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
16f10 5f 4c 61 73 74 2c 20 69 49 64 78 2c 20 30 2c 20  _Last, iIdx, 0, 
16f20 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  -1);.  sqlite3Vd
16f30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
16f40 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20  dxInsert, iIdx, 
16f50 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
16f60 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
16f70 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
16f80 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71  EEKRESULT);.  sq
16f90 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16fa0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
16fb0 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
16fc0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16fd0 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 53  P_SorterNext, iS
16fe0 6f 72 74 65 72 2c 20 61 64 64 72 32 29 3b 20 56  orter, addr2); V
16ff0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
17000 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
17010 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
17020 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ..  sqlite3VdbeA
17030 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
17040 65 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69  e, iTab);.  sqli
17050 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
17060 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29   OP_Close, iIdx)
17070 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
17080 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
17090 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a  e, iSorter);.}..
170a0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68  /*.** Allocate h
170b0 65 61 70 20 73 70 61 63 65 20 74 6f 20 68 6f 6c  eap space to hol
170c0 64 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63  d an Index objec
170d0 74 20 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75  t with nCol colu
170e0 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65  mns..**.** Incre
170f0 61 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  ase the allocati
17100 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72 6f 76 69  on size to provi
17110 64 65 20 61 6e 20 65 78 74 72 61 20 6e 45 78 74  de an extra nExt
17120 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38  ra bytes.** of 8
17130 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 73 70  -byte aligned sp
17140 61 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e  ace after the In
17150 64 65 78 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  dex object and r
17160 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74  eturn a.** point
17170 65 72 20 74 6f 20 74 68 69 73 20 65 78 74 72 61  er to this extra
17180 20 73 70 61 63 65 20 69 6e 20 2a 70 70 45 78 74   space in *ppExt
17190 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71  ra..*/.Index *sq
171a0 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64  lite3AllocateInd
171b0 65 78 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c 69  exObject(.  sqli
171c0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
171d0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
171e0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36  nection */.  i16
171f0 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   nCol,          
17200 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
17210 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
17220 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  the index */.  i
17230 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
17240 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17250 20 62 79 74 65 73 20 6f 66 20 65 78 74 72 61 20   bytes of extra 
17260 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a  space to alloc *
17270 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 45 78 74  /.  char **ppExt
17280 72 61 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ra       /* Poin
17290 74 65 72 20 74 6f 20 74 68 65 20 22 65 78 74 72  ter to the "extr
172a0 61 22 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20  a" space */.){. 
172b0 20 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20   Index *p;      
172c0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
172d0 65 64 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ed index object 
172e0 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
172f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
17300 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
17310 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2b 20 61  Index object + a
17320 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74  rrays */..  nByt
17330 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e = ROUND8(sizeo
17340 66 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20  f(Index)) +     
17350 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
17360 78 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a  x structure  */.
17370 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38            ROUND8
17380 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e  (sizeof(char*)*n
17390 43 6f 6c 29 20 2b 20 20 20 20 20 20 20 20 20 2f  Col) +         /
173a0 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20  * Index.azColl  
173b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
173c0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4c 6f  ROUND8(sizeof(Lo
173d0 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b  gEst)*(nCol+1) +
173e0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
173f0 52 6f 77 4c 6f 67 45 73 74 20 20 20 2a 2f 0a 20  RowLogEst   */. 
17400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17410 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c  sizeof(i16)*nCol
17420 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   +            /*
17430 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20   Index.aiColumn 
17440 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
17450 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29        sizeof(u8)
17460 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20 20 20  *nCol);         
17470 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f      /* Index.aSo
17480 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d  rtOrder */.  p =
17490 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
174a0 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b  Zero(db, nByte +
174b0 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20   nExtra);.  if( 
174c0 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70  p ){.    char *p
174d0 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29  Extra = ((char*)
174e0 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)+ROUND8(sizeof
174f0 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70 2d  (Index));.    p-
17500 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74  >azColl = (const
17510 20 63 68 61 72 2a 2a 29 70 45 78 74 72 61 3b 20   char**)pExtra; 
17520 70 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38  pExtra += ROUND8
17530 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e  (sizeof(char*)*n
17540 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52  Col);.    p->aiR
17550 6f 77 4c 6f 67 45 73 74 20 3d 20 28 4c 6f 67 45  owLogEst = (LogE
17560 73 74 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74  st*)pExtra; pExt
17570 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67  ra += sizeof(Log
17580 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20  Est)*(nCol+1);. 
17590 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d     p->aiColumn =
175a0 20 28 69 31 36 2a 29 70 45 78 74 72 61 3b 20 20   (i16*)pExtra;  
175b0 20 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20 73       pExtra += s
175c0 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b  izeof(i16)*nCol;
175d0 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64  .    p->aSortOrd
175e0 65 72 20 3d 20 28 75 38 2a 29 70 45 78 74 72 61  er = (u8*)pExtra
175f0 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e  ;.    p->nColumn
17600 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e   = nCol;.    p->
17610 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d  nKeyCol = nCol -
17620 20 31 3b 0a 20 20 20 20 2a 70 70 45 78 74 72 61   1;.    *ppExtra
17630 20 3d 20 28 28 63 68 61 72 2a 29 70 29 20 2b 20   = ((char*)p) + 
17640 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74  nByte;.  }.  ret
17650 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
17660 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64  Create a new ind
17670 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61  ex for an SQL ta
17680 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61  ble.  pName1.pNa
17690 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20  me2 is the name 
176a0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a  of the index .**
176b0 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73   and pTblList is
176c0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
176d0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
176e0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42  o be indexed.  B
176f0 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20  oth will .** be 
17700 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61  NULL for a prima
17710 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64  ry key or an ind
17720 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74  ex that is creat
17730 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a  ed to satisfy a.
17740 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ** UNIQUE constr
17750 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65  aint.  If pTable
17760 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20   and pIndex are 
17770 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65  NULL, use pParse
17780 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61  ->pNewTable.** a
17790 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  s the table to b
177a0 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72  e indexed.  pPar
177b0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73  se->pNewTable is
177c0 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73   a table that is
177d0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65  .** currently be
177e0 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
177f0 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  by a CREATE TABL
17800 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
17810 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  ** pList is a li
17820 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
17830 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c   be indexed.  pL
17840 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ist will be NULL
17850 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61   if this.** is a
17860 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
17870 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e  unique-constrain
17880 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
17890 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  cent column adde
178a0 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c  d.** to the tabl
178b0 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
178c0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
178d0 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
178e0 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20  3CreateIndex(.  
178f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
17900 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d     /* All inform
17910 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73  ation about this
17920 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65   parse */.  Toke
17930 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
17940 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20  * First part of 
17950 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20  index name. May 
17960 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b  be NULL */.  Tok
17970 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
17980 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f  /* Second part o
17990 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
179a0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53  y be NULL */.  S
179b0 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65  rcList *pTblName
179c0 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e  , /* Table to in
179d0 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d  dex. Use pParse-
179e0 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20  >pNewTable if 0 
179f0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
17a00 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73  List,   /* A lis
17a10 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
17a20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
17a30 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
17a40 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20     /* OE_Abort, 
17a50 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65  OE_Ignore, OE_Re
17a60 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e  place, or OE_Non
17a70 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53  e */.  Token *pS
17a80 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  tart,     /* The
17a90 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
17aa0 61 74 20 62 65 67 69 6e 73 20 74 68 69 73 20 73  at begins this s
17ab0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  tatement */.  Ex
17ac0 70 72 20 2a 70 50 49 57 68 65 72 65 2c 20 20 20  pr *pPIWhere,   
17ad0 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
17ae0 20 66 6f 72 20 70 61 72 74 69 61 6c 20 69 6e 64   for partial ind
17af0 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  ices */.  int so
17b00 72 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20  rtOrder,     /* 
17b10 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72  Sort order of pr
17b20 69 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70  imary key when p
17b30 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20  List==NULL */.  
17b40 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 2c 20  int ifNotExist, 
17b50 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72     /* Omit error
17b60 20 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64   if index alread
17b70 79 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 75 38  y exists */.  u8
17b80 20 69 64 78 54 79 70 65 20 20 20 20 20 20 20 20   idxType        
17b90 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 79   /* The index ty
17ba0 70 65 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  pe */.){.  Table
17bb0 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
17bc0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69  /* Table to be i
17bd0 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ndexed */.  Inde
17be0 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20  x *pIndex = 0;  
17bf0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
17c00 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20   be created */. 
17c10 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
17c20 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
17c30 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
17c40 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
17c50 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
17c60 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
17c70 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69  zName */.  int i
17c80 2c 20 6a 3b 0a 20 20 44 62 46 69 78 65 72 20 73  , j;.  DbFixer s
17c90 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  Fix;        /* F
17ca0 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74  or assigning dat
17cb0 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70  abase names to p
17cc0 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73  Table */.  int s
17cd0 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20  ortOrderMask;   
17ce0 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45  /* 1 to honor DE
17cf0 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20  SC in index.  0 
17d00 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20  to ignore. */.  
17d10 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
17d20 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a  arse->db;.  Db *
17d30 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
17d40 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63   /* The specific
17d50 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
17d60 67 20 74 68 65 20 69 6e 64 65 78 65 64 20 64 61  g the indexed da
17d70 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
17d80 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
17d90 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
17da0 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69   database that i
17db0 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  s being written 
17dc0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
17dd0 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71  e = 0;    /* Unq
17de0 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
17df0 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72   the index to cr
17e00 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  eate */.  struct
17e10 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
17e20 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f  pListItem; /* Fo
17e30 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
17e40 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  List */.  int nE
17e50 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20  xtra = 0;       
17e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
17e70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
17e80 72 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20  r zExtra[] */.  
17e90 69 6e 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20  int nExtraCol;  
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17eb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
17ec0 74 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64  tra columns need
17ed0 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45  ed */.  char *zE
17ee0 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20  xtra = 0;       
17ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
17f00 61 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68  a space after th
17f10 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  e Index object *
17f20 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d  /.  Index *pPk =
17f30 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 52 49 4d   0;      /* PRIM
17f40 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f  ARY KEY index fo
17f50 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
17f60 74 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 69 66 28  tables */..  if(
17f70 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
17f80 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
17f90 72 3e 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  r>0 ){.    goto 
17fa0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
17fb0 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e 5f  x;.  }.  if( IN_
17fc0 44 45 43 4c 41 52 45 5f 56 54 41 42 20 26 26 20  DECLARE_VTAB && 
17fd0 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  idxType!=SQLITE_
17fe0 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b  IDXTYPE_PRIMARYK
17ff0 45 59 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  EY ){.    goto e
18000 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18010 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49  ;.  }.  if( SQLI
18020 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
18030 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
18040 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
18050 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
18060 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
18070 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68  ind the table th
18080 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
18090 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72  xed.  Return ear
180a0 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ly if not found.
180b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c  .  */.  if( pTbl
180c0 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20  Name!=0 ){..    
180d0 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70  /* Use the two-p
180e0 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74  art index name t
180f0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
18100 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
18110 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74   to search for t
18120 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20  he table. 'Fix' 
18130 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  the table name t
18140 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a  o this db.    **
18150 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20   before looking 
18160 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  up the table..  
18170 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
18180 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65   pName1 && pName
18190 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  2 );.    iDb = s
181a0 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
181b0 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
181c0 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
181d0 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
181e0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
181f0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61  ate_index;.    a
18200 73 73 65 72 74 28 20 70 4e 61 6d 65 20 26 26 20  ssert( pName && 
18210 70 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66  pName->z );..#if
18220 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18230 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49  _TEMPDB.    /* I
18240 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
18250 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64   was unqualified
18260 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74  , check if the t
18270 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61  able.    ** is a
18280 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20   temp table. If 
18290 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  so, set the data
182a0 62 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f  base to 1. Do no
182b0 74 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a  t do this.    **
182c0 20 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67   if initialising
182d0 20 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65   a database sche
182e0 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ma..    */.    i
182f0 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
18300 79 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  y ){.      pTab 
18310 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
18320 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
18330 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TblName);.      
18340 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30  if( pName2->n==0
18350 20 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62   && pTab && pTab
18360 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61  ->pSchema==db->a
18370 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b  Db[1].pSchema ){
18380 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31  .        iDb = 1
18390 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
183a0 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69  #endif..    sqli
183b0 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
183c0 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
183d0 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a  index", pName);.
183e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
183f0 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c  ixSrcList(&sFix,
18400 20 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20   pTblName) ){.  
18410 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74      /* Because t
18420 68 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72  he parser constr
18430 75 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72  ucts pTblName fr
18440 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e  om a single iden
18450 74 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a  tifier,.      **
18460 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
18470 73 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69  st can never fai
18480 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  l. */.      asse
18490 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rt(0);.    }.   
184a0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
184b0 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70  ocateTableItem(p
184c0 50 61 72 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e  Parse, 0, &pTblN
184d0 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20  ame->a[0]);.    
184e0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
184f0 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70  ocFailed==0 || p
18500 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab==0 );.    if
18510 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f  ( pTab==0 ) goto
18520 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18530 65 78 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d  ex;.    if( iDb=
18540 3d 31 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 44  =1 && db->aDb[iD
18550 62 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54 61 62  b].pSchema!=pTab
18560 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
18570 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
18580 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
18590 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63         "cannot c
185a0 72 65 61 74 65 20 61 20 54 45 4d 50 20 69 6e 64  reate a TEMP ind
185b0 65 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74  ex on non-TEMP t
185c0 61 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20  able \"%s\"",.  
185d0 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a           pTab->z
185e0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
185f0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18600 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
18610 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
18620 62 29 20 29 20 70 50 6b 20 3d 20 73 71 6c 69 74  b) ) pPk = sqlit
18630 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
18640 78 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65  x(pTab);.  }else
18650 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
18660 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ame==0 );.    as
18670 73 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20  sert( pStart==0 
18680 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50  );.    pTab = pP
18690 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
186a0 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29  .    if( !pTab )
186b0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
186c0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62  e_index;.    iDb
186d0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
186e0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
186f0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a  ->pSchema);.  }.
18700 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
18710 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74  [iDb];..  assert
18720 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61  ( pTab!=0 );.  a
18730 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
18740 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Err==0 );.  if( 
18750 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
18760 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
18770 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20  lite_", 7)==0 . 
18780 20 20 20 20 20 20 26 26 20 64 62 2d 3e 69 6e 69        && db->ini
18790 74 2e 62 75 73 79 3d 3d 30 0a 23 69 66 20 53 51  t.busy==0.#if SQ
187a0 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
187b0 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 20 20  TICATION.       
187c0 26 26 20 73 71 6c 69 74 65 33 55 73 65 72 41 75  && sqlite3UserAu
187d0 74 68 54 61 62 6c 65 28 70 54 61 62 2d 3e 7a 4e  thTable(pTab->zN
187e0 61 6d 65 29 3d 3d 30 0a 23 65 6e 64 69 66 0a 20  ame)==0.#endif. 
187f0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
18800 53 74 72 4e 49 43 6d 70 28 26 70 54 61 62 2d 3e  StrNICmp(&pTab->
18810 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74  zName[7],"altert
18820 61 62 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20  ab_",9)!=0 ){.  
18830 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
18840 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
18850 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69   %s may not be i
18860 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a  ndexed", pTab->z
18870 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
18880 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18890 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  x;.  }.#ifndef S
188a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
188b0 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
188c0 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
188d0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
188e0 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f  e, "views may no
188f0 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a  t be indexed");.
18900 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
18910 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
18920 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
18930 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
18940 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73  ALTABLE.  if( Is
18950 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
18960 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
18970 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
18980 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79  rtual tables may
18990 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
189a0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
189b0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
189c0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a   }.#endif..  /*.
189d0 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61    ** Find the na
189e0 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  me of the index.
189f0 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72    Make sure ther
18a00 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
18a10 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e   another.  ** in
18a20 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74  dex or table wit
18a30 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
18a40 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63    .  **.  ** Exc
18a50 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61  eption:  If we a
18a60 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e  re reading the n
18a70 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e  ames of permanen
18a80 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74  t indices from t
18a90 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d  he.  ** sqlite_m
18aa0 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63  aster table (bec
18ab0 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  ause some other 
18ac0 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20  process changed 
18ad0 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a  the schema) and.
18ae0 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20    ** one of the 
18af0 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c  index names coll
18b00 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61  ides with the na
18b10 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72  me of a temporar
18b20 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20  y table or.  ** 
18b30 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77  index, then we w
18b40 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
18b50 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64  process this ind
18b60 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ex..  **.  ** If
18b70 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61   pName==0 it mea
18b80 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20  ns that we are. 
18b90 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68   ** dealing with
18ba0 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
18bb0 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
18bc0 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f  int.  We have to
18bd0 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a   invent our.  **
18be0 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   own name..  */.
18bf0 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
18c00 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
18c10 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
18c20 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  db, pName);.    
18c30 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67  if( zName==0 ) g
18c40 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18c50 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72  index;.    asser
18c60 74 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29  t( pName->z!=0 )
18c70 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
18c80 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63  _OK!=sqlite3Chec
18c90 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72  kObjectName(pPar
18ca0 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  se, zName) ){.  
18cb0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
18cc0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
18cd0 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  }.    if( !db->i
18ce0 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
18cf0 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
18d00 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
18d10 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)!=0 ){.     
18d20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
18d30 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
18d40 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74  e is already a t
18d50 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20  able named %s", 
18d60 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
18d70 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
18d80 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
18d90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
18da0 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
18db0 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a  b, zName, pDb->z
18dc0 44 62 53 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  DbSName)!=0 ){. 
18dd0 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45       if( !ifNotE
18de0 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  xist ){.        
18df0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18e00 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25  pParse, "index %
18e10 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  s already exists
18e20 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
18e30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18e40 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
18e50 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20  t.busy );.      
18e60 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
18e70 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
18e80 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a  , iDb);.      }.
18e90 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
18ea0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18eb0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
18ec0 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65   int n;.    Inde
18ed0 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f  x *pLoop;.    fo
18ee0 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49  r(pLoop=pTab->pI
18ef0 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70  ndex, n=1; pLoop
18f00 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
18f10 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  Next, n++){}.   
18f20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
18f30 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c  MPrintf(db, "sql
18f40 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73  ite_autoindex_%s
18f50 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  _%d", pTab->zNam
18f60 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a  e, n);.    if( z
18f70 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
18f80 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18f90 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 0a  e_index;.    }..
18fa0 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63      /* Automatic
18fb0 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 67 65 6e   index names gen
18fc0 65 72 61 74 65 64 20 66 72 6f 6d 20 77 69 74 68  erated from with
18fd0 69 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61  in sqlite3_decla
18fe0 72 65 5f 76 74 61 62 28 29 0a 20 20 20 20 2a 2a  re_vtab().    **
18ff0 20 6d 75 73 74 20 68 61 76 65 20 6e 61 6d 65 73   must have names
19000 20 74 68 61 74 20 61 72 65 20 64 69 73 74 69 6e   that are distin
19010 63 74 20 66 72 6f 6d 20 6e 6f 72 6d 61 6c 20 61  ct from normal a
19020 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6e  utomatic index n
19030 61 6d 65 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65  ames..    ** The
19040 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65   following state
19050 6d 65 6e 74 20 63 6f 6e 76 65 72 74 73 20 22 73  ment converts "s
19060 71 6c 69 74 65 33 5f 61 75 74 6f 69 6e 64 65 78  qlite3_autoindex
19070 2e 2e 2e 22 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ..." into.    **
19080 20 22 73 71 6c 69 74 65 33 5f 62 75 74 6f 69 6e   "sqlite3_butoin
19090 64 65 78 2e 2e 2e 22 20 69 6e 20 6f 72 64 65 72  dex..." in order
190a0 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d   to make the nam
190b0 65 73 20 64 69 73 74 69 6e 63 74 2e 0a 20 20 20  es distinct..   
190c0 20 2a 2a 20 54 68 65 20 22 76 74 61 62 5f 65 72   ** The "vtab_er
190d0 72 2e 74 65 73 74 22 20 74 65 73 74 20 64 65 6d  r.test" test dem
190e0 6f 6e 73 74 72 61 74 65 73 20 74 68 65 20 6e 65  onstrates the ne
190f0 65 64 20 6f 66 20 74 68 69 73 20 73 74 61 74 65  ed of this state
19100 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ment. */.    if(
19110 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42   IN_DECLARE_VTAB
19120 20 29 20 7a 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a 20   ) zName[7]++;. 
19130 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66   }..  /* Check f
19140 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  or authorization
19150 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e   to create an in
19160 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  dex..  */.#ifnde
19170 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
19180 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
19190 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
191a0 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 44 62 53 4e  zDb = pDb->zDbSN
191b0 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ame;.    if( sql
191c0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
191d0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53  arse, SQLITE_INS
191e0 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ERT, SCHEMA_TABL
191f0 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20  E(iDb), 0, zDb) 
19200 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
19210 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19220 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53  .    }.    i = S
19230 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44  QLITE_CREATE_IND
19240 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49  EX;.    if( !OMI
19250 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
19260 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f  =1 ) i = SQLITE_
19270 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
19280 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
19290 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
192a0 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54  se, i, zName, pT
192b0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  ab->zName, zDb) 
192c0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
192d0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
192e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
192f0 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74  f..  /* If pList
19300 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ==0, it means th
19310 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
19320 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20  alled to make a 
19330 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79  primary.  ** key
19340 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74   out of the last
19350 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f   column added to
19360 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72   the table under
19370 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20   construction.. 
19380 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20   ** So create a 
19390 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d  fake list to sim
193a0 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f  ulate this..  */
193b0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
193c0 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 70 72 65  ){.    Token pre
193d0 76 43 6f 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65  vCol;.    sqlite
193e0 33 54 6f 6b 65 6e 49 6e 69 74 28 26 70 72 65 76  3TokenInit(&prev
193f0 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  Col, pTab->aCol[
19400 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e  pTab->nCol-1].zN
19410 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  ame);.    pList 
19420 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
19430 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
19440 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
19450 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
19460 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 70 72  c(db, TK_ID, &pr
19470 65 76 43 6f 6c 2c 20 30 29 29 3b 0a 20 20 20 20  evCol, 0));.    
19480 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67  if( pList==0 ) g
19490 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
194a0 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72  index;.    asser
194b0 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  t( pList->nExpr=
194c0 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =1 );.    sqlite
194d0 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74  3ExprListSetSort
194e0 4f 72 64 65 72 28 70 4c 69 73 74 2c 20 73 6f 72  Order(pList, sor
194f0 74 4f 72 64 65 72 29 3b 0a 20 20 7d 65 6c 73 65  tOrder);.  }else
19500 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
19510 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68  rListCheckLength
19520 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
19530 22 69 6e 64 65 78 22 29 3b 0a 20 20 7d 0a 0a 20  "index");.  }.. 
19540 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
19550 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ow many bytes of
19560 20 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69   space are requi
19570 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70  red to store exp
19580 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65  licitly.  ** spe
19590 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  cified collation
195a0 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e   sequence names.
195b0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
195c0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
195d0 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
195e0 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  *pExpr = pList->
195f0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
19600 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30  assert( pExpr!=0
19610 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70   );.    if( pExp
19620 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
19630 45 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72  E ){.      nExtr
19640 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74 65  a += (1 + sqlite
19650 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d  3Strlen30(pExpr-
19660 3e 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20  >u.zToken));.   
19670 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20   }.  }..  /* .  
19680 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  ** Allocate the 
19690 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  index structure.
196a0 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d   .  */.  nName =
196b0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
196c0 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72  (zName);.  nExtr
196d0 61 43 6f 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b  aCol = pPk ? pPk
196e0 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20  ->nKeyCol : 1;. 
196f0 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
19700 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62  3AllocateIndexOb
19710 6a 65 63 74 28 64 62 2c 20 70 4c 69 73 74 2d 3e  ject(db, pList->
19720 6e 45 78 70 72 20 2b 20 6e 45 78 74 72 61 43 6f  nExpr + nExtraCo
19730 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
19740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19750 20 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b           nName +
19760 20 6e 45 78 74 72 61 20 2b 20 31 2c 20 26 7a 45   nExtra + 1, &zE
19770 78 74 72 61 29 3b 0a 20 20 69 66 28 20 64 62 2d  xtra);.  if( db-
19780 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
19790 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
197a0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
197b0 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
197c0 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
197d0 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67  pIndex->aiRowLog
197e0 45 73 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Est) );.  assert
197f0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
19800 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61  GNMENT(pIndex->a
19810 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49 6e 64  zColl) );.  pInd
19820 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78 74  ex->zName = zExt
19830 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20  ra;.  zExtra += 
19840 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 6d 65 6d  nName + 1;.  mem
19850 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  cpy(pIndex->zNam
19860 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b  e, zName, nName+
19870 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54  1);.  pIndex->pT
19880 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70  able = pTab;.  p
19890 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d  Index->onError =
198a0 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20   (u8)onError;.  
198b0 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e  pIndex->uniqNotN
198c0 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f  ull = onError!=O
198d0 45 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64 65 78  E_None;.  pIndex
198e0 2d 3e 69 64 78 54 79 70 65 20 3d 20 69 64 78 54  ->idxType = idxT
198f0 79 70 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70  ype;.  pIndex->p
19900 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
19910 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  [iDb].pSchema;. 
19920 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c   pIndex->nKeyCol
19930 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
19940 0a 20 20 69 66 28 20 70 50 49 57 68 65 72 65 20  .  if( pPIWhere 
19950 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
19960 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e  solveSelfReferen
19970 63 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ce(pParse, pTab,
19980 20 4e 43 5f 50 61 72 74 49 64 78 2c 20 70 50 49   NC_PartIdx, pPI
19990 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 70  Where, 0);.    p
199a0 49 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78 57  Index->pPartIdxW
199b0 68 65 72 65 20 3d 20 70 50 49 57 68 65 72 65 3b  here = pPIWhere;
199c0 0a 20 20 20 20 70 50 49 57 68 65 72 65 20 3d 20  .    pPIWhere = 
199d0 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
199e0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
199f0 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
19a00 20 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65   0) );..  /* Che
19a10 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
19a20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53  should honor DES
19a30 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e  C requests on in
19a40 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f  dex columns.  */
19a50 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68  .  if( pDb->pSch
19a60 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74  ema->file_format
19a70 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f  >=4 ){.    sortO
19a80 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20  rderMask = -1;  
19a90 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a   /* Honor DESC *
19aa0 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  /.  }else{.    s
19ab0 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30  ortOrderMask = 0
19ac0 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44  ;    /* Ignore D
19ad0 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  ESC */.  }..  /*
19ae0 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 6c 69 73   Analyze the lis
19af0 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
19b00 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 74   that form the t
19b10 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65  erms of the inde
19b20 78 20 61 6e 64 0a 20 20 2a 2a 20 72 65 70 6f 72  x and.  ** repor
19b30 74 20 61 6e 79 20 65 72 72 6f 72 73 2e 20 20 49  t any errors.  I
19b40 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
19b50 65 20 77 68 65 72 65 20 74 68 65 20 65 78 70 72  e where the expr
19b60 65 73 73 69 6f 6e 20 69 73 20 65 78 61 63 74 6c  ession is exactl
19b70 79 0a 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 63  y.  ** a table c
19b80 6f 6c 75 6d 6e 2c 20 73 74 6f 72 65 20 74 68 61  olumn, store tha
19b90 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 69 43 6f  t column in aiCo
19ba0 6c 75 6d 6e 5b 5d 2e 20 20 46 6f 72 20 67 65 6e  lumn[].  For gen
19bb0 65 72 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73  eral expressions
19bc0 2c 0a 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 20  ,.  ** populate 
19bd0 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72  pIndex->aColExpr
19be0 20 61 6e 64 20 73 74 6f 72 65 20 58 4e 5f 45 58   and store XN_EX
19bf0 50 52 20 28 2d 32 29 20 69 6e 20 61 69 43 6f 6c  PR (-2) in aiCol
19c00 75 6d 6e 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  umn[]..  **.  **
19c10 20 54 4f 44 4f 3a 20 49 73 73 75 65 20 61 20 77   TODO: Issue a w
19c20 61 72 6e 69 6e 67 20 69 66 20 74 77 6f 20 6f 72  arning if two or
19c30 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66   more columns of
19c40 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20 69   the index are i
19c50 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 20 54  dentical..  ** T
19c60 4f 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72  ODO: Issue a war
19c70 6e 69 6e 67 20 69 66 20 74 68 65 20 74 61 62 6c  ning if the tabl
19c80 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73  e primary key is
19c90 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
19ca0 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
19cb0 6b 65 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  key..  */.  for(
19cc0 69 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70  i=0, pListItem=p
19cd0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
19ce0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c  ->nExpr; i++, pL
19cf0 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  istItem++){.    
19d00 45 78 70 72 20 2a 70 43 45 78 70 72 3b 20 20 20  Expr *pCExpr;   
19d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19d20 2a 20 54 68 65 20 69 2d 74 68 20 69 6e 64 65 78  * The i-th index
19d30 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
19d40 20 20 20 69 6e 74 20 72 65 71 75 65 73 74 65 64     int requested
19d50 53 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 20 20  SortOrder;      
19d60 20 20 2f 2a 20 41 53 43 20 6f 72 20 44 45 53 43    /* ASC or DESC
19d70 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 65 78 70   on the i-th exp
19d80 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 63  ression */.    c
19d90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
19da0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
19db0 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
19dc0 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20  nce name */..   
19dd0 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f   sqlite3StringTo
19de0 49 64 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45  Id(pListItem->pE
19df0 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
19e00 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65  3ResolveSelfRefe
19e10 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54  rence(pParse, pT
19e20 61 62 2c 20 4e 43 5f 49 64 78 45 78 70 72 2c 20  ab, NC_IdxExpr, 
19e30 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
19e40 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 50  , 0);.    if( pP
19e50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
19e60 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
19e70 64 65 78 3b 0a 20 20 20 20 70 43 45 78 70 72 20  dex;.    pCExpr 
19e80 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
19e90 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 49 74  pCollate(pListIt
19ea0 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
19eb0 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70 21 3d  if( pCExpr->op!=
19ec0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
19ed0 20 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61     if( pTab==pPa
19ee0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29  rse->pNewTable )
19ef0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
19f00 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
19f10 2c 20 22 65 78 70 72 65 73 73 69 6f 6e 73 20 70  , "expressions p
19f20 72 6f 68 69 62 69 74 65 64 20 69 6e 20 50 52 49  rohibited in PRI
19f30 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 22 0a 20  MARY KEY and ". 
19f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
19f60 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
19f70 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ts");.        go
19f80 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
19f90 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
19fa0 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
19fb0 61 43 6f 6c 45 78 70 72 3d 3d 30 20 29 7b 0a 20  aColExpr==0 ){. 
19fc0 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
19fd0 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33  *pCopy = sqlite3
19fe0 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
19ff0 70 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 20  pList, 0);.     
1a000 20 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45     pIndex->aColE
1a010 78 70 72 20 3d 20 70 43 6f 70 79 3b 0a 20 20 20  xpr = pCopy;.   
1a020 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61       if( !db->ma
1a030 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1a040 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1a050 70 43 6f 70 79 21 3d 30 20 29 3b 0a 20 20 20 20  pCopy!=0 );.    
1a060 20 20 20 20 20 20 70 4c 69 73 74 49 74 65 6d 20        pListItem 
1a070 3d 20 26 70 43 6f 70 79 2d 3e 61 5b 69 5d 3b 0a  = &pCopy->a[i];.
1a080 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a090 7d 0a 20 20 20 20 20 20 6a 20 3d 20 58 4e 5f 45  }.      j = XN_E
1a0a0 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65  XPR;.      pInde
1a0b0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
1a0c0 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20   XN_EXPR;.      
1a0d0 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e  pIndex->uniqNotN
1a0e0 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ull = 0;.    }el
1a0f0 73 65 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 43  se{.      j = pC
1a100 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
1a110 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 3d       assert( j<=
1a120 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20 20 20  0x7fff );.      
1a130 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20  if( j<0 ){.     
1a140 20 20 20 6a 20 3d 20 70 54 61 62 2d 3e 69 50 4b     j = pTab->iPK
1a150 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ey;.      }else 
1a160 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  if( pTab->aCol[j
1a170 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a  ].notNull==0 ){.
1a180 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1a190 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b  uniqNotNull = 0;
1a1a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1a1b0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
1a1c0 69 5d 20 3d 20 28 69 31 36 29 6a 3b 0a 20 20 20  i] = (i16)j;.   
1a1d0 20 7d 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 30   }.    zColl = 0
1a1e0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 49  ;.    if( pListI
1a1f0 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d  tem->pExpr->op==
1a200 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20  TK_COLLATE ){.  
1a210 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20      int nColl;. 
1a220 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69       zColl = pLi
1a230 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 75  stItem->pExpr->u
1a240 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e  .zToken;.      n
1a250 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74  Coll = sqlite3St
1a260 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20  rlen30(zColl) + 
1a270 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
1a280 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29   nExtra>=nColl )
1a290 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
1a2a0 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43  Extra, zColl, nC
1a2b0 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  oll);.      zCol
1a2c0 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20  l = zExtra;.    
1a2d0 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c    zExtra += nCol
1a2e0 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  l;.      nExtra 
1a2f0 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65  -= nColl;.    }e
1a300 6c 73 65 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a  lse if( j>=0 ){.
1a310 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54        zColl = pT
1a320 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c  ab->aCol[j].zCol
1a330 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  l;.    }.    if(
1a340 20 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20   !zColl ) zColl 
1a350 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  = sqlite3StrBINA
1a360 52 59 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d  RY;.    if( !db-
1a370 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73  >init.busy && !s
1a380 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
1a390 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
1a3a0 6c 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  l) ){.      goto
1a3b0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1a3c0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
1a3d0 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20  ndex->azColl[i] 
1a3e0 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71  = zColl;.    req
1a3f0 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20  uestedSortOrder 
1a400 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72  = pListItem->sor
1a410 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64  tOrder & sortOrd
1a420 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64  erMask;.    pInd
1a430 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
1a440 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73 74 65  ] = (u8)requeste
1a450 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a  dSortOrder;.  }.
1a460 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65  .  /* Append the
1a470 20 74 61 62 6c 65 20 6b 65 79 20 74 6f 20 74 68   table key to th
1a480 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
1a490 65 78 2e 20 20 46 6f 72 20 57 49 54 48 4f 55 54  ex.  For WITHOUT
1a4a0 20 52 4f 57 49 44 0a 20 20 2a 2a 20 74 61 62 6c   ROWID.  ** tabl
1a4b0 65 73 20 28 77 68 65 6e 20 70 50 6b 21 3d 30 29  es (when pPk!=0)
1a4c0 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   this will be th
1a4d0 65 20 64 65 63 6c 61 72 65 64 20 50 52 49 4d 41  e declared PRIMA
1a4e0 52 59 20 4b 45 59 2e 20 20 46 6f 72 0a 20 20 2a  RY KEY.  For.  *
1a4f0 2a 20 6e 6f 72 6d 61 6c 20 74 61 62 6c 65 73 20  * normal tables 
1a500 28 77 68 65 6e 20 70 50 6b 3d 3d 30 29 20 74 68  (when pPk==0) th
1a510 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 72  is will be the r
1a520 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  owid..  */.  if(
1a530 20 70 50 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28   pPk ){.    for(
1a540 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79  j=0; j<pPk->nKey
1a550 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
1a560 20 69 6e 74 20 78 20 3d 20 70 50 6b 2d 3e 61 69   int x = pPk->ai
1a570 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
1a580 20 61 73 73 65 72 74 28 20 78 3e 3d 30 20 29 3b   assert( x>=0 );
1a590 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 43 6f  .      if( hasCo
1a5a0 6c 75 6d 6e 28 70 49 6e 64 65 78 2d 3e 61 69 43  lumn(pIndex->aiC
1a5b0 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e  olumn, pIndex->n
1a5c0 4b 65 79 43 6f 6c 2c 20 78 29 20 29 7b 0a 20 20  KeyCol, x) ){.  
1a5d0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 43        pIndex->nC
1a5e0 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20 20  olumn--; .      
1a5f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1a600 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
1a610 69 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20  i] = x;.        
1a620 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
1a630 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b  ] = pPk->azColl[
1a640 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64  j];.        pInd
1a650 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
1a660 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72  ] = pPk->aSortOr
1a670 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  der[j];.        
1a680 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i++;.      }.   
1a690 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69   }.    assert( i
1a6a0 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  ==pIndex->nColum
1a6b0 6e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n );.  }else{.  
1a6c0 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
1a6d0 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 52 4f 57 49 44  mn[i] = XN_ROWID
1a6e0 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a  ;.    pIndex->az
1a6f0 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65  Coll[i] = sqlite
1a700 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a  3StrBINARY;.  }.
1a710 20 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74    sqlite3Default
1a720 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a  RowEst(pIndex);.
1a730 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e    if( pParse->pN
1a740 65 77 54 61 62 6c 65 3d 3d 30 20 29 20 65 73 74  ewTable==0 ) est
1a750 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28  imateIndexWidth(
1a760 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 49  pIndex);..  /* I
1a770 66 20 74 68 69 73 20 69 6e 64 65 78 20 63 6f 6e  f this index con
1a780 74 61 69 6e 73 20 65 76 65 72 79 20 63 6f 6c 75  tains every colu
1a790 6d 6e 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2c  mn of its table,
1a7a0 20 74 68 65 6e 20 6d 61 72 6b 0a 20 20 2a 2a 20   then mark.  ** 
1a7b0 69 74 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67  it as a covering
1a7c0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65   index */.  asse
1a7d0 72 74 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  rt( HasRowid(pTa
1a7e0 62 29 20 0a 20 20 20 20 20 20 7c 7c 20 70 54 61  b) .      || pTa
1a7f0 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 73 71  b->iPKey<0 || sq
1a800 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
1a810 65 78 28 70 49 6e 64 65 78 2c 20 70 54 61 62 2d  ex(pIndex, pTab-
1a820 3e 69 50 4b 65 79 29 3e 3d 30 20 29 3b 0a 20 20  >iPKey)>=0 );.  
1a830 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
1a840 26 26 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  && pIndex->nColu
1a850 6d 6e 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  mn>=pTab->nCol )
1a860 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 69 73  {.    pIndex->is
1a870 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20  Covering = 1;.  
1a880 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
1a890 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
1a8a0 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62       if( j==pTab
1a8b0 2d 3e 69 50 4b 65 79 20 29 20 63 6f 6e 74 69 6e  ->iPKey ) contin
1a8c0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ue;.      if( sq
1a8d0 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
1a8e0 65 78 28 70 49 6e 64 65 78 2c 6a 29 3e 3d 30 20  ex(pIndex,j)>=0 
1a8f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1a900 20 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65    pIndex->isCove
1a910 72 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  ring = 0;.      
1a920 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1a930 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50  ..  if( pTab==pP
1a940 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
1a950 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72  ){.    /* This r
1a960 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20  outine has been 
1a970 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
1a980 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
1a990 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20  dex as a.    ** 
1a9a0 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d  result of a PRIM
1a9b0 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
1a9c0 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f  E clause on a co
1a9d0 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c  lumn definition,
1a9e0 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49   or.    ** a PRI
1a9f0 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
1aa00 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77  UE clause follow
1aa10 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64  ing the column d
1aa20 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20  efinitions..    
1aa30 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a  ** i.e. one of:.
1aa40 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52      **.    ** CR
1aa50 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 20 50  EATE TABLE t(x P
1aa60 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a  RIMARY KEY, y);.
1aa70 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41      ** CREATE TA
1aa80 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51  BLE t(x, y, UNIQ
1aa90 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a  UE(x, y));.    *
1aaa0 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20  *.    ** Either 
1aab0 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  way, check to se
1aac0 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 61  e if the table a
1aad0 6c 72 65 61 64 79 20 68 61 73 20 73 75 63 68 20  lready has such 
1aae0 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20  an index. If.   
1aaf0 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f   ** so, don't bo
1ab00 74 68 65 72 20 63 72 65 61 74 69 6e 67 20 74 68  ther creating th
1ab10 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c  is one. This onl
1ab20 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20  y applies to.   
1ab30 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
1ab40 79 20 63 72 65 61 74 65 64 20 69 6e 64 69 63 65  y created indice
1ab50 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20  s. Users can do 
1ab60 61 73 20 74 68 65 79 20 77 69 73 68 20 77 69 74  as they wish wit
1ab70 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69  h.    ** explici
1ab80 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a  t indices..    *
1ab90 2a 0a 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49  *.    ** Two UNI
1aba0 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b  QUE or PRIMARY K
1abb0 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  EY constraints a
1abc0 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71  re considered eq
1abd0 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20  uivalent.    ** 
1abe0 28 61 6e 64 20 74 68 75 73 20 73 75 70 70 72 65  (and thus suppre
1abf0 73 73 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64  ssing the second
1ac00 20 6f 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68   one) even if th
1ac10 65 79 20 68 61 76 65 20 64 69 66 66 65 72 65 6e  ey have differen
1ac20 74 0a 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72  t.    ** sort or
1ac30 64 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ders..    **.   
1ac40 20 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   ** If there are
1ac50 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61   different colla
1ac60 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f  ting sequences o
1ac70 72 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  r if the columns
1ac80 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   of.    ** the c
1ac90 6f 6e 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20  onstraint occur 
1aca0 69 6e 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64  in different ord
1acb0 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ers, then the co
1acc0 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20  nstraints are.  
1acd0 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20    ** considered 
1ace0 64 69 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74  distinct and bot
1acf0 68 20 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61  h result in sepa
1ad00 72 61 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20  rate indices..  
1ad10 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a    */.    Index *
1ad20 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
1ad30 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
1ad40 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
1ad50 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1ad60 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73  int k;.      ass
1ad70 65 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64  ert( IsUniqueInd
1ad80 65 78 28 70 49 64 78 29 20 29 3b 0a 20 20 20 20  ex(pIdx) );.    
1ad90 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
1ada0 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  idxType!=SQLITE_
1adb0 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20 29  IDXTYPE_APPDEF )
1adc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1add0 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
1ade0 6e 64 65 78 29 20 29 3b 0a 0a 20 20 20 20 20 20  ndex) );..      
1adf0 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  if( pIdx->nKeyCo
1ae00 6c 21 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  l!=pIndex->nKeyC
1ae10 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ol ) continue;. 
1ae20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
1ae30 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b  pIdx->nKeyCol; k
1ae40 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ++){.        con
1ae50 73 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20  st char *z1;.   
1ae60 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1ae70 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 61 73 73  *z2;.        ass
1ae80 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ert( pIdx->aiCol
1ae90 75 6d 6e 5b 6b 5d 3e 3d 30 20 29 3b 0a 20 20 20  umn[k]>=0 );.   
1aea0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
1aeb0 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64  iColumn[k]!=pInd
1aec0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20  ex->aiColumn[k] 
1aed0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
1aee0 20 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f   z1 = pIdx->azCo
1aef0 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a  ll[k];.        z
1af00 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  2 = pIndex->azCo
1af10 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[k];.        i
1af20 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1af30 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65 61  p(z1, z2) ) brea
1af40 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1af50 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b   if( k==pIdx->nK
1af60 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  eyCol ){.       
1af70 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
1af80 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  or!=pIndex->onEr
1af90 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ror ){.         
1afa0 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61   /* This constra
1afb0 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65 20  int creates the 
1afc0 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20  same index as a 
1afd0 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20  previous.       
1afe0 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
1aff0 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77   specified somew
1b000 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45 41  here in the CREA
1b010 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
1b020 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nt..          **
1b030 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20   However the ON 
1b040 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
1b050 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20   are different. 
1b060 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20  If both this .  
1b070 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
1b080 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72  raint and the pr
1b090 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e  evious equivalen
1b0a0 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76  t constraint hav
1b0b0 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20  e explicit.     
1b0c0 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c       ** ON CONFL
1b0d0 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69 73  ICT clauses this
1b0e0 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74   is an error. Ot
1b0f0 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 65  herwise, use the
1b100 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
1b110 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69  plicitly specifi
1b120 65 64 20 62 65 68 61 76 69 6f 72 20 66 6f 72 20  ed behavior for 
1b130 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  the index..     
1b140 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1b150 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e    if( !(pIdx->on
1b160 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
1b170 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  t || pIndex->onE
1b180 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
1b190 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1b1a0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1b1b0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
1b1c0 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c            "confl
1b1d0 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49  icting ON CONFLI
1b1e0 43 54 20 63 6c 61 75 73 65 73 20 73 70 65 63 69  CT clauses speci
1b1f0 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20  fied", 0);.     
1b200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b210 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
1b220 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29  or==OE_Default )
1b230 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
1b240 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49  dx->onError = pI
1b250 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20  ndex->onError;. 
1b260 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1b270 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1b280 20 69 64 78 54 79 70 65 3d 3d 53 51 4c 49 54 45   idxType==SQLITE
1b290 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59  _IDXTYPE_PRIMARY
1b2a0 4b 45 59 20 29 20 70 49 64 78 2d 3e 69 64 78 54  KEY ) pIdx->idxT
1b2b0 79 70 65 20 3d 20 69 64 78 54 79 70 65 3b 0a 20  ype = idxType;. 
1b2c0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
1b2d0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1b2e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1b2f0 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
1b300 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74  new Index struct
1b310 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65  ure to its table
1b320 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65   and to the othe
1b330 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  r.  ** in-memory
1b340 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
1b350 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 61 73  ures. .  */.  as
1b360 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
1b370 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 64  rr==0 );.  if( d
1b380 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
1b390 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
1b3a0 20 20 61 73 73 65 72 74 28 20 21 49 4e 5f 44 45    assert( !IN_DE
1b3b0 43 4c 41 52 45 5f 56 54 41 42 20 29 3b 0a 20 20  CLARE_VTAB );.  
1b3c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1b3d0 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
1b3e0 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  (db, 0, pIndex->
1b3f0 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20  pSchema) );.    
1b400 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
1b410 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70  nsert(&pIndex->p
1b420 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
1b430 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1b440 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64              pInd
1b450 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65  ex->zName, pInde
1b460 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  x);.    if( p ){
1b470 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b480 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20  ==pIndex );  /* 
1b490 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
1b4a0 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
1b4b0 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
1b4c0 28 64 62 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  (db);.      goto
1b4d0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1b4e0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  ex;.    }.    db
1b4f0 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
1b500 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
1b510 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  .    if( pTblNam
1b520 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49  e!=0 ){.      pI
1b530 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d  ndex->tnum = db-
1b540 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
1b550 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
1b560 66 20 74 68 69 73 20 69 73 20 74 68 65 20 69 6e  f this is the in
1b570 69 74 69 61 6c 20 43 52 45 41 54 45 20 49 4e 44  itial CREATE IND
1b580 45 58 20 73 74 61 74 65 6d 65 6e 74 20 28 6f 72  EX statement (or
1b590 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 69 66   CREATE TABLE if
1b5a0 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
1b5b0 69 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e  is an implied in
1b5c0 64 65 78 20 66 6f 72 20 61 20 55 4e 49 51 55 45  dex for a UNIQUE
1b5d0 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20   or PRIMARY KEY 
1b5e0 63 6f 6e 73 74 72 61 69 6e 74 29 20 74 68 65 6e  constraint) then
1b5f0 0a 20 20 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20  .  ** emit code 
1b600 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  to allocate the 
1b610 69 6e 64 65 78 20 72 6f 6f 74 70 61 67 65 20 6f  index rootpage o
1b620 6e 20 64 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20  n disk and make 
1b630 61 6e 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a  an entry for.  *
1b640 2a 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 74  * the index in t
1b650 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
1b660 20 74 61 62 6c 65 20 61 6e 64 20 70 6f 70 75 6c   table and popul
1b670 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 77 69  ate the index wi
1b680 74 68 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e  th.  ** content.
1b690 20 20 42 75 74 2c 20 64 6f 20 6e 6f 74 20 64 6f    But, do not do
1b6a0 20 74 68 69 73 20 69 66 20 77 65 20 61 72 65 20   this if we are 
1b6b0 73 69 6d 70 6c 79 20 72 65 61 64 69 6e 67 20 74  simply reading t
1b6c0 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
1b6d0 0a 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 70  .  ** table to p
1b6e0 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2c  arse the schema,
1b6f0 20 6f 72 20 69 66 20 74 68 69 73 20 69 6e 64 65   or if this inde
1b700 78 20 69 73 20 74 68 65 20 50 52 49 4d 41 52 59  x is the PRIMARY
1b710 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2a 20   KEY index.  ** 
1b720 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  of a WITHOUT ROW
1b730 49 44 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  ID table..  **. 
1b740 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d   ** If pTblName=
1b750 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
1b760 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61   index is genera
1b770 74 65 64 20 61 73 20 61 6e 20 69 6d 70 6c 69 65  ted as an implie
1b780 64 20 50 52 49 4d 41 52 59 20 4b 45 59 0a 20 20  d PRIMARY KEY.  
1b790 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64  ** or UNIQUE ind
1b7a0 65 78 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ex in a CREATE T
1b7b0 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
1b7c0 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65   Since the table
1b7d0 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62  .  ** has just b
1b7e0 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20  een created, it 
1b7f0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
1b800 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
1b810 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
1b820 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73  ** step can be s
1b830 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  kipped..  */.  e
1b840 6c 73 65 20 69 66 28 20 48 61 73 52 6f 77 69 64  lse if( HasRowid
1b850 28 70 54 61 62 29 20 7c 7c 20 70 54 62 6c 4e 61  (pTab) || pTblNa
1b860 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 56 64 62  me!=0 ){.    Vdb
1b870 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
1b880 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69  zStmt;.    int i
1b890 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
1b8a0 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73  nMem;..    v = s
1b8b0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1b8c0 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
1b8d0 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
1b8e0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20  create_index;.. 
1b8f0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
1b900 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1b910 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a  arse, 1, iDb);..
1b920 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
1b930 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74  e rootpage for t
1b940 68 65 20 69 6e 64 65 78 20 75 73 69 6e 67 20 43  he index using C
1b950 72 65 61 74 65 49 6e 64 65 78 2e 20 42 75 74 20  reateIndex. But 
1b960 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 64 6f  before.    ** do
1b970 69 6e 67 20 73 6f 2c 20 63 6f 64 65 20 61 20 4e  ing so, code a N
1b980 6f 6f 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  oop instruction 
1b990 61 6e 64 20 73 74 6f 72 65 20 69 74 73 20 61 64  and store its ad
1b9a0 64 72 65 73 73 20 69 6e 20 0a 20 20 20 20 2a 2a  dress in .    **
1b9b0 20 49 6e 64 65 78 2e 74 6e 75 6d 2e 20 54 68 69   Index.tnum. Thi
1b9c0 73 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  s is required in
1b9d0 20 63 61 73 65 20 74 68 69 73 20 69 6e 64 65 78   case this index
1b9e0 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 0a   is actually a .
1b9f0 20 20 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b      ** PRIMARY K
1ba00 45 59 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  EY and the table
1ba10 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 57   is actually a W
1ba20 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
1ba30 6c 65 2e 20 49 6e 20 0a 20 20 20 20 2a 2a 20 74  le. In .    ** t
1ba40 68 61 74 20 63 61 73 65 20 74 68 65 20 63 6f 6e  hat case the con
1ba50 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77  vertToWithoutRow
1ba60 69 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e  idTable() routin
1ba70 65 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 0a 20  e will replace. 
1ba80 20 20 20 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77     ** the Noop w
1ba90 69 74 68 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75  ith a Goto to ju
1baa0 6d 70 20 6f 76 65 72 20 74 68 65 20 56 44 42 45  mp over the VDBE
1bab0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
1bac0 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 70 49  below. */.    pI
1bad0 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c  ndex->tnum = sql
1bae0 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
1baf0 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20  , OP_Noop);.    
1bb00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bb10 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e  2(v, OP_CreateIn
1bb20 64 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b  dex, iDb, iMem);
1bb30 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20  ..    /* Gather 
1bb40 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
1bb50 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
1bb60 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
1bb70 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  into.    ** the 
1bb80 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20  zStmt variable. 
1bb90 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
1bba0 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  tart ){.      in
1bbb0 74 20 6e 20 3d 20 28 69 6e 74 29 28 70 50 61 72  t n = (int)(pPar
1bbc0 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a  se->sLastToken.z
1bbd0 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70   - pName->z) + p
1bbe0 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
1bbf0 6e 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n.n;.      if( p
1bc00 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b  Name->z[n-1]==';
1bc10 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 2f  ' ) n--;.      /
1bc20 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  * A named index 
1bc30 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74  with an explicit
1bc40 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
1bc50 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20  atement */.     
1bc60 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
1bc70 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45  MPrintf(db, "CRE
1bc80 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73  ATE%s INDEX %.*s
1bc90 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72  ",.        onErr
1bca0 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22  or==OE_None ? ""
1bcb0 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 20 6e 2c   : " UNIQUE", n,
1bcc0 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20   pName->z);.    
1bcd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
1bce0 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  An automatic ind
1bcf0 65 78 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ex created by a 
1bd00 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
1bd10 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
1bd20 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74   */.      /* zSt
1bd30 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
1bd40 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20  ntf(""); */.    
1bd50 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    zStmt = 0;.   
1bd60 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61   }..    /* Add a
1bd70 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74  n entry in sqlit
1bd80 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69  e_master for thi
1bd90 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20  s index.    */. 
1bda0 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
1bdb0 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
1bdc0 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
1bdd0 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53  NTO %Q.%s VALUES
1bde0 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23  ('index',%Q,%Q,#
1bdf0 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20  %d,%Q);",.      
1be00 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
1be10 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f  DbSName, MASTER_
1be20 4e 41 4d 45 2c 0a 20 20 20 20 20 20 20 20 70 49  NAME,.        pI
1be30 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  ndex->zName,.   
1be40 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
1be50 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a  ,.        iMem,.
1be60 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20          zStmt.  
1be70 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
1be80 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74  DbFree(db, zStmt
1be90 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20  );..    /* Fill 
1bea0 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64  the index with d
1beb0 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20  ata and reparse 
1bec0 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65  the schema. Code
1bed0 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20   an OP_Expire.  
1bee0 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61    ** to invalida
1bef0 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69  te all pre-compi
1bf00 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
1bf10 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1bf20 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  TblName ){.     
1bf30 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
1bf40 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
1bf50 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20  ex, iMem);.     
1bf60 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
1bf70 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
1bf80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1bf90 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
1bfa0 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20  maOp(v, iDb,.   
1bfb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
1bfc0 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27  intf(db, "name='
1bfd0 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e  %q' AND type='in
1bfe0 64 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a  dex'", pIndex->z
1bff0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71  Name));.      sq
1c000 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
1c010 76 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20  v, OP_Expire);. 
1c020 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
1c030 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1c040 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 29 3b 0a   pIndex->tnum);.
1c050 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61    }..  /* When a
1c060 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74  dding an index t
1c070 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
1c080 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c  dices for a tabl
1c090 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  e, make.  ** sur
1c0a0 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61  e all indices la
1c0b0 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65  beled OE_Replace
1c0c0 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20   come after all 
1c0d0 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20  those labeled.  
1c0e0 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54  ** OE_Ignore.  T
1c0f0 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
1c100 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74   for the correct
1c110 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63   constraint chec
1c120 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e  k.  ** processin
1c130 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e  g (in sqlite3Gen
1c140 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  erateConstraintC
1c150 68 65 63 6b 73 28 29 29 20 61 73 20 70 61 72 74  hecks()) as part
1c160 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20   of.  ** UPDATE 
1c170 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74 65  and INSERT state
1c180 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20  ments.  .  */.  
1c190 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
1c1a0 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  y || pTblName==0
1c1b0 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72   ){.    if( onEr
1c1c0 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
1c1d0 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d  || pTab->pIndex=
1c1e0 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
1c1f0 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45  Tab->pIndex->onE
1c200 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
1c210 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
1c220 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70  >pNext = pTab->p
1c230 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61  Index;.      pTa
1c240 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  b->pIndex = pInd
1c250 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ex;.    }else{. 
1c260 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68       Index *pOth
1c270 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  er = pTab->pInde
1c280 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  x;.      while( 
1c290 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26  pOther->pNext &&
1c2a0 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e   pOther->pNext->
1c2b0 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
1c2c0 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ace ){.        p
1c2d0 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e  Other = pOther->
1c2e0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
1c2f0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
1c300 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  xt = pOther->pNe
1c310 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72  xt;.      pOther
1c320 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
1c330 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
1c340 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ex = 0;.  }..  /
1c350 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72  * Clean up befor
1c360 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69  e exiting */.exi
1c370 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a  t_create_index:.
1c380 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 20 66    if( pIndex ) f
1c390 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  reeIndex(db, pIn
1c3a0 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  dex);.  sqlite3E
1c3b0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 50  xprDelete(db, pP
1c3c0 49 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74  IWhere);.  sqlit
1c3d0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
1c3e0 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73  (db, pList);.  s
1c3f0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
1c400 65 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65  ete(db, pTblName
1c410 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1c420 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 7d  ee(db, zName);.}
1c430 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65  ../*.** Fill the
1c440 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b   Index.aiRowEst[
1c450 5d 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66  ] array with def
1c460 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ault information
1c470 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a   - information.*
1c480 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65  * to be used whe
1c490 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75  n we have not ru
1c4a0 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f  n the ANALYZE co
1c4b0 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52  mmand..**.** aiR
1c4c0 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70  owEst[0] is supp
1c4d0 6f 73 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  osed to contain 
1c4e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
1c4f0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  ements in the in
1c500 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65  dex..** Since we
1c510 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75   do not know, gu
1c520 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20  ess 1 million.  
1c530 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61  aiRowEst[1] is a
1c540 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
1c550 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
1c560 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
1c570 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
1c580 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65  particular value
1c590 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   of the.** first
1c5a0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
1c5b0 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b  ndex.  aiRowEst[
1c5c0 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  2] is an estimat
1c5d0 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a  e of the number.
1c5e0 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  ** of rows that 
1c5f0 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
1c600 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ular combination
1c610 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20   of the first 2 
1c620 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68  columns.** of th
1c630 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f  e index.  And so
1c640 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74   forth.  It must
1c650 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63   always be the c
1c660 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20  ase that.*.**   
1c670 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74          aiRowEst
1c680 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d  [N]<=aiRowEst[N-
1c690 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  1].**           
1c6a0 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a  aiRowEst[N]>=1.*
1c6b0 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20  *.** Apart from 
1c6c0 74 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69  that, we have li
1c6d0 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65  ttle to go on be
1c6e0 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20  sides intuition 
1c6f0 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52  as to.** how aiR
1c700 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62  owEst[] should b
1c710 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  e initialized.  
1c720 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65  The numbers gene
1c730 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72  rated here.** ar
1c740 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63  e based on typic
1c750 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20  al values found 
1c760 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65  in actual indice
1c770 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1c780 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28  e3DefaultRowEst(
1c790 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
1c7a0 2f 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /*              
1c7b0 20 20 31 30 2c 20 20 39 2c 20 20 38 2c 20 20 37    10,  9,  8,  7
1c7c0 2c 20 20 36 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  ,  6 */.  LogEst
1c7d0 20 61 56 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20   aVal[] = { 33, 
1c7e0 33 32 2c 20 33 30 2c 20 32 38 2c 20 32 36 20 7d  32, 30, 28, 26 }
1c7f0 3b 0a 20 20 4c 6f 67 45 73 74 20 2a 61 20 3d 20  ;.  LogEst *a = 
1c800 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  pIdx->aiRowLogEs
1c810 74 3b 0a 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d  t;.  int nCopy =
1c820 20 4d 49 4e 28 41 72 72 61 79 53 69 7a 65 28 61   MIN(ArraySize(a
1c830 56 61 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  Val), pIdx->nKey
1c840 43 6f 6c 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Col);.  int i;..
1c850 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72    /* Set the fir
1c860 73 74 20 65 6e 74 72 79 20 28 6e 75 6d 62 65 72  st entry (number
1c870 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1c880 69 6e 64 65 78 29 20 74 6f 20 74 68 65 20 65 73  index) to the es
1c890 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e 75  timated .  ** nu
1c8a0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
1c8b0 74 68 65 20 74 61 62 6c 65 2c 20 6f 72 20 68 61  the table, or ha
1c8c0 6c 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  lf the number of
1c8d0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
1c8e0 6c 65 0a 20 20 2a 2a 20 66 6f 72 20 61 20 70 61  le.  ** for a pa
1c8f0 72 74 69 61 6c 20 69 6e 64 65 78 2e 20 20 20 42  rtial index.   B
1c900 75 74 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68  ut do not let th
1c910 65 20 65 73 74 69 6d 61 74 65 20 64 72 6f 70 20  e estimate drop 
1c920 62 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a 20 20 61  below 10. */.  a
1c930 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  [0] = pIdx->pTab
1c940 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a  le->nRowLogEst;.
1c950 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72    if( pIdx->pPar
1c960 74 49 64 78 57 68 65 72 65 21 3d 30 20 29 20 61  tIdxWhere!=0 ) a
1c970 5b 30 5d 20 2d 3d 20 31 30 3b 20 20 61 73 73 65  [0] -= 10;  asse
1c980 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 10==sqlite3L
1c990 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 69 66  ogEst(2) );.  if
1c9a0 28 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d  ( a[0]<33 ) a[0]
1c9b0 20 3d 20 33 33 3b 20 20 20 20 20 20 20 20 20 20   = 33;          
1c9c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1c9d0 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  33==sqlite3LogEs
1c9e0 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45  t(10) );..  /* E
1c9f0 73 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b 31  stimate that a[1
1ca00 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69 73  ] is 10, a[2] is
1ca10 20 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20 61   9, a[3] is 8, a
1ca20 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20 69  [4] is 7, a[5] i
1ca30 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61 63  s.  ** 6 and eac
1ca40 68 20 73 75 62 73 65 71 75 65 6e 74 20 76 61 6c  h subsequent val
1ca50 75 65 20 28 69 66 20 61 6e 79 29 20 69 73 20 35  ue (if any) is 5
1ca60 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26  .  */.  memcpy(&
1ca70 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70  a[1], aVal, nCop
1ca80 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29  y*sizeof(LogEst)
1ca90 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79  );.  for(i=nCopy
1caa0 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65  +1; i<=pIdx->nKe
1cab0 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
1cac0 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20 20  a[i] = 23;      
1cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1cae0 73 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74 65  sert( 23==sqlite
1caf0 33 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20 20  3LogEst(5) );.  
1cb00 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  }..  assert( 0==
1cb10 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29  sqlite3LogEst(1)
1cb20 20 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71   );.  if( IsUniq
1cb30 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 20  ueIndex(pIdx) ) 
1cb40 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d  a[pIdx->nKeyCol]
1cb50 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
1cb60 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1cb70 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e   drop an existin
1cb80 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20  g named index.  
1cb90 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
1cba0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44  implements the D
1cbb0 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ROP INDEX statem
1cbc0 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
1cbd0 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61  ite3DropIndex(Pa
1cbe0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
1cbf0 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
1cc00 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e   ifExists){.  In
1cc10 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56  dex *pIndex;.  V
1cc20 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
1cc30 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1cc40 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
1cc50 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1cc60 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f  ->nErr==0 );   /
1cc70 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77  * Never called w
1cc80 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73  ith prior errors
1cc90 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
1cca0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1ccb0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1ccc0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73  _index;.  }.  as
1ccd0 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
1cce0 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51  c==1 );.  if( SQ
1ccf0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
1cd00 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
1cd10 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  e) ){.    goto e
1cd20 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1cd30 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
1cd40 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
1cd50 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  db, pName->a[0].
1cd60 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
1cd70 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
1cd80 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
1cd90 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69  {.    if( !ifExi
1cda0 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  sts ){.      sql
1cdb0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1cdc0 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  rse, "no such in
1cdd0 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c  dex: %S", pName,
1cde0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1cdf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
1ce00 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
1ce10 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  ma(pParse, pName
1ce20 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
1ce30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
1ce40 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
1ce50 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65   = 1;.    goto e
1ce60 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1ce70 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78    }.  if( pIndex
1ce80 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54  ->idxType!=SQLIT
1ce90 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46  E_IDXTYPE_APPDEF
1cea0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1ceb0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1cec0 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65  "index associate
1ced0 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a  d with UNIQUE ".
1cee0 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52        "or PRIMAR
1cef0 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
1cf00 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70   cannot be dropp
1cf10 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74  ed", 0);.    got
1cf20 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1cf30 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  x;.  }.  iDb = s
1cf40 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
1cf50 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e  dex(db, pIndex->
1cf60 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65  pSchema);.#ifnde
1cf70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1cf80 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
1cf90 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53      int code = S
1cfa0 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58  QLITE_DROP_INDEX
1cfb0 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
1cfc0 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  b = pIndex->pTab
1cfd0 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le;.    const ch
1cfe0 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
1cff0 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  b[iDb].zDbSName;
1d000 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1d010 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
1d020 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69  ABLE(iDb);.    i
1d030 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1d040 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1d050 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
1d060 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
1d070 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1d080 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
1d090 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
1d0a0 44 42 20 26 26 20 69 44 62 20 29 20 63 6f 64 65  DB && iDb ) code
1d0b0 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
1d0c0 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
1d0d0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1d0e0 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
1d0f0 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
1d100 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
1d110 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
1d120 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1d130 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1d140 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
1d150 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
1d160 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66   the index and f
1d170 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
1d180 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71  able */.  v = sq
1d190 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1d1a0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
1d1b0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
1d1c0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
1d1d0 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
1d1e0 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
1d1f0 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
1d200 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
1d210 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
1d220 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79 70 65  name=%Q AND type
1d230 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20 20 20 20  ='index'",.     
1d240 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
1d250 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f  DbSName, MASTER_
1d260 4e 41 4d 45 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  NAME, pIndex->zN
1d270 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  ame.    );.    s
1d280 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54  qlite3ClearStatT
1d290 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44  ables(pParse, iD
1d2a0 62 2c 20 22 69 64 78 22 2c 20 70 49 6e 64 65 78  b, "idx", pIndex
1d2b0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
1d2c0 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
1d2d0 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
1d2e0 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
1d2f0 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64  age(pParse, pInd
1d300 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ex->tnum, iDb);.
1d310 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d320 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70  ddOp4(v, OP_Drop
1d330 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30  Index, iDb, 0, 0
1d340 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
1d350 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64   0);.  }..exit_d
1d360 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c  rop_index:.  sql
1d370 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
1d380 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a  e(db, pName);.}.
1d390 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73  ./*.** pArray is
1d3a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
1d3b0 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   array of object
1d3c0 73 2e 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69  s. Each object i
1d3d0 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69  n the.** array i
1d3e0 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20  s szEntry bytes 
1d3f0 69 6e 20 73 69 7a 65 2e 20 54 68 69 73 20 72 6f  in size. This ro
1d400 75 74 69 6e 65 20 75 73 65 73 20 73 71 6c 69 74  utine uses sqlit
1d410 65 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a  e3DbRealloc().**
1d420 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 61   to extend the a
1d430 72 72 61 79 20 73 6f 20 74 68 61 74 20 74 68 65  rray so that the
1d440 72 65 20 69 73 20 73 70 61 63 65 20 66 6f 72 20  re is space for 
1d450 61 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 74 20  a new object at 
1d460 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57  the end..**.** W
1d470 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1d480 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e  n is called, *pn
1d490 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 74  Entry contains t
1d4a0 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
1d4b0 6f 66 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20  of.** the array 
1d4c0 28 69 6e 20 65 6e 74 72 69 65 73 20 2d 20 73 6f  (in entries - so
1d4d0 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
1d4e0 69 73 20 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a  is ((*pnEntry) *
1d4f0 20 73 7a 45 6e 74 72 79 29 20 62 79 74 65 73 0a   szEntry) bytes.
1d500 2a 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a  ** in total)..**
1d510 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 61 6c 6c  .** If the reall
1d520 6f 63 28 29 20 69 73 20 73 75 63 63 65 73 73 66  oc() is successf
1d530 75 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f  ul (i.e. if no O
1d540 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63  OM condition occ
1d550 75 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61  urs), the.** spa
1d560 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
1d570 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
1d580 69 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e  is zeroed, *pnEn
1d590 74 72 79 20 75 70 64 61 74 65 64 20 74 6f 0a 2a  try updated to.*
1d5a0 2a 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65  * reflect the ne
1d5b0 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72  w size of the ar
1d5c0 72 61 79 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  ray and a pointe
1d5d0 72 20 74 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c  r to the new all
1d5e0 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72  ocation.** retur
1d5f0 6e 65 64 2e 20 2a 70 49 64 78 20 69 73 20 73 65  ned. *pIdx is se
1d600 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
1d610 66 20 74 68 65 20 6e 65 77 20 61 72 72 61 79 20  f the new array 
1d620 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20 63 61  entry in this ca
1d630 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  se..**.** Otherw
1d640 69 73 65 2c 20 69 66 20 74 68 65 20 72 65 61 6c  ise, if the real
1d650 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a 70 49  loc() fails, *pI
1d660 64 78 20 69 73 20 73 65 74 20 74 6f 20 2d 31 2c  dx is set to -1,
1d670 20 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e   *pnEntry remain
1d680 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61  s.** unchanged a
1d690 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 70 41 72  nd a copy of pAr
1d6a0 72 61 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  ray returned..*/
1d6b0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72  .void *sqlite3Ar
1d6c0 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73  rayAllocate(.  s
1d6d0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1d6e0 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74   /* Connection t
1d6f0 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c  o notify of mall
1d700 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20  oc failures */. 
1d710 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20   void *pArray,  
1d720 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f     /* Array of o
1d730 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62  bjects.  Might b
1d740 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  e reallocated */
1d750 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20  .  int szEntry, 
1d760 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1d770 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74  each object in t
1d780 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  he array */.  in
1d790 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20  t *pnEntry,     
1d7a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a  /* Number of obj
1d7b0 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ects currently i
1d7c0 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  n use */.  int *
1d7d0 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20  pIdx         /* 
1d7e0 57 72 69 74 65 20 74 68 65 20 69 6e 64 65 78 20  Write the index 
1d7f0 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65  of a new slot he
1d800 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  re */.){.  char 
1d810 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 2a 70  *z;.  int n = *p
1d820 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28 20 28 6e  nEntry;.  if( (n
1d830 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a   & (n-1))==0 ){.
1d840 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 28 6e 3d      int sz = (n=
1d850 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20  =0) ? 1 : 2*n;. 
1d860 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20     void *pNew = 
1d870 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1d880 28 64 62 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a  (db, pArray, sz*
1d890 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66  szEntry);.    if
1d8a0 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
1d8b0 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20     *pIdx = -1;. 
1d8c0 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 72 72       return pArr
1d8d0 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41  ay;.    }.    pA
1d8e0 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  rray = pNew;.  }
1d8f0 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41  .  z = (char*)pA
1d900 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26  rray;.  memset(&
1d910 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20  z[n * szEntry], 
1d920 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a  0, szEntry);.  *
1d930 70 49 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70  pIdx = n;.  ++*p
1d940 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e  nEntry;.  return
1d950 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a   pArray;.}../*.*
1d960 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65  * Append a new e
1d970 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69  lement to the gi
1d980 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65  ven IdList.  Cre
1d990 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74  ate a new IdList
1d9a0 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a   if.** need be..
1d9b0 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69  **.** A new IdLi
1d9c0 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
1d9d0 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f  or NULL if mallo
1d9e0 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a  c() fails..**.**
1d9f0 20 54 68 65 20 7a 4e 61 6d 65 20 6d 75 73 74 20   The zName must 
1da00 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e  have been obtain
1da10 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
1da20 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 69 73  bMalloc().  This
1da30 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 63 63 65   routine.** acce
1da40 70 74 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  pts ownership of
1da50 20 74 68 65 20 7a 4e 61 6d 65 20 73 74 72 69 6e   the zName strin
1da60 67 20 61 6e 64 20 77 69 6c 6c 20 65 6e 73 75 72  g and will ensur
1da70 65 20 74 68 61 74 20 69 74 20 69 73 20 66 72 65  e that it is fre
1da80 65 64 0a 2a 2a 20 77 68 65 6e 20 6e 6f 20 6c 6f  ed.** when no lo
1da90 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a  nger in use..*/.
1daa0 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
1dab0 64 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50  dListAppend(.  P
1dac0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1dad0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1dae0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 64 4c 69  ontext */.  IdLi
1daf0 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
1db00 20 2f 2a 20 49 44 20 6c 69 73 74 20 74 6f 20 61   /* ID list to a
1db10 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 20 20 63 68  ppend to */.  ch
1db20 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20  ar *zName       
1db30 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20 61     /* Token to a
1db40 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ppend */.){.  in
1db50 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t i;.  sqlite3 *
1db60 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1db70 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1db80 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
1db90 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1dba0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64  ro(db, sizeof(Id
1dbb0 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
1dbc0 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
1dbd0 20 69 64 5f 6c 69 73 74 5f 61 70 70 65 6e 64 5f   id_list_append_
1dbe0 66 61 69 6c 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  fail;.  }.  pLis
1dbf0 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72  t->a = sqlite3Ar
1dc00 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
1dc10 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69     db,.      pLi
1dc20 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a  st->a,.      siz
1dc30 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
1dc40 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e  ,.      &pList->
1dc50 6e 49 64 2c 0a 20 20 20 20 20 20 26 69 0a 20 20  nId,.      &i.  
1dc60 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  );.  if( i<0 ){.
1dc70 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
1dc80 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
1dc90 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 69 64 5f  t);.    goto id_
1dca0 6c 69 73 74 5f 61 70 70 65 6e 64 5f 66 61 69 6c  list_append_fail
1dcb0 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61  ;.  }.  pList->a
1dcc0 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  [i].zName = zNam
1dcd0 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  e;.  return pLis
1dce0 74 3b 0a 0a 69 64 5f 6c 69 73 74 5f 61 70 70 65  t;..id_list_appe
1dcf0 6e 64 5f 66 61 69 6c 3a 0a 20 20 73 71 6c 69 74  nd_fail:.  sqlit
1dd00 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
1dd10 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  me);.  return 0;
1dd20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
1dd30 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76   an IdList..*/.v
1dd40 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73  oid sqlite3IdLis
1dd50 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
1dd60 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69  *db, IdList *pLi
1dd70 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
1dd80 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1dd90 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
1dda0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
1ddb0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1ddc0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
1ddd0 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
1dde0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
1ddf0 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
1de00 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1de10 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  ee(db, pList);.}
1de20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1de30 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
1de40 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
1de50 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
1de60 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
1de70 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
1de80 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  t sqlite3IdListI
1de90 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69  ndex(IdList *pLi
1dea0 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
1deb0 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  zName){.  int i;
1dec0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1ded0 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66  ) return -1;.  f
1dee0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1def0 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
1df00 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1df10 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
1df20 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
1df30 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
1df40 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
1df50 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65  /*.** Expand the
1df60 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
1df70 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
1df80 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79  rcList object by
1df90 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78  .** creating nEx
1dfa0 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65  tra new slots be
1dfb0 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72  ginning at iStar
1dfc0 74 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65  t.  iStart is ze
1dfd0 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77  ro based..** New
1dfe0 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65   slots are zeroe
1dff0 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  d..**.** For exa
1e000 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20  mple, suppose a 
1e010 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c  SrcList initiall
1e020 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65  y contains two e
1e030 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20  ntries: A,B..** 
1e040 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20  To append 3 new 
1e050 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65  entries onto the
1e060 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a   end, do this:.*
1e070 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53  *.**    sqlite3S
1e080 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
1e090 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32  , pSrclist, 3, 2
1e0a0 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  );.**.** After t
1e0b0 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74  he call above it
1e0c0 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20   would contain: 
1e0d0 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c   A, B, nil, nil,
1e0e0 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20   nil..** If the 
1e0f0 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20  iStart argument 
1e100 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65  had been 1 inste
1e110 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68  ad of 2, then th
1e120 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c  e result.** woul
1e130 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c  d have been:  A,
1e140 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20   nil, nil, nil, 
1e150 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74  B.  To prepend t
1e160 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a  he new slots,.**
1e170 20 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75   the iStart valu
1e180 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54  e would be 0.  T
1e190 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77  he result then w
1e1a0 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c  ould.** be: nil,
1e1b0 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e   nil, nil, A, B.
1e1c0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
1e1d0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
1e1e0 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74 20  ils the SrcList 
1e1f0 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54  is unchanged.  T
1e200 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63  he.** db->malloc
1e210 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c  Failed flag will
1e220 20 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e   be set to true.
1e230 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
1e240 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
1e250 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ge(.  sqlite3 *d
1e260 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b,       /* Data
1e270 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1e280 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d  to notify of OOM
1e290 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63   errors */.  Src
1e2a0 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
1e2b0 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74  /* The SrcList t
1e2c0 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f  o be enlarged */
1e2d0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
1e2e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1e2f0 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20  of new slots to 
1e300 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d  add to pSrc->a[]
1e310 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
1e320 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1e330 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f  x in pSrc->a[] o
1e340 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74  f first new slot
1e350 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
1e360 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
1e370 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67  cking on calling
1e380 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
1e390 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e   assert( iStart>
1e3a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1e3b0 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61  nExtra>=1 );.  a
1e3c0 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29  ssert( pSrc!=0 )
1e3d0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
1e3e0 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29  rt<=pSrc->nSrc )
1e3f0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
1e400 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63   additional spac
1e410 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  e if needed */. 
1e420 20 69 66 28 20 28 75 33 32 29 70 53 72 63 2d 3e   if( (u32)pSrc->
1e430 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63  nSrc+nExtra>pSrc
1e440 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
1e450 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
1e460 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20     int nAlloc = 
1e470 70 53 72 63 2d 3e 6e 53 72 63 2a 32 2b 6e 45 78  pSrc->nSrc*2+nEx
1e480 74 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f  tra;.    int nGo
1e490 74 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  t;.    pNew = sq
1e4a0 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
1e4b0 62 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20  b, pSrc,.       
1e4c0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
1e4d0 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d  pSrc) + (nAlloc-
1e4e0 31 29 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  1)*sizeof(pSrc->
1e4f0 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
1e500 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
1e510 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
1e520 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1e530 20 20 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b      return pSrc;
1e540 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20  .    }.    pSrc 
1e550 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74  = pNew;.    nGot
1e560 20 3d 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c   = (sqlite3DbMal
1e570 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77  locSize(db, pNew
1e580 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63  ) - sizeof(*pSrc
1e590 29 29 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  ))/sizeof(pSrc->
1e5a0 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72  a[0])+1;.    pSr
1e5b0 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74  c->nAlloc = nGot
1e5c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65  ;.  }..  /* Move
1e5d0 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20   existing slots 
1e5e0 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20  that come after 
1e5f0 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74  the newly insert
1e600 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75  ed slots.  ** ou
1e610 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a  t of the way */.
1e620 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
1e630 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b  rc-1; i>=iStart;
1e640 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d   i--){.    pSrc-
1e650 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70  >a[i+nExtra] = p
1e660 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20  Src->a[i];.  }. 
1e670 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e   pSrc->nSrc += n
1e680 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72  Extra;..  /* Zer
1e690 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f  o the newly allo
1e6a0 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20  cated slots */. 
1e6b0 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61   memset(&pSrc->a
1e6c0 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  [iStart], 0, siz
1e6d0 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a  eof(pSrc->a[0])*
1e6e0 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69  nExtra);.  for(i
1e6f0 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72  =iStart; i<iStar
1e700 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a  t+nExtra; i++){.
1e710 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69      pSrc->a[i].i
1e720 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d  Cursor = -1;.  }
1e730 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20  ..  /* Return a 
1e740 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65  pointer to the e
1e750 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73 74 20  nlarged SrcList 
1e760 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63  */.  return pSrc
1e770 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  ;.}.../*.** Appe
1e780 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e  nd a new table n
1e790 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ame to the given
1e7a0 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74   SrcList.  Creat
1e7b0 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  e a new SrcList 
1e7c0 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20  if.** need be.  
1e7d0 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63  A new entry is c
1e7e0 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72  reated in the Sr
1e7f0 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54  cList even if pT
1e800 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  able is NULL..**
1e810 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73  .** A SrcList is
1e820 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
1e830 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 61  LL if there is a
1e840 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68  n OOM error.  Th
1e850 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72  e returned.** Sr
1e860 63 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 74  cList might be t
1e870 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 53  he same as the S
1e880 72 63 4c 69 73 74 20 74 68 61 74 20 77 61 73 20  rcList that was 
1e890 69 6e 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68  input or it migh
1e8a0 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e  t be.** a new on
1e8b0 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  e.  If an OOM er
1e8c0 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c  ror does occurs,
1e8d0 20 74 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20   then the prior 
1e8e0 76 61 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a  value of pList.*
1e8f0 2a 20 74 68 61 74 20 69 73 20 69 6e 70 75 74 20  * that is input 
1e900 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
1e910 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
1e920 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
1e930 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f   pDatabase is no
1e940 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73  t null, it means
1e950 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
1e960 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a  has an optional.
1e970 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ** database name
1e980 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74   prefix.  Like t
1e990 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e  his:  "database.
1e9a0 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61  table".  The pDa
1e9b0 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73  tabase.** points
1e9c0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61   to the table na
1e9d0 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c  me and the pTabl
1e9e0 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
1e9f0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
1ea00 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b  * The SrcList.a[
1ea10 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73  ].zName field is
1ea20 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
1ea30 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63   table name whic
1ea40 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20  h might.** come 
1ea50 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20  from pTable (if 
1ea60 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
1ea70 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61  L) or from pData
1ea80 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69  base.  .** SrcLi
1ea90 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65  st.a[].zDatabase
1eaa0 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
1eab0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1eac0 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a  e from pTable,.*
1ead0 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69  * or with NULL i
1eae0 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73  f no database is
1eaf0 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
1eb00 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
1eb10 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74  , if call like t
1eb20 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
1eb30 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1eb40 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29  tAppend(D,A,B,0)
1eb50 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69  ;.**.** Then B i
1eb60 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  s a table name a
1eb70 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
1eb80 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66  name is unspecif
1eb90 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a  ied.  If called.
1eba0 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ** like this:.**
1ebb0 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
1ebc0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1ebd0 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a  (D,A,B,C);.**.**
1ebe0 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74   Then C is the t
1ebf0 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20  able name and B 
1ec00 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
1ec10 6e 61 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64  name.  If C is d
1ec20 65 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73  efined.** then s
1ec30 6f 20 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65  o is B.  In othe
1ec40 72 20 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65  r words, we neve
1ec50 72 20 68 61 76 65 20 61 20 63 61 73 65 20 77 68  r have a case wh
1ec60 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ere:.**.**      
1ec70 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1ec80 74 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29  tAppend(D,A,0,C)
1ec90 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61  ;.**.** Both pTa
1eca0 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73  ble and pDatabas
1ecb0 65 20 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f  e are assumed to
1ecc0 20 62 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65   be quoted.  The
1ecd0 79 20 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a  y are dequoted.*
1ece0 2a 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61  * before being a
1ecf0 64 64 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c  dded to the SrcL
1ed00 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ist..*/.SrcList 
1ed10 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
1ed20 70 70 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33  ppend(.  sqlite3
1ed30 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
1ed40 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  Connection to no
1ed50 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66  tify of malloc f
1ed60 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63  ailures */.  Src
1ed70 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
1ed80 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68   /* Append to th
1ed90 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c  is SrcList. NULL
1eda0 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 53   creates a new S
1edb0 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65  rcList */.  Toke
1edc0 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20  n *pTable,      
1edd0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65  /* Table to appe
1ede0 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nd */.  Token *p
1edf0 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44  Database    /* D
1ee00 61 74 61 62 61 73 65 20 6f 66 20 74 68 65 20 74  atabase of the t
1ee10 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  able */.){.  str
1ee20 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1ee30 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72   *pItem;.  asser
1ee40 74 28 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20  t( pDatabase==0 
1ee50 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20  || pTable!=0 ); 
1ee60 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20   /* Cannot have 
1ee70 43 20 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20  C without B */. 
1ee80 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
1ee90 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1eea0 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
1eeb0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1eec0 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
1eed0 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  SrcList) );.    
1eee0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1eef0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69  eturn 0;.    pLi
1ef00 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a  st->nAlloc = 1;.
1ef10 20 20 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20      pList->nSrc 
1ef20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  = 1;.    memset(
1ef30 26 70 4c 69 73 74 2d 3e 61 5b 30 5d 2c 20 30 2c  &pList->a[0], 0,
1ef40 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
1ef50 5b 30 5d 29 29 3b 0a 20 20 20 20 70 4c 69 73 74  [0]));.    pList
1ef60 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d  ->a[0].iCursor =
1ef70 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   -1;.  }else{.  
1ef80 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1ef90 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
1efa0 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c  db, pList, 1, pL
1efb0 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 7d 0a  ist->nSrc);.  }.
1efc0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1efd0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
1efe0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1eff0 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
1f000 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1f010 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  .  pItem = &pLis
1f020 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
1f030 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61  -1];.  if( pData
1f040 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73  base && pDatabas
1f050 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70  e->z==0 ){.    p
1f060 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
1f070 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  }.  if( pDatabas
1f080 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a  e ){.    Token *
1f090 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73  pTemp = pDatabas
1f0a0 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  e;.    pDatabase
1f0b0 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70   = pTable;.    p
1f0c0 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20  Table = pTemp;. 
1f0d0 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   }.  pItem->zNam
1f0e0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
1f0f0 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61  romToken(db, pTa
1f100 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a  ble);.  pItem->z
1f110 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
1f120 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1f130 64 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a  db, pDatabase);.
1f140 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
1f150 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
1f160 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78  VdbeCursor index
1f170 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20   numbers to all 
1f180 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c  tables in a SrcL
1f190 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ist.*/.void sqli
1f1a0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
1f1b0 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70  Cursors(Parse *p
1f1c0 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
1f1d0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
1f1e0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1f1f0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1f200 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c   assert(pList ||
1f210 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1f220 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
1f230 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
1f240 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
1f250 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
1f260 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
1f270 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  em++){.      if(
1f280 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e   pItem->iCursor>
1f290 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1f2a0 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
1f2b0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
1f2c0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  +;.      if( pIt
1f2d0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
1f2e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1f2f0 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
1f300 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  rs(pParse, pItem
1f310 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29  ->pSelect->pSrc)
1f320 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f330 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
1f340 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
1f350 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
1f360 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
1f370 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
1f380 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1f390 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
1f3a0 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
1f3b0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1f3c0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1f3d0 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
1f3e0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1f3f0 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
1f400 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
1f410 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
1f420 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
1f430 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1f440 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
1f450 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
1f460 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
1f470 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
1f480 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1f490 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1f4a0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
1f4b0 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 73 71  isIndexedBy ) sq
1f4c0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1f4d0 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  pItem->u1.zIndex
1f4e0 65 64 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  edBy);.    if( p
1f4f0 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
1f500 6e 63 20 29 20 73 71 6c 69 74 65 33 45 78 70 72  nc ) sqlite3Expr
1f510 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1f520 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
1f530 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  g);.    sqlite3D
1f540 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
1f550 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
1f560 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1f570 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
1f580 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
1f590 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1f5a0 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b  db, pItem->pOn);
1f5b0 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
1f5c0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  stDelete(db, pIt
1f5d0 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
1f5e0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1f5f0 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
1f600 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1f610 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
1f620 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61 64  the parser to ad
1f630 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20  d a new term to 
1f640 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20  the.** end of a 
1f650 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61  growing FROM cla
1f660 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70 61  use.  The "p" pa
1f670 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 70  rameter is the p
1f680 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52  art of.** the FR
1f690 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20 68  OM clause that h
1f6a0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1f6b0 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70  constructed.  "p
1f6c0 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  " is NULL.** if 
1f6d0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1f6e0 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52  t term of the FR
1f6f0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62  OM clause.  pTab
1f700 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65  le and pDatabase
1f710 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65  .** are the name
1f720 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e   of the table an
1f730 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  d database named
1f740 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1f750 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61  use term..** pDa
1f760 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69  tabase is NULL i
1f770 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  f the database n
1f780 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69 73  ame qualifier is
1f790 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a   missing - the.*
1f7a0 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49  * usual case.  I
1f7b0 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20 61  f the term has a
1f7c0 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41  n alias, then pA
1f7d0 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74  lias points to t
1f7e0 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65  he.** alias toke
1f7f0 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20  n.  If the term 
1f800 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74  is a subquery, t
1f810 68 65 6e 20 70 53 75 62 71 75 65 72 79 20 69 73  hen pSubquery is
1f820 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73   the.** SELECT s
1f830 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68  tatement that th
1f840 65 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64  e subquery encod
1f850 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20  es.  The pTable 
1f860 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  and.** pDatabase
1f870 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
1f880 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72  NULL for subquer
1f890 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e  ies.  The pOn an
1f8a0 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61  d pUsing.** para
1f8b0 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20 63  meters are the c
1f8c0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e  ontent of the ON
1f8d0 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
1f8e0 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  es..**.** Return
1f8f0 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77   a new SrcList w
1f900 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20  hich encodes is 
1f910 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68  the FROM with th
1f920 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64  e new.** term ad
1f930 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ded..*/.SrcList 
1f940 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
1f950 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20  ppendFromTerm(. 
1f960 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1f970 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1f980 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1f990 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20   SrcList *p,    
1f9a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f9b0 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74 68 65  left part of the
1f9c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72   FROM clause alr
1f9d0 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54  eady seen */.  T
1f9e0 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20  oken *pTable,   
1f9f0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1fa00 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61  f the table to a
1fa10 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63  dd to the FROM c
1fa20 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  lause */.  Token
1fa30 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20 20   *pDatabase,    
1fa40 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1fa50 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
1fa60 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a  ining pTable */.
1fa70 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c    Token *pAlias,
1fa80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1fa90 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
1faa0 20 6f 66 20 74 68 65 20 41 53 20 73 75 62 65 78   of the AS subex
1fab0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65  pression */.  Se
1fac0 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c  lect *pSubquery,
1fad0 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75        /* A subqu
1fae0 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63  ery used in plac
1faf0 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d  e of a table nam
1fb00 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e  e */.  Expr *pOn
1fb10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1fb20 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  * The ON clause 
1fb30 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49  of a join */.  I
1fb40 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20  dList *pUsing   
1fb50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53         /* The US
1fb60 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ING clause of a 
1fb70 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  join */.){.  str
1fb80 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1fb90 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
1fba0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1fbb0 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26  >db;.  if( !p &&
1fbc0 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29   (pOn || pUsing)
1fbd0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1fbe0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1fbf0 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69  "a JOIN clause i
1fc00 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  s required befor
1fc10 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70  e %s", .      (p
1fc20 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49  On ? "ON" : "USI
1fc30 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  NG").    );.    
1fc40 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d  goto append_from
1fc50 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20  _error;.  }.  p 
1fc60 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1fc70 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54  Append(db, p, pT
1fc80 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29  able, pDatabase)
1fc90 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
1fca0 4e 45 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30  NEVER(p->nSrc==0
1fcb0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70  ) ){.    goto ap
1fcc0 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b  pend_from_error;
1fcd0 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
1fce0 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
1fcf0 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c 69 61  .  assert( pAlia
1fd00 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41  s!=0 );.  if( pA
1fd10 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70  lias->n ){.    p
1fd20 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
1fd30 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1fd40 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b  ken(db, pAlias);
1fd50 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53  .  }.  pItem->pS
1fd60 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65 72  elect = pSubquer
1fd70 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20  y;.  pItem->pOn 
1fd80 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e  = pOn;.  pItem->
1fd90 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b  pUsing = pUsing;
1fda0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61  .  return p;.. a
1fdb0 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
1fdc0 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  :.  assert( p==0
1fdd0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
1fde0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29  rDelete(db, pOn)
1fdf0 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
1fe00 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69  tDelete(db, pUsi
1fe10 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ng);.  sqlite3Se
1fe20 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1fe30 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74  Subquery);.  ret
1fe40 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1fe50 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42  Add an INDEXED B
1fe60 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44  Y or NOT INDEXED
1fe70 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d   clause to the m
1fe80 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
1fe90 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f  ed .** element o
1fea0 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
1feb0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
1fec0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
1fed0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1fee0 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79  SrcListIndexedBy
1fef0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1ff00 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65  SrcList *p, Toke
1ff10 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a  n *pIndexedBy){.
1ff20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
1ff30 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28  edBy!=0 );.  if(
1ff40 20 70 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e   p && ALWAYS(p->
1ff50 6e 53 72 63 3e 30 29 20 29 7b 0a 20 20 20 20 73  nSrc>0) ){.    s
1ff60 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1ff70 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
1ff80 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
1ff90 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1ffa0 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  >fg.notIndexed==
1ffb0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1ffc0 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
1ffd0 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20  exedBy==0 );.   
1ffe0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1fff0 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20  fg.isTabFunc==0 
20000 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
20010 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21  xedBy->n==1 && !
20020 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b  pIndexedBy->z ){
20030 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54  .      /* A "NOT
20040 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65   INDEXED" clause
20050 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53   was supplied. S
20060 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20  ee parse.y .    
20070 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22    ** construct "
20080 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72  indexed_opt" for
20090 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20   details. */.   
200a0 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74     pItem->fg.not
200b0 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20  Indexed = 1;.   
200c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
200d0 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  tem->u1.zIndexed
200e0 42 79 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  By = sqlite3Name
200f0 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
20100 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79  ->db, pIndexedBy
20110 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
20120 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 3d  fg.isIndexedBy =
20130 20 28 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64   (pItem->u1.zInd
20140 65 78 65 64 42 79 21 3d 30 29 3b 0a 20 20 20 20  exedBy!=0);.    
20150 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
20160 64 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66  dd the list of f
20170 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
20180 73 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74  s to the SrcList
20190 20 65 6e 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20   entry for a.** 
201a0 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e  table-valued-fun
201b0 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
201c0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 46 75 6e  qlite3SrcListFun
201d0 63 41 72 67 73 28 50 61 72 73 65 20 2a 70 50 61  cArgs(Parse *pPa
201e0 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c  rse, SrcList *p,
201f0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
20200 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
20210 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
20220 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
20230 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
20240 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
20250 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  em->fg.notIndexe
20260 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
20270 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
20280 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a  IndexedBy==0 );.
20290 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
202a0 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m->fg.isTabFunc=
202b0 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  =0 );.    pItem-
202c0 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 70  >u1.pFuncArg = p
202d0 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d  List;.    pItem-
202e0 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 3d 20  >fg.isTabFunc = 
202f0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
20300 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
20310 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
20320 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a  , pList);.  }.}.
20330 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c  ./*.** When buil
20340 64 69 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63  ding up a FROM c
20350 6c 61 75 73 65 20 69 6e 20 74 68 65 20 70 61 72  lause in the par
20360 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ser, the join op
20370 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69  erator.** is ini
20380 74 69 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20  tially attached 
20390 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  to the left oper
203a0 61 6e 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f  and.  But the co
203b0 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
203c0 65 78 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e  expects the join
203d0 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20   operator to be 
203e0 6f 6e 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  on the right ope
203f0 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74  rand.  This rout
20400 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c  ine.** Shifts al
20410 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73  l join operators
20420 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
20430 67 68 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72  ght for an entir
20440 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65  e FROM.** clause
20450 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a  ..**.** Example:
20460 20 53 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69   Suppose the joi
20470 6e 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  n is like this:.
20480 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
20490 41 20 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20  A natural cross 
204a0 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65  join B.**.** The
204b0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61   operator is "na
204c0 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e  tural cross join
204d0 22 2e 20 20 54 68 65 20 41 20 61 6e 64 20 42 20  ".  The A and B 
204e0 6f 70 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f  operands are sto
204f0 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30  red.** in p->a[0
20500 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72  ] and p->a[1], r
20510 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68  espectively.  Th
20520 65 20 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c  e parser initial
20530 6c 79 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a  ly stores the.**
20540 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 41   operator with A
20550 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
20560 73 68 69 66 74 73 20 74 68 61 74 20 6f 70 65 72  shifts that oper
20570 61 74 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a  ator over to B..
20580 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
20590 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54  rcListShiftJoinT
205a0 79 70 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b  ype(SrcList *p){
205b0 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
205c0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
205d0 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b  =p->nSrc-1; i>0;
205e0 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i--){.      p->
205f0 61 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  a[i].fg.jointype
20600 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e   = p->a[i-1].fg.
20610 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a  jointype;.    }.
20620 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a      p->a[0].fg.j
20630 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d  ointype = 0;.  }
20640 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
20650 74 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72  te VDBE code for
20660 20 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65   a BEGIN stateme
20670 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
20680 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74  te3BeginTransact
20690 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
206a0 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20  e, int type){.  
206b0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
206c0 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b  dbe *v;.  int i;
206d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
206e0 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20  se!=0 );.  db = 
206f0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
20700 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
20710 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
20720 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
20730 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
20740 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29  , "BEGIN", 0, 0)
20750 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
20760 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65    }.  v = sqlite
20770 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
20780 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74  ;.  if( !v ) ret
20790 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21  urn;.  if( type!
207a0 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a  =TK_DEFERRED ){.
207b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
207c0 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
207d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
207e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e  ddOp2(v, OP_Tran
207f0 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70  saction, i, (typ
20800 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29  e==TK_EXCLUSIVE)
20810 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
20820 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
20830 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  v, i);.    }.  }
20840 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
20850 64 4f 70 30 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp0(v, OP_AutoC
20860 6f 6d 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ommit);.}../*.**
20870 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
20880 6f 64 65 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54  ode for a COMMIT
20890 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
208a0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
208b0 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  tTransaction(Par
208c0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
208d0 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72  dbe *v;..  asser
208e0 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
208f0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
20900 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ->db!=0 );.  if(
20910 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
20920 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
20930 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43  _TRANSACTION, "C
20940 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 7b  OMMIT", 0, 0) ){
20950 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
20960 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
20970 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
20980 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
20990 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
209a0 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
209b0 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
209c0 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
209d0 20 63 6f 64 65 20 66 6f 72 20 61 20 52 4f 4c 4c   code for a ROLL
209e0 42 41 43 4b 20 73 74 61 74 65 6d 65 6e 74 2e 0a  BACK statement..
209f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
20a00 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69  ollbackTransacti
20a10 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
20a20 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  ){.  Vdbe *v;.. 
20a30 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
20a40 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
20a50 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b  pParse->db!=0 );
20a60 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
20a70 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
20a80 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
20a90 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20  ON, "ROLLBACK", 
20aa0 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74  0, 0) ){.    ret
20ab0 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73  urn;.  }.  v = s
20ac0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
20ad0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
20ae0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
20af0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75  eAddOp2(v, OP_Au
20b00 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b  toCommit, 1, 1);
20b10 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
20b20 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
20b30 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
20b40 73 65 72 20 77 68 65 6e 20 69 74 20 70 61 72 73  ser when it pars
20b50 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  es a command to 
20b60 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61  create,.** relea
20b70 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
20b80 6e 20 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e  n SQL savepoint.
20b90 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
20ba0 33 53 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65  3Savepoint(Parse
20bb0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70   *pParse, int op
20bc0 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
20bd0 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
20be0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
20bf0 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
20c00 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
20c10 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  zName ){.    Vdb
20c20 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
20c30 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23  tVdbe(pParse);.#
20c40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20c50 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
20c60 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
20c70 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61  t char * const a
20c80 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c  z[] = { "BEGIN",
20c90 20 22 52 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c   "RELEASE", "ROL
20ca0 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73  LBACK" };.    as
20cb0 73 65 72 74 28 20 21 53 41 56 45 50 4f 49 4e 54  sert( !SAVEPOINT
20cc0 5f 42 45 47 49 4e 20 26 26 20 53 41 56 45 50 4f  _BEGIN && SAVEPO
20cd0 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26  INT_RELEASE==1 &
20ce0 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  & SAVEPOINT_ROLL
20cf0 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69  BACK==2 );.#endi
20d00 66 0a 20 20 20 20 69 66 28 20 21 76 20 7c 7c 20  f.    if( !v || 
20d10 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
20d20 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
20d30 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70  SAVEPOINT, az[op
20d40 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a  ], zName, 0) ){.
20d50 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
20d60 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
20d70 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
20d80 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
20d90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20da0 34 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e  4(v, OP_Savepoin
20db0 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61  t, op, 0, 0, zNa
20dc0 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  me, P4_DYNAMIC);
20dd0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
20de0 6b 65 20 73 75 72 65 20 74 68 65 20 54 45 4d 50  ke sure the TEMP
20df0 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
20e00 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20  n and available 
20e10 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e  for use.  Return
20e20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
20e30 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65  f errors.  Leave
20e40 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
20e50 67 65 73 20 69 6e 20 74 68 65 20 70 50 61 72 73  ges in the pPars
20e60 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
20e70 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  int sqlite3OpenT
20e80 65 6d 70 44 61 74 61 62 61 73 65 28 50 61 72 73  empDatabase(Pars
20e90 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
20ea0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
20eb0 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62  se->db;.  if( db
20ec0 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20  ->aDb[1].pBt==0 
20ed0 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  && !pParse->expl
20ee0 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ain ){.    int r
20ef0 63 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  c;.    Btree *pB
20f00 74 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  t;.    static co
20f10 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
20f20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
20f30 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
20f40 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
20f50 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
20f60 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
20f70 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
20f80 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
20f90 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
20fa0 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20  ONCLOSE |.      
20fb0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
20fc0 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63  TEMP_DB;..    rc
20fd0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f   = sqlite3BtreeO
20fe0 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c  pen(db->pVfs, 0,
20ff0 20 64 62 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c   db, &pBt, 0, fl
21000 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ags);.    if( rc
21010 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
21020 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
21030 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
21040 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74  able to open a t
21050 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
21060 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c  e ".        "fil
21070 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65  e for storing te
21080 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29  mporary tables")
21090 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
210a0 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72  rc = rc;.      r
210b0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
210c0 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42     db->aDb[1].pB
210d0 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 61 73 73  t = pBt;.    ass
210e0 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  ert( db->aDb[1].
210f0 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69  pSchema );.    i
21100 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d  f( SQLITE_NOMEM=
21110 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74  =sqlite3BtreeSet
21120 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62  PageSize(pBt, db
21130 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 20  ->nextPagesize, 
21140 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  -1, 0) ){.      
21150 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
21160 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  db);.      retur
21170 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
21180 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
21190 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66  .** Record the f
211a0 61 63 74 20 74 68 61 74 20 74 68 65 20 73 63 68  act that the sch
211b0 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69 6c 6c 20  ema cookie will 
211c0 6e 65 65 64 20 74 6f 20 62 65 20 76 65 72 69 66  need to be verif
211d0 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61 74 61 62  ied.** for datab
211e0 61 73 65 20 69 44 62 2e 20 20 54 68 65 20 63 6f  ase iDb.  The co
211f0 64 65 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 76  de to actually v
21200 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61  erify the schema
21210 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c 20   cookie.** will 
21220 6f 63 63 75 72 20 61 74 20 74 68 65 20 65 6e 64  occur at the end
21230 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65   of the top-leve
21240 6c 20 56 44 42 45 20 61 6e 64 20 77 69 6c 6c 20  l VDBE and will 
21250 62 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  be generated.** 
21260 6c 61 74 65 72 2c 20 62 79 20 73 71 6c 69 74 65  later, by sqlite
21270 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
21280 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21290 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
212a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
212b0 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73  int iDb){.  Pars
212c0 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
212d0 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
212e0 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  vel(pParse);..  
212f0 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
21300 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62  & iDb<pParse->db
21310 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
21320 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  t( pParse->db->a
21330 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c  Db[iDb].pBt!=0 |
21340 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 61 73  | iDb==1 );.  as
21350 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45  sert( iDb<SQLITE
21360 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20  _MAX_ATTACHED+2 
21370 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
21380 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
21390 65 6c 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  eld(pParse->db, 
213a0 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 69 66 28  iDb, 0) );.  if(
213b0 20 44 62 4d 61 73 6b 54 65 73 74 28 70 54 6f 70   DbMaskTest(pTop
213c0 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73  level->cookieMas
213d0 6b 2c 20 69 44 62 29 3d 3d 30 20 29 7b 0a 20 20  k, iDb)==0 ){.  
213e0 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70    DbMaskSet(pTop
213f0 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73  level->cookieMas
21400 6b 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28  k, iDb);.    if(
21410 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
21420 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
21430 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
21440 44 61 74 61 62 61 73 65 28 70 54 6f 70 6c 65 76  Database(pToplev
21450 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  el);.    }.  }.}
21460 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ../*.** If argum
21470 65 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c  ent zDb is NULL,
21480 20 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74   then call sqlit
21490 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
214a0 6d 61 28 29 20 66 6f 72 20 65 61 63 68 20 0a 2a  ma() for each .*
214b0 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
214c0 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ase. Otherwise, 
214d0 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20 74 68  invoke it for th
214e0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  e database named
214f0 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f   zDb only..*/.vo
21500 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  id sqlite3CodeVe
21510 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28  rifyNamedSchema(
21520 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
21530 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
21540 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
21550 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
21560 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
21570 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
21580 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20  {.    Db *pDb = 
21590 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
215a0 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 26 26   if( pDb->pBt &&
215b0 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73 71 6c   (!zDb || 0==sql
215c0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
215d0 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 29   pDb->zDbSName))
215e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
215f0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
21600 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20  a(pParse, i);.  
21610 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
21620 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
21630 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65  ode that prepare
21640 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f  s for doing an o
21650 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  peration that.**
21660 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
21670 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
21680 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
21690 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e  tarts a new tran
216a0 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72  saction if we ar
216b0 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69  e not already wi
216c0 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61  thin.** a transa
216d0 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72  ction.  If we ar
216e0 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  e already within
216f0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
21700 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e  then a checkpoin
21710 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74  t.** is set if t
21720 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20  he setStatement 
21730 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75  parameter is tru
21740 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74  e.  A checkpoint
21750 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
21760 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73  t for operations
21770 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c   that might fail
21780 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74   (due to a const
21790 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a  raint) part of.*
217a0 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67  * the way throug
217b0 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c  h and which will
217c0 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f   need to undo so
217d0 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75  me writes withou
217e0 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72  t having to.** r
217f0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c  ollback the whol
21800 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
21810 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  For operations w
21820 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  here all constra
21830 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  ints.** can be c
21840 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e  hecked before an
21850 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  y changes are ma
21860 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
21870 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a  se, it is never.
21880 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ** necessary to 
21890 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64  undo a write and
218a0 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
218b0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65  should not be se
218c0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
218d0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
218e0 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ation(Parse *pPa
218f0 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74  rse, int setStat
21900 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b  ement, int iDb){
21910 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
21920 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
21930 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
21940 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64  e);.  sqlite3Cod
21950 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
21960 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 44 62  arse, iDb);.  Db
21970 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65 76 65  MaskSet(pTopleve
21980 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c 20 69 44  l->writeMask, iD
21990 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d  b);.  pToplevel-
219a0 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d  >isMultiWrite |=
219b0 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d   setStatement;.}
219c0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65  ../*.** Indicate
219d0 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d   that the statem
219e0 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ent currently un
219f0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
21a00 20 6d 69 67 68 74 20 77 72 69 74 65 0a 2a 2a 20   might write.** 
21a10 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e  more than one en
21a20 74 72 79 20 28 65 78 61 6d 70 6c 65 3a 20 64 65  try (example: de
21a30 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74  leting one row t
21a40 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 61 6e  hen inserting an
21a50 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74  other,.** insert
21a60 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  ing multiple row
21a70 73 20 69 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72  s in a table, or
21a80 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72 6f 77   inserting a row
21a90 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69   and index entri
21aa0 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62  es.).** If an ab
21ab0 6f 72 74 20 6f 63 63 75 72 73 20 61 66 74 65 72  ort occurs after
21ac0 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 77   some of these w
21ad0 72 69 74 65 73 20 68 61 76 65 20 63 6f 6d 70 6c  rites have compl
21ae0 65 74 65 64 2c 20 74 68 65 6e 20 69 74 20 77 69  eted, then it wi
21af0 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61  ll.** be necessa
21b00 72 79 20 74 6f 20 75 6e 64 6f 20 74 68 65 20 63  ry to undo the c
21b10 6f 6d 70 6c 65 74 65 64 20 77 72 69 74 65 73 2e  ompleted writes.
21b20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21b30 4d 75 6c 74 69 57 72 69 74 65 28 50 61 72 73 65  MultiWrite(Parse
21b40 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72   *pParse){.  Par
21b50 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
21b60 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
21b70 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
21b80 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c  pToplevel->isMul
21b90 74 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a  tiWrite = 1;.}..
21ba0 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  /* .** The code 
21bb0 67 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c 73 20  generator calls 
21bc0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 66 20  this routine if 
21bd0 69 73 20 64 69 73 63 6f 76 65 72 73 20 74 68 61  is discovers tha
21be0 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69  t it is.** possi
21bf0 62 6c 65 20 74 6f 20 61 62 6f 72 74 20 61 20 73  ble to abort a s
21c00 74 61 74 65 6d 65 6e 74 20 70 72 69 6f 72 20 74  tatement prior t
21c10 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49  o completion.  I
21c20 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70  n order to .** p
21c30 65 72 66 6f 72 6d 20 74 68 69 73 20 61 62 6f 72  erform this abor
21c40 74 20 77 69 74 68 6f 75 74 20 63 6f 72 72 75 70  t without corrup
21c50 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
21c60 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61  e, we need to ma
21c70 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68 61 74 20  ke.** sure that 
21c80 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
21c90 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 61 20   protected by a 
21ca0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
21cb0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63  ction..**.** Tec
21cc0 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c  hnically, we onl
21cd0 79 20 6e 65 65 64 20 74 6f 20 73 65 74 20 74 68  y need to set th
21ce0 65 20 6d 61 79 41 62 6f 72 74 20 66 6c 61 67 20  e mayAbort flag 
21cf0 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74  if the.** isMult
21d00 69 57 72 69 74 65 20 66 6c 61 67 20 77 61 73 20  iWrite flag was 
21d10 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 2e 20  previously set. 
21d20 20 54 68 65 72 65 20 69 73 20 61 20 74 69 6d 65   There is a time
21d30 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73   dependency.** s
21d40 75 63 68 20 74 68 61 74 20 74 68 65 20 61 62 6f  uch that the abo
21d50 72 74 20 6d 75 73 74 20 6f 63 63 75 72 20 61 66  rt must occur af
21d60 74 65 72 20 74 68 65 20 6d 75 6c 74 69 77 72 69  ter the multiwri
21d70 74 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 0a  te.  This makes.
21d80 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e  ** some statemen
21d90 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65  ts involving the
21da0 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63   REPLACE conflic
21db0 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
21dc0 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c  orithm.** go a l
21dd0 69 74 74 6c 65 20 66 61 73 74 65 72 2e 20 20 42  ittle faster.  B
21de0 75 74 20 74 61 6b 69 6e 67 20 61 64 76 61 6e 74  ut taking advant
21df0 61 67 65 20 6f 66 20 74 68 69 73 20 74 69 6d 65  age of this time
21e00 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d   dependency.** m
21e10 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64 69 66  akes it more dif
21e20 66 69 63 75 6c 74 20 74 6f 20 70 72 6f 76 65 20  ficult to prove 
21e30 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 69 73  that the code is
21e40 20 63 6f 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a   correct (in .**
21e50 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69 74 20   particular, it 
21e60 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d  prevents us from
21e70 20 77 72 69 74 69 6e 67 20 61 6e 20 65 66 66 65   writing an effe
21e80 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ctive.** impleme
21e90 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74  ntation of sqlit
21ea0 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  e3AssertMayAbort
21eb0 28 29 29 20 61 6e 64 20 73 6f 20 77 65 20 68 61  ()) and so we ha
21ec0 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20  ve chosen.** to 
21ed0 74 61 6b 65 20 74 68 65 20 73 61 66 65 20 72 6f  take the safe ro
21ee0 75 74 65 20 61 6e 64 20 73 6b 69 70 20 74 68 65  ute and skip the
21ef0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
21f00 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61  /.void sqlite3Ma
21f10 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a 70 50  yAbort(Parse *pP
21f20 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a  arse){.  Parse *
21f30 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
21f40 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
21f50 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70  (pParse);.  pTop
21f60 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20  level->mayAbort 
21f70 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  = 1;.}../*.** Co
21f80 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68  de an OP_Halt th
21f90 61 74 20 63 61 75 73 65 73 20 74 68 65 20 76 64  at causes the vd
21fa0 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  be to return an 
21fb0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
21fc0 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68 65 20  T.** error. The 
21fd0 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65 74 65  onError paramete
21fe0 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  r determines whi
21ff0 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66 20 74  ch (if any) of t
22000 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
22010 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74 20 74  and/or current t
22020 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
22030 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f  lled back..*/.vo
22040 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f  id sqlite3HaltCo
22050 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
22060 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
22070 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
22080 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64   */.  int errCod
22090 65 2c 20 20 20 20 20 20 2f 2a 20 65 78 74 65 6e  e,      /* exten
220a0 64 65 64 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  ded error code *
220b0 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
220c0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61        /* Constra
220d0 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 63 68  int type */.  ch
220e0 61 72 20 2a 70 34 2c 20 20 20 20 20 20 20 20 20  ar *p4,         
220f0 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  /* Error message
22100 20 2a 2f 0a 20 20 69 38 20 70 34 74 79 70 65 2c   */.  i8 p4type,
22110 20 20 20 20 20 20 20 20 2f 2a 20 50 34 5f 53 54          /* P4_ST
22120 41 54 49 43 20 6f 72 20 50 34 5f 54 52 41 4e 53  ATIC or P4_TRANS
22130 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20 70 35 45  IENT */.  u8 p5E
22140 72 72 6d 73 67 20 20 20 20 20 20 20 2f 2a 20 50  rrmsg       /* P
22150 35 5f 45 72 72 4d 73 67 20 74 79 70 65 20 2a 2f  5_ErrMsg type */
22160 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
22170 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
22180 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
22190 28 20 28 65 72 72 43 6f 64 65 26 30 78 66 66 29  ( (errCode&0xff)
221a0 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
221b0 49 4e 54 20 29 3b 0a 20 20 69 66 28 20 6f 6e 45  INT );.  if( onE
221c0 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  rror==OE_Abort )
221d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79  {.    sqlite3May
221e0 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20  Abort(pParse);. 
221f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
22200 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c  AddOp4(v, OP_Hal
22210 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f 6e 45 72  t, errCode, onEr
22220 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34 74 79  ror, 0, p4, p4ty
22230 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  pe);.  sqlite3Vd
22240 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35  beChangeP5(v, p5
22250 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Errmsg);.}../*.*
22260 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c  * Code an OP_Hal
22270 74 20 64 75 65 20 74 6f 20 55 4e 49 51 55 45 20  t due to UNIQUE 
22280 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
22290 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
222a0 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
222b0 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72  ite3UniqueConstr
222c0 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
222d0 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
222e0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
222f0 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
22300 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e      /* Constrain
22310 74 20 74 79 70 65 20 2a 2f 0a 20 20 49 6e 64 65  t type */.  Inde
22320 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 2f 2a  x *pIdx       /*
22330 20 54 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   The index that 
22340 74 72 69 67 67 65 72 73 20 74 68 65 20 63 6f 6e  triggers the con
22350 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20  straint */.){.  
22360 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 69 6e  char *zErr;.  in
22370 74 20 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  t j;.  StrAccum 
22380 65 72 72 4d 73 67 3b 0a 20 20 54 61 62 6c 65 20  errMsg;.  Table 
22390 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54  *pTab = pIdx->pT
223a0 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33  able;..  sqlite3
223b0 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 65 72  StrAccumInit(&er
223c0 72 4d 73 67 2c 20 70 50 61 72 73 65 2d 3e 64 62  rMsg, pParse->db
223d0 2c 20 30 2c 20 30 2c 20 32 30 30 29 3b 0a 20 20  , 0, 0, 200);.  
223e0 69 66 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  if( pIdx->aColEx
223f0 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
22400 33 58 50 72 69 6e 74 66 28 26 65 72 72 4d 73 67  3XPrintf(&errMsg
22410 2c 20 22 69 6e 64 65 78 20 27 25 71 27 22 2c 20  , "index '%q'", 
22420 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pIdx->zName);.  
22430 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 6a  }else{.    for(j
22440 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; j<pIdx->nKey
22450 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
22460 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
22470 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
22480 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20  >aiColumn[j]>=0 
22490 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  );.      zCol = 
224a0 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d  pTab->aCol[pIdx-
224b0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  >aiColumn[j]].zN
224c0 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  ame;.      if( j
224d0 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   ) sqlite3StrAcc
224e0 75 6d 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67  umAppend(&errMsg
224f0 2c 20 22 2c 20 22 2c 20 32 29 3b 0a 20 20 20 20  , ", ", 2);.    
22500 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
22510 28 26 65 72 72 4d 73 67 2c 20 22 25 73 2e 25 73  (&errMsg, "%s.%s
22520 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
22530 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zCol);.    }.  }
22540 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65  .  zErr = sqlite
22550 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28  3StrAccumFinish(
22560 26 65 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  &errMsg);.  sqli
22570 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
22580 74 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 49  t(pParse, .    I
22590 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
225a0 28 70 49 64 78 29 20 3f 20 53 51 4c 49 54 45 5f  (pIdx) ? SQLITE_
225b0 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41  CONSTRAINT_PRIMA
225c0 52 59 4b 45 59 20 0a 20 20 20 20 20 20 20 20 20  RYKEY .         
225d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225e0 20 20 20 3a 20 53 51 4c 49 54 45 5f 43 4f 4e 53     : SQLITE_CONS
225f0 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 2c 0a 20  TRAINT_UNIQUE,. 
22600 20 20 20 6f 6e 45 72 72 6f 72 2c 20 7a 45 72 72     onError, zErr
22610 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20 50 35  , P4_DYNAMIC, P5
22620 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71 75  _ConstraintUniqu
22630 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  e);.}.../*.** Co
22640 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75  de an OP_Halt du
22650 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65 20  e to non-unique 
22660 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rowid..*/.void s
22670 71 6c 69 74 65 33 52 6f 77 69 64 43 6f 6e 73 74  qlite3RowidConst
22680 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
22690 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
226a0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
226b0 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
226c0 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74       /* Conflict
226d0 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
226e0 72 69 74 68 6d 20 2a 2f 0a 20 20 54 61 62 6c 65  rithm */.  Table
226f0 20 2a 70 54 61 62 20 20 20 20 20 20 20 2f 2a 20   *pTab       /* 
22700 54 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 74  The table with t
22710 68 65 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f  he non-unique ro
22720 77 69 64 20 2a 2f 20 0a 29 7b 0a 20 20 63 68 61  wid */ .){.  cha
22730 72 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74 20 72  r *zMsg;.  int r
22740 63 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69  c;.  if( pTab->i
22750 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 7a  PKey>=0 ){.    z
22760 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
22770 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
22780 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e   "%s.%s", pTab->
22790 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227b0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
227c0 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b  ->iPKey].zName);
227d0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
227e0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d  _CONSTRAINT_PRIM
227f0 41 52 59 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b  ARYKEY;.  }else{
22800 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
22810 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
22820 65 2d 3e 64 62 2c 20 22 25 73 2e 72 6f 77 69 64  e->db, "%s.rowid
22830 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
22840 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
22850 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49  _CONSTRAINT_ROWI
22860 44 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  D;.  }.  sqlite3
22870 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
22880 50 61 72 73 65 2c 20 72 63 2c 20 6f 6e 45 72 72  Parse, rc, onErr
22890 6f 72 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e  or, zMsg, P4_DYN
228a0 41 4d 49 43 2c 0a 20 20 20 20 20 20 20 20 20 20  AMIC,.          
228b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 35                P5
228c0 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71 75  _ConstraintUniqu
228d0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  e);.}../*.** Che
228e0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e  ck to see if pIn
228f0 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c  dex uses the col
22900 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
22910 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a  pColl.  Return.*
22920 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65  * true if it doe
22930 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69  s and false if i
22940 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23  t does not..*/.#
22950 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22960 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
22970 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d  c int collationM
22980 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20  atch(const char 
22990 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70  *zColl, Index *p
229a0 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b  Index){.  int i;
229b0 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c  .  assert( zColl
229c0 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  !=0 );.  for(i=0
229d0 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ; i<pIndex->nCol
229e0 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  umn; i++){.    c
229f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
22a00 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
22a10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21  ;.    assert( z!
22a20 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 61 69  =0 || pIndex->ai
22a30 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20  Column[i]<0 );. 
22a40 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61     if( pIndex->a
22a50 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26  iColumn[i]>=0 &&
22a60 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
22a70 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  mp(z, zColl) ){.
22a80 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
22a90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22aa0 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
22ab0 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
22ac0 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70  all indices of p
22ad0 54 61 62 20 74 68 61 74 20 75 73 65 20 74 68 65  Tab that use the
22ae0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
22af0 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66  nce pColl..** If
22b00 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
22b10 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
22b20 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f  ices of pTab..*/
22b30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22b40 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
22b50 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78  tic void reindex
22b60 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
22b70 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
22b80 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43  , char const *zC
22b90 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  oll){.  Index *p
22ba0 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
22bb0 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
22bc0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22bd0 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70  pTab */..  for(p
22be0 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64  Index=pTab->pInd
22bf0 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
22c00 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74  ex=pIndex->pNext
22c10 29 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c  ){.    if( zColl
22c20 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e  ==0 || collation
22c30 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e  Match(zColl, pIn
22c40 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  dex) ){.      in
22c50 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
22c60 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
22c70 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
22c80 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73  Schema);.      s
22c90 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
22ca0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
22cb0 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  , 0, iDb);.     
22cc0 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
22cd0 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
22ce0 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  ex, -1);.    }. 
22cf0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
22d00 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c  ** Recompute all
22d10 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20   indices of all 
22d20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61  tables in all da
22d30 74 61 62 61 73 65 73 20 77 68 65 72 65 20 74 68  tabases where th
22d40 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65  e.** indices use
22d50 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
22d60 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
22d70 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e  If pColl==0 then
22d80 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c   recompute.** al
22d90 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72 79 77  l indices everyw
22da0 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  here..*/.#ifndef
22db0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
22dc0 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64  NDEX.static void
22dd0 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
22de0 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
22df0 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
22e00 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20  ll){.  Db *pDb; 
22e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64     /* A single d
22e30 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
22e40 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
22e50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22e60 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
22e70 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
22e80 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
22e90 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
22ea0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
22eb0 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20  n */.  HashElem 
22ec0 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *k;             
22ed0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
22ee0 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e  g over tables in
22ef0 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20   pDb */.  Table 
22f00 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
22f10 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
22f20 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
22f30 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
22f40 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
22f50 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
22f60 3b 20 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72  ;  /* Needed for
22f70 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 20 2a   schema access *
22f80 2f 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70  /.  for(iDb=0, p
22f90 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c  Db=db->aDb; iDb<
22fa0 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20  db->nDb; iDb++, 
22fb0 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  pDb++){.    asse
22fc0 72 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20  rt( pDb!=0 );.  
22fd0 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61    for(k=sqliteHa
22fe0 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53  shFirst(&pDb->pS
22ff0 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
23000 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73    k; k=sqliteHas
23010 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20  hNext(k)){.     
23020 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29   pTab = (Table*)
23030 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b  sqliteHashData(k
23040 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78  );.      reindex
23050 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
23060 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  ab, zColl);.    
23070 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
23080 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
23090 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e  ode for the REIN
230a0 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  DEX command..**.
230b0 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
230c0 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X               
230d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
230e0 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  1.**        REIN
230f0 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e  DEX  <collation>
23100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
23110 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 2.**        RE
23120 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
23130 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20  e>.?<tablename> 
23140 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20   -- 3.**        
23150 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62  REINDEX  ?<datab
23160 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65  ase>.?<indexname
23170 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f  >  -- 4.**.** Fo
23180 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20  rm 1 causes all 
23190 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61  indices in all a
231a0 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
231b0 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e  s to be rebuilt.
231c0 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69  .** Form 2 rebui
231d0 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  lds all indices 
231e0 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  in all databases
231f0 20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e 61   that use the na
23200 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67  med.** collating
23210 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d   function.  Form
23220 73 20 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c  s 3 and 4 rebuil
23230 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
23240 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69  x or all.** indi
23250 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
23260 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61  ith the named ta
23270 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ble..*/.#ifndef 
23280 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
23290 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  DEX.void sqlite3
232a0 52 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70  Reindex(Parse *p
232b0 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
232c0 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  ame1, Token *pNa
232d0 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  me2){.  CollSeq 
232e0 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pColl;         
232f0 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
23300 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20   sequence to be 
23310 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55  reindexed, or NU
23320 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  LL */.  char *z;
23330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23340 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61      /* Name of a
23350 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
23360 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
23370 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *zDb;           
23380 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
23390 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61  database */.  Ta
233a0 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
233b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
233c0 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
233d0 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  base */.  Index 
233e0 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
233f0 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
23400 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
23410 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20  h pTab */.  int 
23420 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
23430 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
23440 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75  atabase index nu
23450 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mber */.  sqlite
23460 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
23470 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74  db;   /* The dat
23480 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
23490 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62   */.  Token *pOb
234a0 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  jName;          
234b0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
234c0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
234d0 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 20  to be reindexed 
234e0 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  */..  /* Read th
234f0 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
23500 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  a. If an error o
23510 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
23520 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20  error message.  
23530 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70  ** and code in p
23540 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
23550 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20   NULL. */.  if( 
23560 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
23570 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
23580 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rse) ){.    retu
23590 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rn;.  }..  if( p
235a0 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Name1==0 ){.    
235b0 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
235c0 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20  (pParse, 0);.   
235d0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65   return;.  }else
235e0 20 69 66 28 20 4e 45 56 45 52 28 70 4e 61 6d 65   if( NEVER(pName
235f0 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d  2==0) || pName2-
23600 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  >z==0 ){.    cha
23610 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73  r *zColl;.    as
23620 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20  sert( pName1->z 
23630 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73  );.    zColl = s
23640 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
23650 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
23660 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28  pName1);.    if(
23670 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e   !zColl ) return
23680 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
23690 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
236a0 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43  (db, ENC(db), zC
236b0 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  oll, 0);.    if(
236c0 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
236d0 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
236e0 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b  (pParse, zColl);
236f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
23700 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
23710 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
23720 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
23730 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
23740 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  );.  }.  iDb = s
23750 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
23760 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
23770 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e  , pName2, &pObjN
23780 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
23790 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20  0 ) return;.  z 
237a0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
237b0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e  mToken(db, pObjN
237c0 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  ame);.  if( z==0
237d0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62   ) return;.  zDb
237e0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
237f0 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 70 54 61 62  zDbSName;.  pTab
23800 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
23810 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  ble(db, z, zDb);
23820 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20  .  if( pTab ){. 
23830 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
23840 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29  pParse, pTab, 0)
23850 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
23860 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
23870 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49  return;.  }.  pI
23880 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
23890 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a  ndIndex(db, z, z
238a0 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  Db);.  sqlite3Db
238b0 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69  Free(db, z);.  i
238c0 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
238d0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
238e0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
238f0 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
23900 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
23910 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
23920 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  ex, -1);.    ret
23930 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
23940 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
23950 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64  e, "unable to id
23960 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63  entify the objec
23970 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  t to be reindexe
23980 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  d");.}.#endif../
23990 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 4b 65  *.** Return a Ke
239a0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
239b0 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72 69  that is appropri
239c0 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ate for the give
239d0 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54  n Index..**.** T
239e0 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
239f0 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 4b   invoke sqlite3K
23a00 65 79 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f 6e  eyInfoUnref() on
23a10 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62   the returned ob
23a20 6a 65 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74 20  ject.** when it 
23a30 68 61 73 20 66 69 6e 69 73 68 65 64 20 75 73 69  has finished usi
23a40 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  ng it..*/.KeyInf
23a50 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
23a60 6f 4f 66 49 6e 64 65 78 28 50 61 72 73 65 20 2a  oOfIndex(Parse *
23a70 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
23a80 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Idx){.  int i;. 
23a90 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78   int nCol = pIdx
23aa0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74  ->nColumn;.  int
23ab0 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e 4b   nKey = pIdx->nK
23ac0 65 79 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f  eyCol;.  KeyInfo
23ad0 20 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20 70 50   *pKey;.  if( pP
23ae0 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
23af0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 64  urn 0;.  if( pId
23b00 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29  x->uniqNotNull )
23b10 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  {.    pKey = sql
23b20 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
23b30 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65  (pParse->db, nKe
23b40 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20  y, nCol-nKey);. 
23b50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79   }else{.    pKey
23b60 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
23b70 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  oAlloc(pParse->d
23b80 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d  b, nCol, 0);.  }
23b90 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
23ba0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
23bb0 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
23bc0 61 62 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20 20  able(pKey) );.  
23bd0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
23be0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; i++){.      c
23bf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
23c00 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
23c10 69 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e  i];.      pKey->
23c20 61 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c  aColl[i] = zColl
23c30 3d 3d 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  ==sqlite3StrBINA
23c40 52 59 20 3f 20 30 20 3a 0a 20 20 20 20 20 20 20  RY ? 0 :.       
23c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c60 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
23c70 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
23c80 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  oll);.      pKey
23c90 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
23ca0 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  = pIdx->aSortOrd
23cb0 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  er[i];.    }.   
23cc0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
23cd0 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
23ce0 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
23cf0 4b 65 79 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  Key);.      pKey
23d00 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
23d10 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d    return pKey;.}
23d20 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
23d30 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a  _OMIT_CTE./* .**
23d40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
23d50 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 70 65   invoked once pe
23d60 72 20 43 54 45 20 62 79 20 74 68 65 20 70 61 72  r CTE by the par
23d70 73 65 72 20 77 68 69 6c 65 20 70 61 72 73 69 6e  ser while parsin
23d80 67 20 61 20 0a 2a 2a 20 57 49 54 48 20 63 6c 61  g a .** WITH cla
23d90 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a 73  use. .*/.With *s
23da0 71 6c 69 74 65 33 57 69 74 68 41 64 64 28 0a 20  qlite3WithAdd(. 
23db0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
23dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
23dd0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
23de0 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20   With *pWith,   
23df0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 69 73           /* Exis
23e00 74 69 6e 67 20 57 49 54 48 20 63 6c 61 75 73 65  ting WITH clause
23e10 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  , or NULL */.  T
23e20 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
23e30 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
23e40 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62  f the common-tab
23e50 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
23e60 20 2a 70 41 72 67 6c 69 73 74 2c 20 20 20 20 20   *pArglist,     
23e70 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c 75  /* Optional colu
23e80 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20 66 6f 72  mn name list for
23e90 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
23ea0 53 65 6c 65 63 74 20 2a 70 51 75 65 72 79 20 20  Select *pQuery  
23eb0 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79          /* Query
23ec0 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c   used to initial
23ed0 69 7a 65 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  ize the table */
23ee0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
23ef0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
23f00 20 20 57 69 74 68 20 2a 70 4e 65 77 3b 0a 20 20    With *pNew;.  
23f10 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20  char *zName;..  
23f20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
23f30 65 20 43 54 45 20 6e 61 6d 65 20 69 73 20 75 6e  e CTE name is un
23f40 69 71 75 65 20 77 69 74 68 69 6e 20 74 68 69 73  ique within this
23f50 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 49 66   WITH clause. If
23f60 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72 65  .  ** not, store
23f70 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65   an error in the
23f80 20 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65   Parse structure
23f90 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  . */.  zName = s
23fa0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
23fb0 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
23fc0 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
23fd0 61 6d 65 20 26 26 20 70 57 69 74 68 20 29 7b 0a  ame && pWith ){.
23fe0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
23ff0 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d  or(i=0; i<pWith-
24000 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
24010 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
24020 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69  rICmp(zName, pWi
24030 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  th->a[i].zName)=
24040 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
24050 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
24060 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65  arse, "duplicate
24070 20 57 49 54 48 20 74 61 62 6c 65 20 6e 61 6d 65   WITH table name
24080 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  : %s", zName);. 
24090 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
240a0 0a 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b  ..  if( pWith ){
240b0 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
240c0 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 20   sizeof(*pWith) 
240d0 2b 20 28 73 69 7a 65 6f 66 28 70 57 69 74 68 2d  + (sizeof(pWith-
240e0 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e  >a[1]) * pWith->
240f0 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e 65 77 20  nCte);.    pNew 
24100 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
24110 6f 63 28 64 62 2c 20 70 57 69 74 68 2c 20 6e 42  oc(db, pWith, nB
24120 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
24130 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
24140 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
24150 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29  , sizeof(*pWith)
24160 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
24170 20 28 70 4e 65 77 21 3d 30 20 26 26 20 7a 4e 61   (pNew!=0 && zNa
24180 6d 65 21 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61  me!=0) || db->ma
24190 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
241a0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
241b0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
241c0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
241d0 74 65 28 64 62 2c 20 70 41 72 67 6c 69 73 74 29  te(db, pArglist)
241e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
241f0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 51  ectDelete(db, pQ
24200 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
24210 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
24220 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  me);.    pNew = 
24230 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pWith;.  }else{.
24240 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
24250 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63 74 20  ->nCte].pSelect 
24260 3d 20 70 51 75 65 72 79 3b 0a 20 20 20 20 70 4e  = pQuery;.    pN
24270 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65  ew->a[pNew->nCte
24280 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67 6c 69  ].pCols = pArgli
24290 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  st;.    pNew->a[
242a0 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d  pNew->nCte].zNam
242b0 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 70  e = zName;.    p
242c0 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74  New->a[pNew->nCt
242d0 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a  e].zCteErr = 0;.
242e0 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b      pNew->nCte++
242f0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
24300 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  pNew;.}../*.** F
24310 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ree the contents
24320 20 6f 66 20 74 68 65 20 57 69 74 68 20 6f 62 6a   of the With obj
24330 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
24340 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
24350 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
24360 65 33 57 69 74 68 44 65 6c 65 74 65 28 73 71 6c  e3WithDelete(sql
24370 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a  ite3 *db, With *
24380 70 57 69 74 68 29 7b 0a 20 20 69 66 28 20 70 57  pWith){.  if( pW
24390 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ith ){.    int i
243a0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
243b0 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b  <pWith->nCte; i+
243c0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
243d0 20 43 74 65 20 2a 70 43 74 65 20 3d 20 26 70 57   Cte *pCte = &pW
243e0 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  ith->a[i];.     
243f0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
24400 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d  Delete(db, pCte-
24410 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73  >pCols);.      s
24420 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
24430 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65  te(db, pCte->pSe
24440 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  lect);.      sql
24450 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
24460 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
24470 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
24480 46 72 65 65 28 64 62 2c 20 70 57 69 74 68 29 3b  Free(db, pWith);
24490 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
244a0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
244b0 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a        _OMIT_CTE) */.