/ Hex Artifact Content
Login

Artifact 88a8cdc11d1c081ed565aa3e795bdf9160f4556463b4c4555e9860b59dd80340:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c40: 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1c50: 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44 69  vel==0 );  /* Di
1c60: 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65 6e  sables and re-en
1c70: 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a 20  ables match */. 
1c80: 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d 20     /* A minimum 
1c90: 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20 69 73  of one cursor is
1ca0: 20 72 65 71 75 69 72 65 64 20 69 66 20 61 75 74   required if aut
1cb0: 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75 73  oincrement is us
1cc0: 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20 74 69  ed.    *  See ti
1cd0: 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63 31 66  cket [a696379c1f
1ce0: 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69 66  08866] */.    if
1cf0: 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 21  ( pParse->pAinc!
1d00: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54  =0 && pParse->nT
1d10: 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d 3e  ab==0 ) pParse->
1d20: 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 73 71  nTab = 1;.    sq
1d30: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
1d40: 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b 0a 20  dy(v, pParse);. 
1d50: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
1d60: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
1d70: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65  else{.    pParse
1d80: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
1d90: 52 4f 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ROR;.  }.}../*.*
1da0: 2a 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72  * Run the parser
1db0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
1dc0: 74 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20  tor recursively 
1dd0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65  in order to gene
1de0: 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72  rate.** code for
1df0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
1e00: 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68  nt given onto th
1e10: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61  e end of the pPa
1e20: 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63  rse context.** c
1e30: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
1e40: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68  onstruction.  Wh
1e50: 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73  en the parser is
1e60: 20 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79   run recursively
1e70: 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68  .** this way, th
1e80: 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20  e final OP_Halt 
1e90: 69 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20  is not appended 
1ea0: 61 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61  and other initia
1eb0: 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  lization.** and 
1ec0: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65  finalization ste
1ed0: 70 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62  ps are omitted b
1ee0: 65 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65  ecause those are
1ef0: 20 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65   handling by the
1f00: 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61  .** outermost pa
1f10: 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20  rser..**.** Not 
1f20: 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65  everything is ne
1f30: 73 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61  stable.  This fa
1f40: 63 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e  cility is design
1f50: 65 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20  ed to permit.** 
1f60: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20  INSERT, UPDATE, 
1f70: 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61  and DELETE opera
1f80: 74 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51  tions against SQ
1f90: 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73  LITE_MASTER.  Us
1fa0: 65 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75  e.** care if you
1fb0: 20 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74   decide to try t
1fc0: 6f 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69  o use this routi
1fd0: 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ne for some othe
1fe0: 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76  r purposes..*/.v
1ff0: 6f 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65  oid sqlite3Neste
2000: 64 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50  dParse(Parse *pP
2010: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
2020: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
2030: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
2040: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63   char *zSql;.  c
2050: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
2060: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2070: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2080: 63 68 61 72 20 73 61 76 65 42 75 66 5b 50 41 52  char saveBuf[PAR
2090: 53 45 5f 54 41 49 4c 5f 53 5a 5d 3b 0a 0a 20 20  SE_TAIL_SZ];..  
20a0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
20b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
20c0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73  ert( pParse->nes
20d0: 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65  ted<10 );  /* Ne
20e0: 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c  sting should onl
20f0: 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20  y be of limited 
2100: 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74  depth */.  va_st
2110: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
2120: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
2130: 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a  e3VMPrintf(db, z
2140: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
2150: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
2160: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
2170: 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d  return;   /* A m
2180: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
2190: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  failed */.  }.  
21a0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b  pParse->nested++
21b0: 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42  ;.  memcpy(saveB
21c0: 75 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 28 70  uf, PARSE_TAIL(p
21d0: 50 61 72 73 65 29 2c 20 50 41 52 53 45 5f 54 41  Parse), PARSE_TA
21e0: 49 4c 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74  IL_SZ);.  memset
21f0: 28 50 41 52 53 45 5f 54 41 49 4c 28 70 50 61 72  (PARSE_TAIL(pPar
2200: 73 65 29 2c 20 30 2c 20 50 41 52 53 45 5f 54 41  se), 0, PARSE_TA
2210: 49 4c 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  IL_SZ);.  sqlite
2220: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
2230: 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73  e, zSql, &zErrMs
2240: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
2250: 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
2260: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2270: 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d  e(db, zSql);.  m
2280: 65 6d 63 70 79 28 50 41 52 53 45 5f 54 41 49 4c  emcpy(PARSE_TAIL
2290: 28 70 50 61 72 73 65 29 2c 20 73 61 76 65 42 75  (pParse), saveBu
22a0: 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a  f, PARSE_TAIL_SZ
22b0: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73  );.  pParse->nes
22c0: 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51  ted--;.}..#if SQ
22d0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
22e0: 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52  TICATION./*.** R
22f0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a 54  eturn TRUE if zT
2300: 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65  able is the name
2310: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 74   of the system t
2320: 61 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73  able that stores
2330: 20 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20   the.** list of 
2340: 75 73 65 72 73 20 61 6e 64 20 74 68 65 69 72 20  users and their 
2350: 61 63 63 65 73 73 20 63 72 65 64 65 6e 74 69 61  access credentia
2360: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
2370: 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28  e3UserAuthTable(
2380: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2390: 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  le){.  return sq
23a0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54  lite3_stricmp(zT
23b0: 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75 73  able, "sqlite_us
23c0: 65 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  er")==0;.}.#endi
23d0: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  f../*.** Locate 
23e0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
23f0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
2400: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
2410: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
2420: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
2430: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
2440: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
2450: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
2460: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2470: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
2480: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
2490: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
24a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
24b0: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
24c0: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
24d0: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
24e0: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
24f0: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
2500: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
2510: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
2520: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
2530: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
2540: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
2550: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
2560: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2570: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
2580: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
2590: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
25a0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
25b0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
25c0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
25d0: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
25e0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
25f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
2600: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2610: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
2620: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
2630: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
2640: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  ;..  /* All mute
2650: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2660: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2670: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2680: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
2690: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
26a0: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
26b0: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
26c0: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69 66  texes(db) );.#if
26d0: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
26e0: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f 2a  HENTICATION.  /*
26f0: 20 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e 20   Only the admin 
2700: 75 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20  user is allowed 
2710: 74 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  to know that the
2720: 20 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62   sqlite_user tab
2730: 6c 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20 2a  le.  ** exists *
2740: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68  /.  if( db->auth
2750: 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48  .authLevel<UAUTH
2760: 5f 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74 65  _Admin && sqlite
2770: 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 7a  3UserAuthTable(z
2780: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
2790: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
27a0: 6e 64 69 66 0a 20 20 77 68 69 6c 65 28 31 29 7b  ndif.  while(1){
27b0: 0a 20 20 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  .    for(i=OMIT_
27c0: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
27d0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
27e0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
27f0: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
2800: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
2810: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69 66  MAIN */.      if
2820: 28 20 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 7c  ( zDatabase==0 |
2830: 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  | sqlite3StrICmp
2840: 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e  (zDatabase, db->
2850: 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29  aDb[j].zDbSName)
2860: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
2870: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
2880: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
2890: 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  , j, 0) );.     
28a0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
28b0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b  shFind(&db->aDb[
28c0: 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  j].pSchema->tblH
28d0: 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ash, zName);.   
28e0: 20 20 20 20 20 69 66 28 20 70 20 29 20 72 65 74       if( p ) ret
28f0: 75 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20  urn p;.      }. 
2900: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4e 6f 74 20     }.    /* Not 
2910: 66 6f 75 6e 64 2e 20 20 49 66 20 74 68 65 20 6e  found.  If the n
2920: 61 6d 65 20 77 65 20 77 65 72 65 20 6c 6f 6f 6b  ame we were look
2930: 69 6e 67 20 66 6f 72 20 77 61 73 20 74 65 6d 70  ing for was temp
2940: 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20  .sqlite_master. 
2950: 20 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67     ** then chang
2960: 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 73 71  e the name to sq
2970: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
2980: 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
2990: 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
29a0: 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c  e3StrICmp(zName,
29b0: 20 4d 41 53 54 45 52 5f 4e 41 4d 45 29 21 3d 30   MASTER_NAME)!=0
29c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
29d0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
29e0: 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d  p(zDatabase, db-
29f0: 3e 61 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[1].zDbSName
2a00: 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
2a10: 20 20 7a 4e 61 6d 65 20 3d 20 54 45 4d 50 5f 4d    zName = TEMP_M
2a20: 41 53 54 45 52 5f 4e 41 4d 45 3b 0a 20 20 7d 0a  ASTER_NAME;.  }.
2a30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2a40: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
2a50: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
2a60: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
2a70: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
2a80: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
2a90: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
2aa0: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
2ab0: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
2ac0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
2ad0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
2ae0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
2af0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
2b00: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c  f not found.  Al
2b10: 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65  so leave an.** e
2b20: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
2b30: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
2b40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
2b50: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
2b60: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73  is routine and s
2b70: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2b80: 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
2b90: 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73  * routine leaves
2ba0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2bb0: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
2bc0: 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71  rMsg where.** sq
2bd0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29  lite3FindTable()
2be0: 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61   does not..*/.Ta
2bf0: 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  ble *sqlite3Loca
2c00: 74 65 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  teTable(.  Parse
2c10: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2c20: 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20    /* context in 
2c30: 77 68 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20  which to report 
2c40: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 33 32 20  errors */.  u32 
2c50: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2c60: 20 20 20 2f 2a 20 4c 4f 43 41 54 45 5f 56 49 45     /* LOCATE_VIE
2c70: 57 20 6f 72 20 4c 4f 43 41 54 45 5f 4e 4f 45 52  W or LOCATE_NOER
2c80: 52 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  R */.  const cha
2c90: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  r *zName,     /*
2ca0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
2cb0: 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  le we are lookin
2cc0: 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  g for */.  const
2cd0: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20   char *zDbase   
2ce0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2cf0: 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68   database.  Migh
2d00: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
2d10: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f    Table *p;..  /
2d20: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
2d30: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
2d40: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2d50: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
2d60: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
2d70: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
2d80: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
2d90: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
2da0: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
2db0: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
2dc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2dd0: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
2de0: 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
2df0: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  e->db, zName, zD
2e00: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
2e10: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
2e20: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 66 6c 61 67  har *zMsg = flag
2e30: 73 20 26 20 4c 4f 43 41 54 45 5f 56 49 45 57 20  s & LOCATE_VIEW 
2e40: 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22  ? "no such view"
2e50: 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c   : "no such tabl
2e60: 65 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e";.#ifndef SQLI
2e70: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2e80: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 73 71 6c  ABLE.    if( sql
2e90: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 70  ite3FindDbName(p
2ea0: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 44 62 61 73  Parse->db, zDbas
2eb0: 65 29 3c 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  e)<1 ){.      /*
2ec0: 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 74 68 65   If zName is the
2ed0: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
2ee0: 20 61 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   a table in the 
2ef0: 73 63 68 65 6d 61 20 63 72 65 61 74 65 64 20 75  schema created u
2f00: 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 43 52  sing.      ** CR
2f10: 45 41 54 45 2c 20 74 68 65 6e 20 63 68 65 63 6b  EATE, then check
2f20: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 69 73   to see if it is
2f30: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
2f40: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
2f50: 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20  at.      ** can 
2f60: 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20  be an eponymous 
2f70: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 2a  virtual table. *
2f80: 2f 0a 20 20 20 20 20 20 4d 6f 64 75 6c 65 20 2a  /.      Module *
2f90: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29  pMod = (Module*)
2fa0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2fb0: 26 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4d 6f  &pParse->db->aMo
2fc0: 64 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  dule, zName);.  
2fd0: 20 20 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20      if( pMod==0 
2fe0: 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  && sqlite3_strni
2ff0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67  cmp(zName, "prag
3000: 6d 61 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20  ma_", 7)==0 ){. 
3010: 20 20 20 20 20 20 20 70 4d 6f 64 20 3d 20 73 71         pMod = sq
3020: 6c 69 74 65 33 50 72 61 67 6d 61 56 74 61 62 52  lite3PragmaVtabR
3030: 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2d 3e  egister(pParse->
3040: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
3050: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4d    }.      if( pM
3060: 6f 64 20 26 26 20 73 71 6c 69 74 65 33 56 74 61  od && sqlite3Vta
3070: 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 49  bEponymousTableI
3080: 6e 69 74 28 70 50 61 72 73 65 2c 20 70 4d 6f 64  nit(pParse, pMod
3090: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
30a0: 75 72 6e 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61  urn pMod->pEpoTa
30b0: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
30c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
30d0: 28 66 6c 61 67 73 20 26 20 4c 4f 43 41 54 45 5f  (flags & LOCATE_
30e0: 4e 4f 45 52 52 29 3d 3d 30 20 29 7b 0a 20 20 20  NOERR)==0 ){.   
30f0: 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b     if( zDbase ){
3100: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3110: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3120: 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d   "%s: %s.%s", zM
3130: 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d  sg, zDbase, zNam
3140: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
3150: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3160: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3170: 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c   "%s: %s", zMsg,
3180: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
3190: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
31a0: 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
31b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
31c0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
31d0: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
31e0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 2a   identified by *
31f0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
3200: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
3210: 64 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  d sqlite3LocateT
3220: 61 62 6c 65 28 29 2e 20 54 68 65 20 64 69 66 66  able(). The diff
3230: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a  erence between.*
3240: 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  * sqlite3LocateT
3250: 61 62 6c 65 28 29 20 61 6e 64 20 74 68 69 73 20  able() and this 
3260: 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 61 74  function is that
3270: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
3280: 65 73 74 72 69 63 74 73 0a 2a 2a 20 74 68 65 20  estricts.** the 
3290: 73 65 61 72 63 68 20 74 6f 20 73 63 68 65 6d 61  search to schema
32a0: 20 28 70 2d 3e 70 53 63 68 65 6d 61 29 20 69 66   (p->pSchema) if
32b0: 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e   it is not NULL.
32c0: 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79 20   p->pSchema may 
32d0: 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  be.** non-NULL i
32e0: 66 20 69 74 20 69 73 20 70 61 72 74 20 6f 66 20  f it is part of 
32f0: 61 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65  a view or trigge
3300: 72 20 70 72 6f 67 72 61 6d 20 64 65 66 69 6e 69  r program defini
3310: 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c  tion. See.** sql
3320: 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 29  ite3FixSrcList()
3330: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
3340: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c  .Table *sqlite3L
3350: 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 0a  ocateTableItem(.
3360: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3370: 20 0a 20 20 75 33 32 20 66 6c 61 67 73 2c 0a 20   .  u32 flags,. 
3380: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
3390: 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e  item *p.){.  con
33a0: 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  st char *zDb;.  
33b0: 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65  assert( p->pSche
33c0: 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74  ma==0 || p->zDat
33d0: 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66  abase==0 );.  if
33e0: 28 20 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  ( p->pSchema ){.
33f0: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
3400: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
3410: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
3420: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
3430: 7a 44 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  zDb = pParse->db
3440: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
3450: 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ame;.  }else{.  
3460: 20 20 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61    zDb = p->zData
3470: 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  base;.  }.  retu
3480: 72 6e 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  rn sqlite3Locate
3490: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 66 6c  Table(pParse, fl
34a0: 61 67 73 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a  ags, p->zName, z
34b0: 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  Db);.}../*.** Lo
34c0: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
34d0: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
34e0: 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20  t describes .** 
34f0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
3500: 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  ex given the nam
3510: 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a  e of that index.
3520: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20  ** and the name 
3530: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
3540: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
3550: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75  e index..** Retu
3560: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
3570: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
3580: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
3590: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
35a0: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
35b0: 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74  e.** table and t
35c0: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
35d0: 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72  g index is retur
35e0: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
35f0: 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63  ng.** for duplic
3600: 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  ate index names 
3610: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
3620: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a  earch order is.*
3630: 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  * TEMP first, th
3640: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
3650: 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  y auxiliary data
3660: 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75  bases added.** u
3670: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
3680: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65  command..*/.Inde
3690: 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  x *sqlite3FindIn
36a0: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
36b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
36c0: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
36d0: 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  zDb){.  Index *p
36e0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
36f0: 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20   /* All mutexes 
3700: 61 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  are required for
3710: 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20   schema access. 
3720: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f   Make sure we ho
3730: 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73  ld them. */.  as
3740: 73 65 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20  sert( zDb!=0 || 
3750: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
3760: 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
3770: 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  );.  for(i=OMIT_
3780: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
3790: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  b; i++){.    int
37a0: 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31   j = (i<2) ? i^1
37b0: 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68   : i;  /* Search
37c0: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49   TEMP before MAI
37d0: 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20  N */.    Schema 
37e0: 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  *pSchema = db->a
37f0: 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  Db[j].pSchema;. 
3800: 20 20 20 61 73 73 65 72 74 28 20 70 53 63 68 65     assert( pSche
3810: 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44  ma );.    if( zD
3820: 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  b && sqlite3StrI
3830: 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62  Cmp(zDb, db->aDb
3840: 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29 20 29 20  [j].zDbSName) ) 
3850: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
3860: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
3870: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
3880: 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20   j, 0) );.    p 
3890: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
38a0: 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  d(&pSchema->idxH
38b0: 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ash, zName);.   
38c0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
38d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
38e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d  }../*.** Reclaim
38f0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64   the memory used
3900: 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a   by an index.*/.
3910: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
3920: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
3930: 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 23 69  b, Index *p){.#i
3940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3950: 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69  T_ANALYZE.  sqli
3960: 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61  te3DeleteIndexSa
3970: 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a 23 65  mples(db, p);.#e
3980: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78  ndif.  sqlite3Ex
3990: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
39a0: 70 50 61 72 74 49 64 78 57 68 65 72 65 29 3b 0a  pPartIdxWhere);.
39b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
39c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 61  tDelete(db, p->a
39d0: 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  ColExpr);.  sqli
39e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
39f0: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66 28  >zColAff);.  if(
3a00: 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20 29 20   p->isResized ) 
3a10: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3a20: 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e 61 7a 43  , (void *)p->azC
3a30: 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  oll);.#ifdef SQL
3a40: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
3a50: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 71 6c 69  _OR_STAT4.  sqli
3a60: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f  te3_free(p->aiRo
3a70: 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  wEst);.#endif.  
3a80: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3a90: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  , p);.}../*.** F
3aa0: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c  or the index cal
3ab0: 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69  led zIdxName whi
3ac0: 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  ch is found in t
3ad0: 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c  he database iDb,
3ae0: 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20  .** unlike that 
3af0: 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54  index from its T
3b00: 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65  able then remove
3b10: 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a   the index from.
3b20: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  ** the index has
3b30: 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65  h table and free
3b40: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75   all memory stru
3b50: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
3b60: 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  d.** with the in
3b70: 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  dex..*/.void sql
3b80: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
3b90: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  eteIndex(sqlite3
3ba0: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
3bb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e  onst char *zIdxN
3bc0: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
3bd0: 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20 2a 70  Index;.  Hash *p
3be0: 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28  Hash;..  assert(
3bf0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3c00: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3c10: 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d   0) );.  pHash =
3c20: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70   &db->aDb[iDb].p
3c30: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b  Schema->idxHash;
3c40: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
3c50: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  te3HashInsert(pH
3c60: 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30  ash, zIdxName, 0
3c70: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
3c80: 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69  pIndex) ){.    i
3c90: 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  f( pIndex->pTabl
3ca0: 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65  e->pIndex==pInde
3cb0: 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  x ){.      pInde
3cc0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
3cd0: 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  x = pIndex->pNex
3ce0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
3cf0: 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
3d00: 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61      /* Justifica
3d10: 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29  tion of ALWAYS()
3d20: 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d 75 73  ;  The index mus
3d30: 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69 73 74  t be on the list
3d40: 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64   of.      ** ind
3d50: 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ices. */.      p
3d60: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
3d70: 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  e->pIndex;.     
3d80: 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
3d90: 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70  ) && p->pNext!=p
3da0: 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e  Index ){ p = p->
3db0: 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20 20 69  pNext; }.      i
3dc0: 66 28 20 41 4c 57 41 59 53 28 70 20 26 26 20 70  f( ALWAYS(p && p
3dd0: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29  ->pNext==pIndex)
3de0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   ){.        p->p
3df0: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
3e00: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
3e10: 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65    }.    freeInde
3e20: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
3e30: 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c   }.  db->flags |
3e40: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
3e50: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
3e60: 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20 74 68   Look through th
3e70: 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20 64  e list of open d
3e80: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 69 6e  atabase files in
3e90: 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64 20 69   db->aDb[] and i
3ea0: 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20 62 65  f.** any have be
3eb0: 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d 6f 76  en closed, remov
3ec0: 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20  e them from the 
3ed0: 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63 61 74  list.  Reallocat
3ee0: 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61 44 62  e the.** db->aDb
3ef0: 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  [] structure to 
3f00: 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65 2c 20  a smaller size, 
3f10: 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a  if possible..**.
3f20: 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68 65 20  ** Entry 0 (the 
3f30: 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73 65 29  "main" database)
3f40: 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28 74 68   and entry 1 (th
3f50: 65 20 22 74 65 6d 70 22 20 64 61 74 61 62 61 73  e "temp" databas
3f60: 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65 72 20  e).** are never 
3f70: 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 62  candidates for b
3f80: 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64 2e 0a  eing collapsed..
3f90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
3fa0: 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41  ollapseDatabaseA
3fb0: 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62  rray(sqlite3 *db
3fc0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
3fd0: 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62   for(i=j=2; i<db
3fe0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
3ff0: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
4000: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
4010: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
4020: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
4030: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
4040: 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 3b 0a 20 20  b->zDbSName);.  
4050: 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d      pDb->zDbSNam
4060: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  e = 0;.      con
4070: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
4080: 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20   if( j<i ){.    
4090: 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64    db->aDb[j] = d
40a0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d  b->aDb[i];.    }
40b0: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
40c0: 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69  db->nDb = j;.  i
40d0: 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26  f( db->nDb<=2 &&
40e0: 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44   db->aDb!=db->aD
40f0: 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d  bStatic ){.    m
4100: 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61  emcpy(db->aDbSta
4110: 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a  tic, db->aDb, 2*
4120: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30  sizeof(db->aDb[0
4130: 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ]));.    sqlite3
4140: 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61  DbFree(db, db->a
4150: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
4160: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
4170: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
4180: 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20  eset the schema 
4190: 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
41a0: 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e 20 20   at index iDb.  
41b0: 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65 0a 2a  Also reset the.*
41c0: 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 0a 2a  * TEMP schema..*
41d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
41e0: 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c  setOneSchema(sql
41f0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
4200: 62 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20  b){.  Db *pDb;. 
4210: 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d   assert( iDb<db-
4220: 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  >nDb );..  /* Ca
4230: 73 65 20 31 3a 20 20 52 65 73 65 74 20 74 68 65  se 1:  Reset the
4240: 20 73 69 6e 67 6c 65 20 73 63 68 65 6d 61 20 69   single schema i
4250: 64 65 6e 74 69 66 69 65 64 20 62 79 20 69 44 62  dentified by iDb
4260: 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d   */.  pDb = &db-
4270: 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 61 73 73  >aDb[iDb];.  ass
4280: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
4290: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
42a0: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 61 73 73  iDb, 0) );.  ass
42b0: 65 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d  ert( pDb->pSchem
42c0: 61 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  a!=0 );.  sqlite
42d0: 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62  3SchemaClear(pDb
42e0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 20 20 2f  ->pSchema);..  /
42f0: 2a 20 49 66 20 61 6e 79 20 64 61 74 61 62 61 73  * If any databas
4300: 65 20 6f 74 68 65 72 20 74 68 61 6e 20 54 45 4d  e other than TEM
4310: 50 20 69 73 20 72 65 73 65 74 2c 20 74 68 65 6e  P is reset, then
4320: 20 61 6c 73 6f 20 72 65 73 65 74 20 54 45 4d 50   also reset TEMP
4330: 0a 20 20 2a 2a 20 73 69 6e 63 65 20 54 45 4d 50  .  ** since TEMP
4340: 20 6d 69 67 68 74 20 62 65 20 68 6f 6c 64 69 6e   might be holdin
4350: 67 20 74 72 69 67 67 65 72 73 20 74 68 61 74 20  g triggers that 
4360: 72 65 66 65 72 65 6e 63 65 20 74 61 62 6c 65 73  reference tables
4370: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68   in the.  ** oth
4380: 65 72 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  er database..  *
4390: 2f 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20 29  /.  if( iDb!=1 )
43a0: 7b 0a 20 20 20 20 70 44 62 20 3d 20 26 64 62 2d  {.    pDb = &db-
43b0: 3e 61 44 62 5b 31 5d 3b 0a 20 20 20 20 61 73 73  >aDb[1];.    ass
43c0: 65 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d  ert( pDb->pSchem
43d0: 61 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  a!=0 );.    sqli
43e0: 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70  te3SchemaClear(p
43f0: 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Db->pSchema);.  
4400: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }.  return;.}../
4410: 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73  *.** Erase all s
4420: 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f  chema informatio
4430: 6e 20 66 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63  n from all attac
4440: 68 65 64 20 64 61 74 61 62 61 73 65 73 20 28 69  hed databases (i
4450: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69  ncluding.** "mai
4460: 6e 22 20 61 6e 64 20 22 74 65 6d 70 22 29 20 66  n" and "temp") f
4470: 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
4480: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
4490: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
44a0: 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f  ResetAllSchemasO
44b0: 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69  fConnection(sqli
44c0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
44d0: 69 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  i;.  sqlite3Btre
44e0: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
44f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
4500: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  nDb; i++){.    D
4510: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
4520: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
4530: 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  b->pSchema ){.  
4540: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
4550: 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68  aClear(pDb->pSch
4560: 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ema);.    }.  }.
4570: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
4580: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
4590: 6e 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 56  nges;.  sqlite3V
45a0: 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62  tabUnlockList(db
45b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
45c0: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20  eLeaveAll(db);. 
45d0: 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65   sqlite3Collapse
45e0: 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62  DatabaseArray(db
45f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
4600: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4610: 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74  ed when a commit
4620: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
4630: 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
4640: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
4650: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62  lite3 *db){.  db
4660: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
4670: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
4680: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
4690: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
46a0: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ed for the colum
46b0: 6e 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62  n names of a tab
46c0: 6c 65 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a  le or view (the.
46d0: 2a 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20  ** Table.aCol[] 
46e0: 61 72 72 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20  array)..*/.void 
46f0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c  sqlite3DeleteCol
4700: 75 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65 33  umnNames(sqlite3
4710: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
4720: 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ble){.  int i;. 
4730: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
4740: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21   assert( pTable!
4750: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f  =0 );.  if( (pCo
4760: 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  l = pTable->aCol
4770: 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  )!=0 ){.    for(
4780: 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  i=0; i<pTable->n
4790: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
47a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
47b0: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
47c0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  >zName);.      s
47d0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
47e0: 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74  (db, pCol->pDflt
47f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4800: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
4810: 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  >zColl);.    }. 
4820: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4830: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f  (db, pTable->aCo
4840: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
4850: 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f   Remove the memo
4860: 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ry data structur
4870: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
4880: 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  th the given.** 
4890: 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67  Table.  No chang
48a0: 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64  es are made to d
48b0: 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74  isk by this rout
48c0: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ine..**.** This 
48d0: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c  routine just del
48e0: 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74  etes the data st
48f0: 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65  ructure.  It doe
4900: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20  s not unlink.** 
4910: 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73  the table data s
4920: 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
4930: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42  e hash table.  B
4940: 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72  ut it does destr
4950: 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72  oy.** memory str
4960: 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69  uctures of the i
4970: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
4980: 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74  gn keys associat
4990: 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20  ed with .** the 
49a0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
49b0: 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 69 73   db parameter is
49c0: 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69   optional.  It i
49d0: 73 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20  s needed if the 
49e0: 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a  Table object .**
49f0: 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73   contains lookas
4a00: 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61  ide memory.  (Ta
4a10: 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 74  ble objects in t
4a20: 68 65 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74  he schema do not
4a30: 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64   use.** lookasid
4a40: 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f  e memory, but so
4a50: 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 54 61 62  me ephemeral Tab
4a60: 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20  le objects do.) 
4a70: 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20 70 61   Or the.** db pa
4a80: 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20 75  rameter can be u
4a90: 73 65 64 20 77 69 74 68 20 64 62 2d 3e 70 6e 42  sed with db->pnB
4aa0: 79 74 65 73 46 72 65 65 64 20 74 6f 20 6d 65 61  ytesFreed to mea
4ab0: 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a  sure the memory.
4ac0: 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 54  ** used by the T
4ad0: 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  able object..*/.
4ae0: 73 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49  static void SQLI
4af0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 64 65 6c 65  TE_NOINLINE dele
4b00: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
4b10: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
4b20: 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  le){.  Index *pI
4b30: 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  ndex, *pNext;.  
4b40: 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 6e 4c  TESTONLY( int nL
4b50: 6f 6f 6b 61 73 69 64 65 3b 20 29 20 2f 2a 20 55  ookaside; ) /* U
4b60: 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 6c 6f  sed to verify lo
4b70: 6f 6b 61 73 69 64 65 20 6e 6f 74 20 75 73 65 64  okaside not used
4b80: 20 66 6f 72 20 73 63 68 65 6d 61 20 2a 2f 0a 0a   for schema */..
4b90: 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
4ba0: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  number of outsta
4bb0: 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20  nding lookaside 
4bc0: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20 73  allocations in s
4bd0: 63 68 65 6d 61 20 54 61 62 6c 65 73 0a 20 20 2a  chema Tables.  *
4be0: 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  * prior to doing
4bf0: 20 61 6e 79 20 66 72 65 65 28 29 20 6f 70 65 72   any free() oper
4c00: 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20 73  ations.  Since s
4c10: 63 68 65 6d 61 20 54 61 62 6c 65 73 20 64 6f 20  chema Tables do 
4c20: 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f  not use.  ** loo
4c30: 6b 61 73 69 64 65 2c 20 74 68 69 73 20 6e 75 6d  kaside, this num
4c40: 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63  ber should not c
4c50: 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 54 45 53 54  hange. */.  TEST
4c60: 4f 4e 4c 59 28 20 6e 4c 6f 6f 6b 61 73 69 64 65  ONLY( nLookaside
4c70: 20 3d 20 28 64 62 20 26 26 20 28 70 54 61 62 6c   = (db && (pTabl
4c80: 65 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  e->tabFlags & TF
4c90: 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 29 20  _Ephemeral)==0) 
4ca0: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
4cb0: 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6c             db->l
4cc0: 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 3a 20  ookaside.nOut : 
4cd0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  0 );..  /* Delet
4ce0: 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73  e all indices as
4cf0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
4d00: 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66  is table. */.  f
4d10: 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62  or(pIndex = pTab
4d20: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  le->pIndex; pInd
4d30: 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74  ex; pIndex=pNext
4d40: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
4d50: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
4d60: 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
4d70: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c  ->pSchema==pTabl
4d80: 65 2d 3e 70 53 63 68 65 6d 61 0a 20 20 20 20 20  e->pSchema.     
4d90: 20 20 20 20 7c 7c 20 28 49 73 56 69 72 74 75 61      || (IsVirtua
4da0: 6c 28 70 54 61 62 6c 65 29 20 26 26 20 70 49 6e  l(pTable) && pIn
4db0: 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51  dex->idxType!=SQ
4dc0: 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50  LITE_IDXTYPE_APP
4dd0: 44 45 46 29 20 29 3b 0a 20 20 20 20 69 66 28 20  DEF) );.    if( 
4de0: 28 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e  (db==0 || db->pn
4df0: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26  BytesFreed==0) &
4e00: 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  & !IsVirtual(pTa
4e10: 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68  ble) ){.      ch
4e20: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64  ar *zName = pInd
4e30: 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20  ex->zName; .    
4e40: 20 20 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64    TESTONLY ( Ind
4e50: 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c  ex *pOld = ) sql
4e60: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 0a  ite3HashInsert(.
4e70: 20 20 20 20 20 20 20 20 20 26 70 49 6e 64 65 78           &pIndex
4e80: 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
4e90: 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20  sh, zName, 0.   
4ea0: 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
4eb0: 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c  rt( db==0 || sql
4ec0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
4ed0: 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65  eld(db, 0, pInde
4ee0: 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  x->pSchema) );. 
4ef0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c       assert( pOl
4f00: 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c  d==pIndex || pOl
4f10: 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  d==0 );.    }.  
4f20: 20 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20    freeIndex(db, 
4f30: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20  pIndex);.  }..  
4f40: 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 66 6f  /* Delete any fo
4f50: 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74 61 63  reign keys attac
4f60: 68 65 64 20 74 6f 20 74 68 69 73 20 74 61 62 6c  hed to this tabl
4f70: 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46  e. */.  sqlite3F
4f80: 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62  kDelete(db, pTab
4f90: 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  le);..  /* Delet
4fa0: 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
4fb0: 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20  cture itself..  
4fc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  */.  sqlite3Dele
4fd0: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62  teColumnNames(db
4fe0: 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c  , pTable);.  sql
4ff0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5000: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Table->zName);. 
5010: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5020: 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41  b, pTable->zColA
5030: 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ff);.  sqlite3Se
5040: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
5050: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b  Table->pSelect);
5060: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
5070: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  stDelete(db, pTa
5080: 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 69  ble->pCheck);.#i
5090: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
50a0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
50b0: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61   sqlite3VtabClea
50c0: 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 23  r(db, pTable);.#
50d0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44  endif.  sqlite3D
50e0: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
50f0: 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
5100: 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69 64  that no lookasid
5110: 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75 73 65  e memory was use
5120: 64 20 62 79 20 73 63 68 65 6d 61 20 74 61 62 6c  d by schema tabl
5130: 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
5140: 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c 7c  nLookaside==0 ||
5150: 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 64 62 2d   nLookaside==db-
5160: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20  >lookaside.nOut 
5170: 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
5180: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  3DeleteTable(sql
5190: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
51a0: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 2f 2a 20 44  *pTable){.  /* D
51b0: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
51c0: 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65   table until the
51d0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
51e0: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a   reaches zero. *
51f0: 2f 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 20  /.  if( !pTable 
5200: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5210: 28 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42  ((!db || db->pnB
5220: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26  ytesFreed==0) &&
5230: 20 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 54 61 62   (--pTable->nTab
5240: 52 65 66 29 3e 30 29 20 29 20 72 65 74 75 72 6e  Ref)>0) ) return
5250: 3b 0a 20 20 64 65 6c 65 74 65 54 61 62 6c 65 28  ;.  deleteTable(
5260: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a  db, pTable);.}..
5270: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68  ./*.** Unlink th
5280: 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72  e given table fr
5290: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
52a0: 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74  es and the delet
52b0: 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73  e the.** table s
52c0: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c  tructure with al
52d0: 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e  l its indices an
52e0: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a  d foreign keys..
52f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55  */.void sqlite3U
5300: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61  nlinkAndDeleteTa
5310: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
5320: 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20   int iDb, const 
5330: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b  char *zTabName){
5340: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44  .  Table *p;.  D
5350: 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72  b *pDb;..  asser
5360: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
5370: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
5380: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
5390: 20 61 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d   assert( zTabNam
53a0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
53b0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
53c0: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
53d0: 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
53e0: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20   zTabName[0]==0 
53f0: 29 3b 20 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67  );  /* Zero-leng
5400: 74 68 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 61  th table names a
5410: 72 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20  re allowed */.  
5420: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
5430: 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  Db];.  p = sqlit
5440: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44  e3HashInsert(&pD
5450: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
5460: 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 30  ash, zTabName, 0
5470: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  );.  sqlite3Dele
5480: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a  teTable(db, p);.
5490: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
54a0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
54b0: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  ges;.}../*.** Gi
54c0: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74  ven a token, ret
54d0: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
54e0: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  t consists of th
54f0: 65 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a  e text of that.*
5500: 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20  * token.  Space 
5510: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
5520: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
5530: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
5540: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
5550: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
5560: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
5570: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  ** function..**.
5580: 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e  ** Any quotation
5590: 20 6d 61 72 6b 73 20 28 65 78 3a 20 20 22 6e 61   marks (ex:  "na
55a0: 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61  me", 'name', [na
55b0: 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20  me], or `name`) 
55c0: 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64  that.** surround
55d0: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
55e0: 20 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76   token are remov
55f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73  ed..**.** Tokens
5600: 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74 20   are often just 
5610: 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68  pointers into th
5620: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74  e original SQL t
5630: 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72  ext and so.** ar
5640: 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69  e not \000 termi
5650: 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f  nated and are no
5660: 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54  t persistent.  T
5670: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
5680: 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65  ng.** is \000 te
5690: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20  rminated and is 
56a0: 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63  persistent..*/.c
56b0: 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65  har *sqlite3Name
56c0: 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65  FromToken(sqlite
56d0: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
56e0: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
56f0: 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  ame;.  if( pName
5700: 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
5710: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
5720: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d  (db, (char*)pNam
5730: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
5740: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
5750: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  ote(zName);.  }e
5760: 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  lse{.    zName =
5770: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5780: 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zName;.}../*.**
5790: 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65   Open the sqlite
57a0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74  _master table st
57b0: 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65  ored in database
57c0: 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a   number iDb for.
57d0: 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20  ** writing. The 
57e0: 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  table is opened 
57f0: 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a  using cursor 0..
5800: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f  */.void sqlite3O
5810: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50  penMasterTable(P
5820: 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62  arse *p, int iDb
5830: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
5840: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29  qlite3GetVdbe(p)
5850: 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  ;.  sqlite3Table
5860: 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53  Lock(p, iDb, MAS
5870: 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53  TER_ROOT, 1, MAS
5880: 54 45 52 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c  TER_NAME);.  sql
5890: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
58a0: 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  t(v, OP_OpenWrit
58b0: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
58c0: 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66  T, iDb, 5);.  if
58d0: 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a  ( p->nTab==0 ){.
58e0: 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b      p->nTab = 1;
58f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  .  }.}../*.** Pa
5900: 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f  rameter zName po
5910: 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65  ints to a nul-te
5920: 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72 20  rminated buffer 
5930: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
5940: 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61  ame.** of a data
5950: 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  base ("main", "t
5960: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
5970: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
5980: 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  db). This.** fun
5990: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
59a0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
59b0: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
59c0: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a   db->aDb[], or.*
59d0: 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  * -1 if the name
59e0: 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66  d db cannot be f
59f0: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
5a00: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73  ite3FindDbName(s
5a10: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
5a20: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
5a30: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20    int i = -1;   
5a40: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
5a50: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66  e number */.  if
5a60: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44  ( zName ){.    D
5a70: 62 20 2a 70 44 62 3b 0a 20 20 20 20 66 6f 72 28  b *pDb;.    for(
5a80: 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70  i=(db->nDb-1), p
5a90: 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20  Db=&db->aDb[i]; 
5aa0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d  i>=0; i--, pDb--
5ab0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
5ac0: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
5ad0: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a  pDb->zDbSName, z
5ae0: 4e 61 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20  Name) ) break;. 
5af0: 20 20 20 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69       /* "main" i
5b00: 73 20 61 6c 77 61 79 73 20 61 6e 20 61 63 63 65  s always an acce
5b10: 70 74 61 62 6c 65 20 61 6c 69 61 73 20 66 6f 72  ptable alias for
5b20: 20 74 68 65 20 70 72 69 6d 61 72 79 20 64 61 74   the primary dat
5b30: 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 65  abase.      ** e
5b40: 76 65 6e 20 69 66 20 69 74 20 68 61 73 20 62 65  ven if it has be
5b50: 65 6e 20 72 65 6e 61 6d 65 64 20 75 73 69 6e 67  en renamed using
5b60: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
5b70: 5f 4d 41 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a  _MAINDBNAME. */.
5b80: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20 26        if( i==0 &
5b90: 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  & 0==sqlite3_str
5ba0: 69 63 6d 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61  icmp("main", zNa
5bb0: 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  me) ) break;.   
5bc0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5bd0: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  i;.}../*.** The 
5be0: 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e  token *pName con
5bf0: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
5c00: 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69  f a database (ei
5c10: 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a  ther "main" or.*
5c20: 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  * "temp" or the 
5c30: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
5c40: 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f  hed db). This ro
5c50: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
5c60: 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68  e.** index of th
5c70: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
5c80: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
5c90: 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  r -1 if the name
5ca0: 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d db .** does no
5cb0: 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  t exist..*/.int 
5cc0: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71  sqlite3FindDb(sq
5cd0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e  lite3 *db, Token
5ce0: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *pName){.  int 
5cf0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d10: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
5d20: 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ber */.  char *z
5d30: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5d50: 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61   Name we are sea
5d60: 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  rching for */.  
5d70: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
5d80: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
5d90: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73   pName);.  i = s
5da0: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
5db0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73  (db, zName);.  s
5dc0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5dd0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
5de0: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74  n i;.}../* The t
5df0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20  able or view or 
5e00: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20  trigger name is 
5e10: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
5e20: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
5e30: 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20  s.** pName1 and 
5e40: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
5e50: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
5e60: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
5e70: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
5e80: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
5e90: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a  xx.yyy (...);.**
5ea0: 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31   .** Then pName1
5eb0: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
5ec0: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
5ed0: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
5ee0: 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74  hand if.** the t
5ef0: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
5f00: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5f10: 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52  , i.e.:.**.** CR
5f20: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
5f30: 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ..);.**.** Then 
5f40: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
5f50: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
5f60: 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54  2 is ""..**.** T
5f70: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
5f80: 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70   the *ppUnqual p
5f90: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
5fa0: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
5fb0: 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65  ame1 or.** pName
5fc0: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
5fd0: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
5fe0: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
5ff0: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
6000: 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69  database "xxx" i
6010: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
6020: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
6030: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
6040: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
6050: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
6060: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
6070: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
6080: 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20  pName1,      /* 
6090: 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65  The "xxx" in the
60a0: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
60b0: 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f  or "xxx" */.  To
60c0: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
60d0: 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69    /* The "yyy" i
60e0: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
60f0: 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  yyy" */.  Token 
6100: 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a  **pUnqual     /*
6110: 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61   Write the unqua
6120: 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61  lified object na
6130: 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  me here */.){.  
6140: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
6150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
6160: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
6170: 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
6180: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
6190: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73  arse->db;..  ass
61a0: 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 29  ert( pName2!=0 )
61b0: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e  ;.  if( pName2->
61c0: 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  n>0 ){.    if( d
61d0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b  b->init.busy ) {
61e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
61f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6200: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
6210: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
6220: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a   -1;.    }.    *
6230: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32  pUnqual = pName2
6240: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
6250: 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e  te3FindDb(db, pN
6260: 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69  ame1);.    if( i
6270: 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  Db<0 ){.      sq
6280: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6290: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64  arse, "unknown d
62a0: 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61  atabase %T", pNa
62b0: 6d 65 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75  me1);.      retu
62c0: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn -1;.    }.  }
62d0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
62e0: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
62f0: 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75  0 || db->init.bu
6300: 73 79 20 7c 7c 20 28 64 62 2d 3e 66 6c 61 67 73  sy || (db->flags
6310: 20 26 20 53 51 4c 49 54 45 5f 56 61 63 75 75 6d   & SQLITE_Vacuum
6320: 29 21 3d 30 29 3b 0a 20 20 20 20 69 44 62 20 3d  )!=0);.    iDb =
6330: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20   db->init.iDb;. 
6340: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
6350: 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame1;.  }.  retu
6360: 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn iDb;.}../*.**
6370: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
6380: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69   used to check i
6390: 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72 69  f the UTF-8 stri
63a0: 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65  ng zName is a le
63b0: 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69  gal.** unqualifi
63c0: 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65  ed name for a ne
63d0: 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  w schema object 
63e0: 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76  (table, index, v
63f0: 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65  iew or.** trigge
6400: 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72  r). All names ar
6410: 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74  e legal except t
6420: 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e 20  hose that begin 
6430: 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a  with the string.
6440: 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e  ** "sqlite_" (in
6450: 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72   upper, lower or
6460: 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54 68   mixed case). Th
6470: 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  is portion of th
6480: 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  e namespace.** i
6490: 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  s reserved for i
64a0: 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a  nternal use..*/.
64b0: 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
64c0: 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65  ObjectName(Parse
64d0: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
64e0: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
64f0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d  if( !pParse->db-
6500: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50  >init.busy && pP
6510: 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
6520: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70  .          && (p
6530: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
6540: 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53   & SQLITE_WriteS
6550: 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20  chema)==0.      
6560: 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
6570: 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c  3StrNICmp(zName,
6580: 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29   "sqlite_", 7) )
6590: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
65a0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
65b0: 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72  bject name reser
65c0: 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ved for internal
65d0: 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65   use: %s", zName
65e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
65f0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
6600: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6610: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
6620: 75 72 6e 20 74 68 65 20 50 52 49 4d 41 52 59 20  urn the PRIMARY 
6630: 4b 45 59 20 69 6e 64 65 78 20 6f 66 20 61 20 74  KEY index of a t
6640: 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  able.*/.Index *s
6650: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
6660: 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61  Index(Table *pTa
6670: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 0a  b){.  Index *p;.
6680: 20 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70 49    for(p=pTab->pI
6690: 6e 64 65 78 3b 20 70 20 26 26 20 21 49 73 50 72  ndex; p && !IsPr
66a0: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 29  imaryKeyIndex(p)
66b0: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a  ; p=p->pNext){}.
66c0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
66d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
66e0: 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
66f0: 70 49 64 78 20 74 68 61 74 20 63 6f 72 72 65 73  pIdx that corres
6700: 70 6f 6e 64 73 20 74 6f 20 74 61 62 6c 65 0a 2a  ponds to table.*
6710: 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20  * column iCol.  
6720: 52 65 74 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74  Return -1 if not
6730: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73   found..*/.i16 s
6740: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
6750: 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78 2c  dex(Index *pIdx,
6760: 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e   i16 iCol){.  in
6770: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
6780: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
6790: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
67a0: 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  Col==pIdx->aiCol
67b0: 75 6d 6e 5b 69 5d 20 29 20 72 65 74 75 72 6e 20  umn[i] ) return 
67c0: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
67d0: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  -1;.}../*.** Beg
67e0: 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20  in constructing 
67f0: 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72  a new table repr
6800: 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65  esentation in me
6810: 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a  mory.  This is.*
6820: 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73  * the first of s
6830: 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f  everal action ro
6840: 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20  utines that get 
6850: 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e  called in respon
6860: 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54  se.** to a CREAT
6870: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
6880: 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61  t.  In particula
6890: 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  r, this routine 
68a0: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74  is called.** aft
68b0: 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73  er seeing tokens
68c0: 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54   "CREATE" and "T
68d0: 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61  ABLE" and the ta
68e0: 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73  ble name. The is
68f0: 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20  Temp.** flag is 
6900: 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c  true if the tabl
6910: 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
6920: 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69  ed in the auxili
6930: 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ary database.** 
6940: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
6950: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
6960: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
6970: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65   is normally the
6980: 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68   case.** when th
6990: 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d  e "TEMP" or "TEM
69a0: 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20  PORARY" keyword 
69b0: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
69c0: 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20  n.** CREATE and 
69d0: 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TABLE..**.** The
69e0: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
69f0: 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  d is initialized
6a00: 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72   and put in pPar
6a10: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a  se->pNewTable..*
6a20: 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65  * As more of the
6a30: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
6a40: 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
6a50: 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63  d, additional ac
6a60: 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73  tion.** routines
6a70: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
6a80: 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f  to add more info
6a90: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
6aa0: 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68  record..** At th
6ab0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
6ac0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
6ad0: 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33  ent, the sqlite3
6ae0: 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69  EndTable() routi
6af0: 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
6b00: 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
6b10: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20  construction of 
6b20: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65  the new table re
6b30: 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  cord..*/.void sq
6b40: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
6b50: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6b60: 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f  ,   /* Parser co
6b70: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
6b80: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46   *pName1,   /* F
6b90: 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65  irst part of the
6ba0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
6bb0: 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  le or view */.  
6bc0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
6bd0: 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
6be0: 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  of the name of t
6bf0: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
6c00: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
6c10: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
6c20: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
6c30: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
6c40: 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20  isView,      /* 
6c50: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
6c60: 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20  a VIEW */.  int 
6c70: 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20  isVirtual,   /* 
6c80: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
6c90: 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65 20  a VIRTUAL table 
6ca0: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20  */.  int noErr  
6cb0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
6cc0: 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72  ing if table alr
6cd0: 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
6ce0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  {.  Table *pTabl
6cf0: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  e;.  char *zName
6d00: 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d   = 0; /* The nam
6d10: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
6d20: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  le */.  sqlite3 
6d30: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
6d40: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
6d50: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
6d60: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
6d70: 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
6d80: 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54   table in */.  T
6d90: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20  oken *pName;    
6da0: 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
6db0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
6dc0: 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20   to create */.. 
6dd0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
6de0: 73 79 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e  sy && db->init.n
6df0: 65 77 54 6e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20  ewTnum==1 ){.   
6e00: 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
6e10: 3a 20 20 50 61 72 73 69 6e 67 20 74 68 65 20 73  :  Parsing the s
6e20: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 6f 72 20  qlite_master or 
6e30: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
6e40: 65 72 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20  er schema */.   
6e50: 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e   iDb = db->init.
6e60: 69 44 62 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  iDb;.    zName =
6e70: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
6e80: 28 64 62 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  (db, SCHEMA_TABL
6e90: 45 28 69 44 62 29 29 3b 0a 20 20 20 20 70 4e 61  E(iDb));.    pNa
6ea0: 6d 65 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d  me = pName1;.  }
6eb0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
6ec0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
6ed0: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
6ee0: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
6ef0: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
6f00: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
6f10: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
6f20: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 21 4f  turn;.    if( !O
6f30: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
6f40: 54 65 6d 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e  Temp && pName2->
6f50: 6e 3e 30 20 26 26 20 69 44 62 21 3d 31 20 29 7b  n>0 && iDb!=1 ){
6f60: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 63 72 65  .      /* If cre
6f70: 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62  ating a temp tab
6f80: 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79  le, the name may
6f90: 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65   not be qualifie
6fa0: 64 2e 20 55 6e 6c 65 73 73 20 0a 20 20 20 20 20  d. Unless .     
6fb0: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
6fc0: 20 6e 61 6d 65 20 69 73 20 22 74 65 6d 70 22 20   name is "temp" 
6fd0: 61 6e 79 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20  anyway.  */.    
6fe0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6ff0: 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f  g(pParse, "tempo
7000: 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20  rary table name 
7010: 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66  must be unqualif
7020: 69 65 64 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ied");.      ret
7030: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
7040: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
7050: 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62 20  && isTemp ) iDb 
7060: 3d 20 31 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  = 1;.    zName =
7070: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
7080: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
7090: 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
70a0: 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e  sNameToken = *pN
70b0: 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ame;.  if( zName
70c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
70d0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
70e0: 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
70f0: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
7100: 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ame) ){.    goto
7110: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
7120: 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  or;.  }.  if( db
7130: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20  ->init.iDb==1 ) 
7140: 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e  isTemp = 1;.#ifn
7150: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7160: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
7170: 61 73 73 65 72 74 28 20 69 73 54 65 6d 70 3d 3d  assert( isTemp==
7180: 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d 31 20 29  0 || isTemp==1 )
7190: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 56 69  ;.  assert( isVi
71a0: 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d  ew==0 || isView=
71b0: 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20 20 73 74  =1 );.  {.    st
71c0: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 43  atic const u8 aC
71d0: 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ode[] = {.      
71e0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
71f0: 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 4c  ABLE,.       SQL
7200: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
7210: 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51  TABLE,.       SQ
7220: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
7230: 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,.       SQLITE_
7240: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
7250: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68 61 72  .    };.    char
7260: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
7270: 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
7280: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
7290: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
72a0: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
72b0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65  CHEMA_TABLE(isTe
72c0: 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  mp), 0, zDb) ){.
72d0: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
72e0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
72f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56    }.    if( !isV
7300: 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65  irtual && sqlite
7310: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
7320: 65 2c 20 28 69 6e 74 29 61 43 6f 64 65 5b 69 73  e, (int)aCode[is
7330: 54 65 6d 70 2b 32 2a 69 73 56 69 65 77 5d 2c 0a  Temp+2*isView],.
7340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7360: 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 2c         zName, 0,
7370: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
7380: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7390: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  error;.    }.  }
73a0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61  .#endif..  /* Ma
73b0: 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20  ke sure the new 
73c0: 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20  table name does 
73d0: 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  not collide with
73e0: 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a   an existing.  *
73f0: 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
7400: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d   name in the sam
7410: 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73 73  e database.  Iss
7420: 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ue an error mess
7430: 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64  age if.  ** it d
7440: 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70 74 69  oes. The excepti
7450: 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73 74 61  on is if the sta
7460: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72  tement being par
7470: 73 65 64 20 77 61 73 20 70 61 73 73 65 64 0a 20  sed was passed. 
7480: 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65   ** to an sqlite
7490: 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29  3_declare_vtab()
74a0: 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63   call. In that c
74b0: 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c  ase only the col
74c0: 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61  umn names.  ** a
74d0: 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65  nd types will be
74e0: 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20   used, so there 
74f0: 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65  is no need to te
7500: 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65  st for namespace
7510: 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73  .  ** collisions
7520: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e  ..  */.  if( !IN
7530: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b  _DECLARE_VTAB ){
7540: 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  .    char *zDb =
7550: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
7560: 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  bSName;.    if( 
7570: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
7580: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
7590: 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  rse) ){.      go
75a0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
75b0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
75c0: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  pTable = sqlite3
75d0: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
75e0: 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69  ame, zDb);.    i
75f0: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
7600: 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b     if( !noErr ){
7610: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7620: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7630: 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61   "table %T alrea
7640: 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d  dy exists", pNam
7650: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
7660: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7670: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
7680: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
7690: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
76a0: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
76b0: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
76c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
76d0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
76e0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ror;.    }.    i
76f0: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
7700: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  dex(db, zName, z
7710: 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Db)!=0 ){.      
7720: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7730: 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
7740: 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64  s already an ind
7750: 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  ex named %s", zN
7760: 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
7770: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
7780: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  or;.    }.  }.. 
7790: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
77a0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
77b0: 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
77c0: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ;.  if( pTable==
77d0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
77e0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
77f0: 64 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  d );.    pParse-
7800: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
7810: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 70 50 61  EM_BKPT;.    pPa
7820: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
7830: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
7840: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
7850: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
7860: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
7870: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
7880: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20  able->pSchema = 
7890: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
78a0: 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  hema;.  pTable->
78b0: 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 23 69 66  nTabRef = 1;.#if
78c0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
78d0: 4c 54 5f 52 4f 57 45 53 54 0a 20 20 70 54 61 62  LT_ROWEST.  pTab
78e0: 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  le->nRowLogEst =
78f0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 53   sqlite3LogEst(S
7900: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 4f  QLITE_DEFAULT_RO
7910: 57 45 53 54 29 3b 0a 23 65 6c 73 65 0a 20 20 70  WEST);.#else.  p
7920: 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73  Table->nRowLogEs
7930: 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
7940: 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
7950: 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
7960: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
7970: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
7980: 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72 73  le==0 );.  pPars
7990: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70  e->pNewTable = p
79a0: 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Table;..  /* If 
79b0: 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 67 69  this is the magi
79c0: 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  c sqlite_sequenc
79d0: 65 20 74 61 62 6c 65 20 75 73 65 64 20 62 79 20  e table used by 
79e0: 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20  autoincrement,. 
79f0: 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 20   ** then record 
7a00: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  a pointer to thi
7a10: 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d  s table in the m
7a20: 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
7a30: 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74  ucture.  ** so t
7a40: 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e 20 66  hat INSERT can f
7a50: 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 65 61  ind the table ea
7a60: 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  sily..  */.#ifnd
7a70: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
7a80: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69  UTOINCREMENT.  i
7a90: 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74  f( !pParse->nest
7aa0: 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a 4e 61  ed && strcmp(zNa
7ab0: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75  me, "sqlite_sequ
7ac0: 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ence")==0 ){.   
7ad0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7ae0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
7af0: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
7b00: 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65     pTable->pSche
7b10: 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20 70 54  ma->pSeqTab = pT
7b20: 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  able;.  }.#endif
7b30: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
7b40: 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65  erating the code
7b50: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72   that will inser
7b60: 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  t the table reco
7b70: 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65  rd into.  ** the
7b80: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
7b90: 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70  able.  Note in p
7ba0: 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77  articular that w
7bb0: 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a  e must go ahead.
7bc0: 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74    ** and allocat
7bd0: 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  e the record num
7be0: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
7bf0: 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65  e entry now.  Be
7c00: 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52  fore any.  ** PR
7c10: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
7c20: 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65  QUE keywords are
7c30: 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20   parsed.  Those 
7c40: 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61  keywords will ca
7c50: 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  use.  ** indices
7c60: 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61   to be created a
7c70: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  nd the table rec
7c80: 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65  ord must come be
7c90: 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69  fore the .  ** i
7ca0: 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20  ndices.  Hence, 
7cb0: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
7cc0: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
7cd0: 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
7ce0: 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f  d.  ** now..  */
7cf0: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
7d00: 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73 71  .busy && (v = sq
7d10: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
7d20: 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  rse))!=0 ){.    
7d30: 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 20 20 69  int addr1;.    i
7d40: 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20  nt fileFormat;. 
7d50: 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72 65 67     int reg1, reg
7d60: 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 2f 2a 20  2, reg3;.    /* 
7d70: 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73 20 61 6e 20  nullRow[] is an 
7d80: 4f 50 5f 52 65 63 6f 72 64 20 65 6e 63 6f 64 69  OP_Record encodi
7d90: 6e 67 20 6f 66 20 61 20 72 6f 77 20 63 6f 6e 74  ng of a row cont
7da0: 61 69 6e 69 6e 67 20 35 20 4e 55 4c 4c 73 20 2a  aining 5 NULLs *
7db0: 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
7dc0: 73 74 20 63 68 61 72 20 6e 75 6c 6c 52 6f 77 5b  st char nullRow[
7dd0: 5d 20 3d 20 7b 20 36 2c 20 30 2c 20 30 2c 20 30  ] = { 6, 0, 0, 0
7de0: 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 73 71  , 0, 0 };.    sq
7df0: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
7e00: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
7e10: 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64   1, iDb);..#ifnd
7e20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
7e30: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
7e40: 69 66 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b  if( isVirtual ){
7e50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7e60: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56  beAddOp0(v, OP_V
7e70: 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65  Begin);.    }.#e
7e80: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
7e90: 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  the file format 
7ea0: 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20  and encoding in 
7eb0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 76  the database hav
7ec0: 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c 20  e not been set, 
7ed0: 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 6d  .    ** set them
7ee0: 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   now..    */.   
7ef0: 20 72 65 67 31 20 3d 20 70 50 61 72 73 65 2d 3e   reg1 = pParse->
7f00: 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61  regRowid = ++pPa
7f10: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
7f20: 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e 72 65  eg2 = pParse->re
7f30: 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65  gRoot = ++pParse
7f40: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33  ->nMem;.    reg3
7f50: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
7f60: 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
7f70: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52  beAddOp3(v, OP_R
7f80: 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  eadCookie, iDb, 
7f90: 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49 4c 45  reg3, BTREE_FILE
7fa0: 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73 71  _FORMAT);.    sq
7fb0: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
7fc0: 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  ee(v, iDb);.    
7fd0: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
7fe0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
7ff0: 49 66 2c 20 72 65 67 33 29 3b 20 56 64 62 65 43  If, reg3); VdbeC
8000: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
8010: 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62  fileFormat = (db
8020: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
8030: 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21  _LegacyFileFmt)!
8040: 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  =0 ?.           
8050: 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54         1 : SQLIT
8060: 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41  E_MAX_FILE_FORMA
8070: 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  T;.    sqlite3Vd
8080: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
8090: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
80a0: 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  TREE_FILE_FORMAT
80b0: 2c 20 66 69 6c 65 46 6f 72 6d 61 74 29 3b 0a 20  , fileFormat);. 
80c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
80d0: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f  dOp3(v, OP_SetCo
80e0: 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45  okie, iDb, BTREE
80f0: 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20  _TEXT_ENCODING, 
8100: 45 4e 43 28 64 62 29 29 3b 0a 20 20 20 20 73 71  ENC(db));.    sq
8110: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
8120: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20  e(v, addr1);..  
8130: 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63    /* This just c
8140: 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68  reates a place-h
8150: 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20  older record in 
8160: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
8170: 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  r table..    ** 
8180: 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74  The record creat
8190: 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  ed does not cont
81a0: 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74  ain anything yet
81b0: 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65  .  It will be re
81c0: 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79  placed.    ** by
81d0: 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20   the real entry 
81e0: 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  in code generate
81f0: 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54  d at sqlite3EndT
8200: 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  able()..    **. 
8210: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
8220: 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72  for the new entr
8230: 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  y is left in reg
8240: 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65  ister pParse->re
8250: 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54  gRowid..    ** T
8260: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
8270: 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ber of the new t
8280: 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20  able is left in 
8290: 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52  reg pParse->regR
82a0: 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  oot..    ** The 
82b0: 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70  rowid and root p
82c0: 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65  age number value
82d0: 73 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  s are needed by 
82e0: 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20  the code that.  
82f0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54    ** sqlite3EndT
8300: 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  able will genera
8310: 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21  te..    */.#if !
8320: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8330: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
8340: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8350: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
8360: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 7c      if( isView |
8370: 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20  | isVirtual ){. 
8380: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8390: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
83a0: 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a  eger, 0, reg2);.
83b0: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
83c0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70 50 61  .    {.      pPa
83d0: 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20 3d  rse->addrCrTab =
83e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
83f0: 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54  p2(v, OP_CreateT
8400: 61 62 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29  able, iDb, reg2)
8410: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
8420: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
8430: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  le(pParse, iDb);
8440: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8450: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
8460: 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b  Rowid, 0, reg1);
8470: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8480: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f  AddOp4(v, OP_Blo
8490: 62 2c 20 36 2c 20 72 65 67 33 2c 20 30 2c 20 6e  b, 6, reg3, 0, n
84a0: 75 6c 6c 52 6f 77 2c 20 50 34 5f 53 54 41 54 49  ullRow, P4_STATI
84b0: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  C);.    sqlite3V
84c0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
84d0: 49 6e 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c  Insert, 0, reg3,
84e0: 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69   reg1);.    sqli
84f0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
8500: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
8510: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8520: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43  beAddOp0(v, OP_C
8530: 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lose);.  }..  /*
8540: 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72   Normal (non-err
8550: 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20  or) return. */. 
8560: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49   return;..  /* I
8570: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
8580: 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20  s, we jump here 
8590: 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  */.begin_table_e
85a0: 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44  rror:.  sqlite3D
85b0: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
85c0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
85d0: 2a 20 53 65 74 20 70 72 6f 70 65 72 74 69 65 73  * Set properties
85e0: 20 6f 66 20 61 20 74 61 62 6c 65 20 63 6f 6c 75   of a table colu
85f0: 6d 6e 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  mn based on the 
8600: 28 6d 61 67 69 63 61 6c 29 0a 2a 2a 20 6e 61 6d  (magical).** nam
8610: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  e of the column.
8620: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .*/.#if SQLITE_E
8630: 4e 41 42 4c 45 5f 48 49 44 44 45 4e 5f 43 4f 4c  NABLE_HIDDEN_COL
8640: 55 4d 4e 53 0a 76 6f 69 64 20 73 71 6c 69 74 65  UMNS.void sqlite
8650: 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65  3ColumnPropertie
8660: 73 46 72 6f 6d 4e 61 6d 65 28 54 61 62 6c 65 20  sFromName(Table 
8670: 2a 70 54 61 62 2c 20 43 6f 6c 75 6d 6e 20 2a 70  *pTab, Column *p
8680: 43 6f 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  Col){.  if( sqli
8690: 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 70 43 6f  te3_strnicmp(pCo
86a0: 6c 2d 3e 7a 4e 61 6d 65 2c 20 22 5f 5f 68 69 64  l->zName, "__hid
86b0: 64 65 6e 5f 5f 22 2c 20 31 30 29 3d 3d 30 20 29  den__", 10)==0 )
86c0: 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46  {.    pCol->colF
86d0: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
86e0: 48 49 44 44 45 4e 3b 0a 20 20 7d 65 6c 73 65 20  HIDDEN;.  }else 
86f0: 69 66 28 20 70 54 61 62 20 26 26 20 70 43 6f 6c  if( pTab && pCol
8700: 21 3d 70 54 61 62 2d 3e 61 43 6f 6c 20 26 26 20  !=pTab->aCol && 
8710: 28 70 43 6f 6c 5b 2d 31 5d 2e 63 6f 6c 46 6c 61  (pCol[-1].colFla
8720: 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49 44  gs & COLFLAG_HID
8730: 44 45 4e 29 20 29 7b 0a 20 20 20 20 70 54 61 62  DEN) ){.    pTab
8740: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
8750: 5f 4f 4f 4f 48 69 64 64 65 6e 3b 0a 20 20 7d 0a  _OOOHidden;.  }.
8760: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
8770: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
8780: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
8790: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
87a0: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a  onstructed..**.*
87b0: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
87c0: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
87d0: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f  once for each co
87e0: 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  lumn declaration
87f0: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
8800: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
8810: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
8820: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
8830: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
8840: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
8850: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
8860: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
8870: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
8880: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8890: 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20  AddColumn(Parse 
88a0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
88b0: 70 4e 61 6d 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  pName, Token *pT
88c0: 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ype){.  Table *p
88d0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
88e0: 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 54  r *z;.  char *zT
88f0: 79 70 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  ype;.  Column *p
8900: 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Col;.  sqlite3 *
8910: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8920: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
8930: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
8940: 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20  0 ) return;.#if 
8950: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
8960: 4e 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b  N.  if( p->nCol+
8970: 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  1>db->aLimit[SQL
8980: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
8990: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
89a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
89b0: 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
89c0: 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e  ns on %s", p->zN
89d0: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
89e0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a  ;.  }.#endif.  z
89f0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8a00: 6f 63 52 61 77 28 64 62 2c 20 70 4e 61 6d 65 2d  ocRaw(db, pName-
8a10: 3e 6e 20 2b 20 70 54 79 70 65 2d 3e 6e 20 2b 20  >n + pType->n + 
8a20: 32 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  2);.  if( z==0 )
8a30: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 63 70   return;.  memcp
8a40: 79 28 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70  y(z, pName->z, p
8a50: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 4e  Name->n);.  z[pN
8a60: 61 6d 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73  ame->n] = 0;.  s
8a70: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29  qlite3Dequote(z)
8a80: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
8a90: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
8aa0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
8ab0: 72 69 63 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c  ricmp(z, p->aCol
8ac0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
8ad0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8ae0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8af0: 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e  duplicate column
8b00: 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a   name: %s", z);.
8b10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
8b20: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
8b30: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
8b40: 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43    }.  if( (p->nC
8b50: 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a  ol & 0x7)==0 ){.
8b60: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77      Column *aNew
8b70: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c  ;.    aNew = sql
8b80: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
8b90: 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f  ,p->aCol,(p->nCo
8ba0: 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  l+8)*sizeof(p->a
8bb0: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  Col[0]));.    if
8bc0: 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
8bd0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
8be0: 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72  (db, z);.      r
8bf0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
8c00: 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b   p->aCol = aNew;
8c10: 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70  .  }.  pCol = &p
8c20: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b  ->aCol[p->nCol];
8c30: 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20  .  memset(pCol, 
8c40: 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  0, sizeof(p->aCo
8c50: 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e  l[0]));.  pCol->
8c60: 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 20 73 71 6c  zName = z;.  sql
8c70: 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72  ite3ColumnProper
8c80: 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 70 2c 20  tiesFromName(p, 
8c90: 70 43 6f 6c 29 3b 0a 20 0a 20 20 69 66 28 20 70  pCol);. .  if( p
8ca0: 54 79 70 65 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20  Type->n==0 ){.  
8cb0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
8cc0: 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69   no type specifi
8cd0: 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65  ed, columns have
8ce0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66   the default aff
8cf0: 69 6e 69 74 79 0a 20 20 20 20 2a 2a 20 27 42 4c  inity.    ** 'BL
8d00: 4f 42 27 2e 20 2a 2f 0a 20 20 20 20 70 43 6f 6c  OB'. */.    pCol
8d10: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
8d20: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
8d30: 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20    pCol->szEst = 
8d40: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
8d50: 7a 54 79 70 65 20 3d 20 7a 20 2b 20 73 71 6c 69  zType = z + sqli
8d60: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2b  te3Strlen30(z) +
8d70: 20 31 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a   1;.    memcpy(z
8d80: 54 79 70 65 2c 20 70 54 79 70 65 2d 3e 7a 2c 20  Type, pType->z, 
8d90: 70 54 79 70 65 2d 3e 6e 29 3b 0a 20 20 20 20 7a  pType->n);.    z
8da0: 54 79 70 65 5b 70 54 79 70 65 2d 3e 6e 5d 20 3d  Type[pType->n] =
8db0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   0;.    sqlite3D
8dc0: 65 71 75 6f 74 65 28 7a 54 79 70 65 29 3b 0a 20  equote(zType);. 
8dd0: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74     pCol->affinit
8de0: 79 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e  y = sqlite3Affin
8df0: 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20 26  ityType(zType, &
8e00: 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a 20 20  pCol->szEst);.  
8e10: 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
8e20: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54   |= COLFLAG_HAST
8e30: 59 50 45 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43  YPE;.  }.  p->nC
8e40: 6f 6c 2b 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e  ol++;.  pParse->
8e50: 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e  constraintName.n
8e60: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
8e70: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
8e80: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
8e90: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
8ea0: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
8eb0: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
8ec0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
8ed0: 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   A "NOT NULL" co
8ee0: 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20  nstraint has.** 
8ef0: 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63  been seen on a c
8f00: 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75  olumn.  This rou
8f10: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f  tine sets the no
8f20: 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a  tNull flag on.**
8f30: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72   the column curr
8f40: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
8f50: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
8f60: 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e  d sqlite3AddNotN
8f70: 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73  ull(Parse *pPars
8f80: 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  e, int onError){
8f90: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70  .  Table *p;.  p
8fa0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
8fb0: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
8fc0: 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f   || NEVER(p->nCo
8fd0: 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  l<1) ) return;. 
8fe0: 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c   p->aCol[p->nCol
8ff0: 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75  -1].notNull = (u
9000: 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 2d 3e  8)onError;.  p->
9010: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48  tabFlags |= TF_H
9020: 61 73 4e 6f 74 4e 75 6c 6c 3b 0a 7d 0a 0a 2f 2a  asNotNull;.}../*
9030: 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c  .** Scan the col
9040: 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54  umn type name zT
9050: 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70  ype (length nTyp
9060: 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  e) and return th
9070: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
9080: 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a  affinity type..*
9090: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
90a0: 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e  e does a case-in
90b0: 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68  dependent search
90c0: 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68   of zType for th
90d0: 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73  e .** substrings
90e0: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
90f0: 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20  g table. If one 
9100: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
9110: 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74  s is.** found, t
9120: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
9130: 20 61 66 66 69 6e 69 74 79 20 69 73 20 72 65 74   affinity is ret
9140: 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20  urned. If zType 
9150: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65  contains.** more
9160: 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65   than one of the
9170: 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74   substrings, ent
9180: 72 69 65 73 20 74 6f 77 61 72 64 20 74 68 65 20  ries toward the 
9190: 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74  top of .** the t
91a0: 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69  able take priori
91b0: 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  ty. For example,
91c0: 20 69 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c   if zType is 'BL
91d0: 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49  OBINT', .** SQLI
91e0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69  TE_AFF_INTEGER i
91f0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
9200: 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20 20 20  * Substring     
9210: 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d  | Affinity.** --
9220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
9240: 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20 20 20  * 'INT'         
9250: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  | SQLITE_AFF_INT
9260: 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20  EGER.** 'CHAR'  
9270: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
9280: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42  FF_TEXT.** 'CLOB
9290: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
92a0: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54  E_AFF_TEXT.** 'T
92b0: 45 58 54 27 20 20 20 20 20 20 20 20 7c 20 53 51  EXT'        | SQ
92c0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
92d0: 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c   'BLOB'        |
92e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
92f0: 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20  .** 'REAL'      
9300: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
9310: 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20  EAL.** 'FLOA'   
9320: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
9330: 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27  F_REAL.** 'DOUB'
9340: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
9350: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20  _AFF_REAL.**.** 
9360: 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73  If none of the s
9370: 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65  ubstrings in the
9380: 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65   above table are
9390: 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54   found,.** SQLIT
93a0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73  E_AFF_NUMERIC is
93b0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68   returned..*/.ch
93c0: 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69  ar sqlite3Affini
93d0: 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61  tyType(const cha
93e0: 72 20 2a 7a 49 6e 2c 20 75 38 20 2a 70 73 7a 45  r *zIn, u8 *pszE
93f0: 73 74 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 30  st){.  u32 h = 0
9400: 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 53  ;.  char aff = S
9410: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
9420: 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  C;.  const char 
9430: 2a 7a 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20 61  *zChar = 0;..  a
9440: 73 73 65 72 74 28 20 7a 49 6e 21 3d 30 20 29 3b  ssert( zIn!=0 );
9450: 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30 5d  .  while( zIn[0]
9460: 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c   ){.    h = (h<<
9470: 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65  8) + sqlite3Uppe
9480: 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29 26  rToLower[(*zIn)&
9490: 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b  0xff];.    zIn++
94a0: 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27  ;.    if( h==(('
94b0: 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36  c'<<24)+('h'<<16
94c0: 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20  )+('a'<<8)+'r') 
94d0: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){             /
94e0: 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20  * CHAR */.      
94f0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
9500: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7a 43 68  _TEXT;.      zCh
9510: 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d 65  ar = zIn;.    }e
9520: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27  lse if( h==(('c'
9530: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
9540: 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b  ('o'<<8)+'b') ){
9550: 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a         /* CLOB *
9560: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
9570: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
9580: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9590: 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c  (('t'<<24)+('e'<
95a0: 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74  <16)+('x'<<8)+'t
95b0: 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54  ') ){       /* T
95c0: 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  EXT */.      aff
95d0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
95e0: 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  XT;.    }else if
95f0: 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b  ( h==(('b'<<24)+
9600: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
9610: 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20  8)+'b')         
9620: 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20   /* BLOB */.    
9630: 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c      && (aff==SQL
9640: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9650: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
9660: 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20  FF_REAL) ){.    
9670: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
9680: 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 69  FF_BLOB;.      i
9690: 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20 29  f( zIn[0]=='(' )
96a0: 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23 69   zChar = zIn;.#i
96b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
96c0: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
96d0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
96e0: 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65  ==(('r'<<24)+('e
96f0: 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b  '<<16)+('a'<<8)+
9700: 27 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'l')          /*
9710: 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20   REAL */.       
9720: 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   && aff==SQLITE_
9730: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
9740: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9750: 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20  E_AFF_REAL;.    
9760: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
9770: 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  f'<<24)+('l'<<16
9780: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20  )+('o'<<8)+'a') 
9790: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41           /* FLOA
97a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
97b0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
97c0: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
97d0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
97e0: 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _REAL;.    }else
97f0: 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32   if( h==(('d'<<2
9800: 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75  4)+('o'<<16)+('u
9810: 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20  '<<8)+'b')      
9820: 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20      /* DOUB */. 
9830: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
9840: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
9850: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
9860: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
9870: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
9880: 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46 46  se if( (h&0x00FF
9890: 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36  FFFF)==(('i'<<16
98a0: 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20  )+('n'<<8)+'t') 
98b0: 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a  ){    /* INT */.
98c0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
98d0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
98e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
98f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
9900: 70 73 7a 45 73 74 20 69 73 20 6e 6f 74 20 4e 55  pszEst is not NU
9910: 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65 73 74  LL, store an est
9920: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66 69 65  imate of the fie
9930: 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a 20 20  ld size.  The.  
9940: 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20 73  ** estimate is s
9950: 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20 74 68  caled so that th
9960: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e 74  e size of an int
9970: 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a 20  eger is 1.  */. 
9980: 20 69 66 28 20 70 73 7a 45 73 74 20 29 7b 0a 20   if( pszEst ){. 
9990: 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 31 3b 20     *pszEst = 1; 
99a0: 20 20 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a    /* default siz
99b0: 65 20 69 73 20 61 70 70 72 6f 78 20 34 20 62 79  e is approx 4 by
99c0: 74 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61  tes */.    if( a
99d0: 66 66 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  ff<SQLITE_AFF_NU
99e0: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69  MERIC ){.      i
99f0: 66 28 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20  f( zChar ){.    
9a00: 20 20 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72      while( zChar
9a10: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [0] ){.         
9a20: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 64 69   if( sqlite3Isdi
9a30: 67 69 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b  git(zChar[0]) ){
9a40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
9a50: 20 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   v = 0;.        
9a60: 20 20 20 20 73 71 6c 69 74 65 33 47 65 74 49 6e      sqlite3GetIn
9a70: 74 33 32 28 7a 43 68 61 72 2c 20 26 76 29 3b 0a  t32(zChar, &v);.
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 76 20 3d 20              v = 
9a90: 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  v/4 + 1;.       
9aa0: 20 20 20 20 20 69 66 28 20 76 3e 32 35 35 20 29       if( v>255 )
9ab0: 20 76 20 3d 20 32 35 35 3b 0a 20 20 20 20 20 20   v = 255;.      
9ac0: 20 20 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20        *pszEst = 
9ad0: 76 3b 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56  v; /* BLOB(k), V
9ae0: 41 52 43 48 41 52 28 6b 29 2c 20 43 48 41 52 28  ARCHAR(k), CHAR(
9af0: 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20  k) -> r=(k/4+1) 
9b00: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  */.            b
9b10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
9b20: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68 61  }.          zCha
9b30: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  r++;.        }. 
9b40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9b50: 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 35 3b      *pszEst = 5;
9b60: 20 20 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54     /* BLOB, TEXT
9b70: 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28  , CLOB -> r=5  (
9b80: 61 70 70 72 6f 78 20 32 30 20 62 79 74 65 73 29  approx 20 bytes)
9b90: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
9ba0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66  .  }.  return af
9bb0: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  f;.}../*.** The 
9bc0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
9bd0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
9be0: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
9bf0: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
9c00: 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  mn.** of the tab
9c10: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
9c20: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
9c30: 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76  .**.** Default v
9c40: 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73  alue expressions
9c50: 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e   must be constan
9c60: 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78 63  t.  Raise an exc
9c70: 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a  eption if this.*
9c80: 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  * is not the cas
9c90: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
9ca0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
9cb0: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
9cc0: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
9cd0: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
9ce0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
9cf0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
9d00: 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61  d sqlite3AddDefa
9d10: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
9d20: 70 50 61 72 73 65 2c 20 45 78 70 72 53 70 61 6e  pParse, ExprSpan
9d30: 20 2a 70 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c   *pSpan){.  Tabl
9d40: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
9d50: 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  pCol;.  sqlite3 
9d60: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9d70: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
9d80: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
9d90: 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f   p!=0 ){.    pCo
9da0: 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d  l = &(p->aCol[p-
9db0: 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69  >nCol-1]);.    i
9dc0: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
9dd0: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
9de0: 69 6f 6e 28 70 53 70 61 6e 2d 3e 70 45 78 70 72  ion(pSpan->pExpr
9df0: 2c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29  , db->init.busy)
9e00: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9e10: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
9e20: 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65  , "default value
9e30: 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20   of column [%s] 
9e40: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22  is not constant"
9e50: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  ,.          pCol
9e60: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ->zName);.    }e
9e70: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
9e80: 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69 73  copy of pExpr is
9e90: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
9ea0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61   the original, a
9eb0: 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73  s pExpr contains
9ec0: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73  .      ** tokens
9ed0: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76   that point to v
9ee0: 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20  olatile memory. 
9ef0: 54 68 65 20 27 73 70 61 6e 27 20 6f 66 20 74 68  The 'span' of th
9f00: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  e expression.   
9f10: 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
9f20: 64 20 62 79 20 70 72 61 67 6d 61 20 74 61 62 6c  d by pragma tabl
9f30: 65 5f 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f  e_info..      */
9f40: 0a 20 20 20 20 20 20 45 78 70 72 20 78 3b 0a 20  .      Expr x;. 
9f50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9f60: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d  Delete(db, pCol-
9f70: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 6d  >pDflt);.      m
9f80: 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69 7a  emset(&x, 0, siz
9f90: 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20 20 78  eof(x));.      x
9fa0: 2e 6f 70 20 3d 20 54 4b 5f 53 50 41 4e 3b 0a 20  .op = TK_SPAN;. 
9fb0: 20 20 20 20 20 78 2e 75 2e 7a 54 6f 6b 65 6e 20       x.u.zToken 
9fc0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
9fd0: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53  up(db, (char*)pS
9fe0: 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20  pan->zStart,.   
9ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a010: 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45   (int)(pSpan->zE
a020: 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61  nd - pSpan->zSta
a030: 72 74 29 29 3b 0a 20 20 20 20 20 20 78 2e 70 4c  rt));.      x.pL
a040: 65 66 74 20 3d 20 70 53 70 61 6e 2d 3e 70 45 78  eft = pSpan->pEx
a050: 70 72 3b 0a 20 20 20 20 20 20 78 2e 66 6c 61 67  pr;.      x.flag
a060: 73 20 3d 20 45 50 5f 53 6b 69 70 3b 0a 20 20 20  s = EP_Skip;.   
a070: 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d     pCol->pDflt =
a080: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
a090: 64 62 2c 20 26 78 2c 20 45 58 50 52 44 55 50 5f  db, &x, EXPRDUP_
a0a0: 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20 73  REDUCE);.      s
a0b0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
a0c0: 20 78 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20   x.u.zToken);.  
a0d0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
a0e0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
a0f0: 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d  pSpan->pExpr);.}
a100: 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77 61 72 64  ../*.** Backward
a110: 73 20 43 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s Compatibility 
a120: 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20 48 69 73  Hack:.** .** His
a130: 74 6f 72 69 63 61 6c 20 76 65 72 73 69 6f 6e 73  torical versions
a140: 20 6f 66 20 53 51 4c 69 74 65 20 61 63 63 65 70   of SQLite accep
a150: 74 65 64 20 73 74 72 69 6e 67 73 20 61 73 20 63  ted strings as c
a160: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 0a 2a  olumn names in.*
a170: 2a 20 69 6e 64 65 78 65 73 20 61 6e 64 20 50 52  * indexes and PR
a180: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
a190: 61 69 6e 74 73 20 61 6e 64 20 69 6e 20 55 4e 49  aints and in UNI
a1a0: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  QUE constraints.
a1b0: 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a    Example:.**.**
a1c0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
a1d0: 45 20 78 79 7a 28 61 2c 62 2c 63 2c 64 2c 65 2c  E xyz(a,b,c,d,e,
a1e0: 50 52 49 4d 41 52 59 20 4b 45 59 28 27 61 27 29  PRIMARY KEY('a')
a1f0: 2c 55 4e 49 51 55 45 28 27 62 27 2c 27 63 27 20  ,UNIQUE('b','c' 
a200: 43 4f 4c 4c 41 54 45 20 74 72 69 6d 29 0a 2a 2a  COLLATE trim).**
a210: 20 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45       CREATE INDE
a220: 58 20 61 62 63 20 4f 4e 20 78 79 7a 28 27 63 27  X abc ON xyz('c'
a230: 2c 27 64 27 20 44 45 53 43 2c 27 65 27 20 43 4f  ,'d' DESC,'e' CO
a240: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 44 45 53  LLATE nocase DES
a250: 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  C);.**.** This i
a260: 73 20 67 6f 6f 66 79 2e 20 20 42 75 74 20 74 6f  s goofy.  But to
a270: 20 70 72 65 73 65 72 76 65 20 62 61 63 6b 77 61   preserve backwa
a280: 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
a290: 79 20 77 65 20 63 6f 6e 74 69 6e 75 65 20 74 6f  y we continue to
a2a0: 0a 2a 2a 20 61 63 63 65 70 74 20 69 74 2e 20 20  .** accept it.  
a2b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
a2c0: 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  s the necessary 
a2d0: 63 6f 6e 76 65 72 73 69 6f 6e 2e 20 20 49 74 20  conversion.  It 
a2e0: 63 6f 6e 76 65 72 74 73 0a 2a 2a 20 74 68 65 20  converts.** the 
a2f0: 65 78 70 72 65 73 73 69 6f 6e 20 67 69 76 65 6e  expression given
a300: 20 69 6e 20 69 74 73 20 61 72 67 75 6d 65 6e 74   in its argument
a310: 20 66 72 6f 6d 20 61 20 54 4b 5f 53 54 52 49 4e   from a TK_STRIN
a320: 47 20 69 6e 74 6f 20 61 20 54 4b 5f 49 44 0a 2a  G into a TK_ID.*
a330: 2a 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  * if the express
a340: 69 6f 6e 20 69 73 20 6a 75 73 74 20 61 20 54 4b  ion is just a TK
a350: 5f 53 54 52 49 4e 47 20 77 69 74 68 20 61 6e 20  _STRING with an 
a360: 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c 41 54 45  optional COLLATE
a370: 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 49 66 20 74   clause..** If t
a380: 68 65 20 65 70 78 72 65 73 73 69 6f 6e 20 69 73  he epxression is
a390: 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20   anything other 
a3a0: 74 68 61 6e 20 54 4b 5f 53 54 52 49 4e 47 2c 20  than TK_STRING, 
a3b0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
a3c0: 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a  s.** unchanged..
a3d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
a3e0: 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64  qlite3StringToId
a3f0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
a400: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e   p->op==TK_STRIN
a410: 47 20 29 7b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  G ){.    p->op =
a420: 20 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c 73 65 20   TK_ID;.  }else 
a430: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
a440: 4c 4c 41 54 45 20 26 26 20 70 2d 3e 70 4c 65 66  LLATE && p->pLef
a450: 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47  t->op==TK_STRING
a460: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 65 66 74   ){.    p->pLeft
a470: 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20  ->op = TK_ID;.  
a480: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67  }.}../*.** Desig
a490: 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59  nate the PRIMARY
a4a0: 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62   KEY for the tab
a4b0: 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20  le.  pList is a 
a4c0: 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a  list of names .*
a4d0: 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61  * of columns tha
a4e0: 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61  t form the prima
a4f0: 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73  ry key.  If pLis
a500: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
a510: 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
a520: 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d  ntly added colum
a530: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  n of the table i
a540: 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  s the primary ke
a550: 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65  y..**.** A table
a560: 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73   can have at mos
a570: 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  t one primary ke
a580: 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65  y.  If the table
a590: 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20   already has.** 
a5a0: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61  a primary key (a
a5b0: 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73  nd this is the s
a5c0: 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65  econd primary ke
a5d0: 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  y) then create a
a5e0: 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n.** error..**.*
a5f0: 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59  * If the PRIMARY
a600: 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e   KEY is on a sin
a610: 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65  gle column whose
a620: 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54   datatype is INT
a630: 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65  EGER,.** then we
a640: 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65   will try to use
a650: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20   that column as 
a660: 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20  the rowid.  Set 
a670: 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a  the Table.iPKey.
a680: 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
a690: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
a6a0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74  truction to be t
a6b0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
a6c0: 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ** INTEGER PRIMA
a6d0: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20  RY KEY column.  
a6e0: 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73  Table.iPKey is s
a6f0: 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72  et to -1 if ther
a700: 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47  e is.** no INTEG
a710: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  ER PRIMARY KEY..
a720: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79  **.** If the key
a730: 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
a740: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
a750: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e  then create a un
a760: 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f  ique.** index fo
a770: 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69  r the key.  No i
a780: 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20  ndex is created 
a790: 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d  for INTEGER PRIM
a7a0: 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69  ARY KEYs..*/.voi
a7b0: 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d  d sqlite3AddPrim
a7c0: 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20  aryKey(.  Parse 
a7d0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
a7e0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
a7f0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
a800: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
a810: 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20   field names to 
a820: 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
a830: 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
a840: 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
a850: 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73  with a uniquenes
a860: 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  s conflict */.  
a870: 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20  int autoInc,    
a880: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
a890: 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b   AUTOINCREMENT k
a8a0: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
a8b0: 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  t */.  int sortO
a8c0: 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49  rder     /* SQLI
a8d0: 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c  TE_SO_ASC or SQL
a8e0: 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29  ITE_SO_DESC */.)
a8f0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
a900: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
a910: 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  ble;.  Column *p
a920: 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Col = 0;.  int i
a930: 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69  Col = -1, i;.  i
a940: 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69 66 28 20  nt nTerm;.  if( 
a950: 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70  pTab==0 ) goto p
a960: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
a970: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62  .  if( pTab->tab
a980: 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72  Flags & TF_HasPr
a990: 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20 20 20  imaryKey ){.    
a9a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
a9b0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
a9c0: 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73  table \"%s\" has
a9d0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70   more than one p
a9e0: 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61  rimary key", pTa
a9f0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
aa00: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
aa10: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62  exit;.  }.  pTab
aa20: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
aa30: 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a  _HasPrimaryKey;.
aa40: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
aa50: 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61  {.    iCol = pTa
aa60: 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20  b->nCol - 1;.   
aa70: 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61   pCol = &pTab->a
aa80: 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 70  Col[iCol];.    p
aa90: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col->colFlags |=
aaa0: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
aab0: 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 31 3b  ;.    nTerm = 1;
aac0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 54  .  }else{.    nT
aad0: 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  erm = pList->nEx
aae0: 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  pr;.    for(i=0;
aaf0: 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a   i<nTerm; i++){.
ab00: 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 45 78        Expr *pCEx
ab10: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
ab20: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73  SkipCollate(pLis
ab30: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
ab40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
ab50: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
ab60: 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f   sqlite3StringTo
ab70: 49 64 28 70 43 45 78 70 72 29 3b 0a 20 20 20 20  Id(pCExpr);.    
ab80: 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70    if( pCExpr->op
ab90: 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20  ==TK_ID ){.     
aba0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
abb0: 43 4e 61 6d 65 20 3d 20 70 43 45 78 70 72 2d 3e  CName = pCExpr->
abc0: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
abd0: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
abe0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
abf0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
ac00: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
ac10: 49 43 6d 70 28 7a 43 4e 61 6d 65 2c 20 70 54 61  ICmp(zCName, pTa
ac20: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
ac30: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
ac40: 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70         pCol = &p
ac50: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b  Tab->aCol[iCol];
ac60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
ac70: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
ac80: 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a  OLFLAG_PRIMKEY;.
ac90: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
aca0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
acb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
acc0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
acd0: 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26 26 20   nTerm==1.   && 
ace0: 70 43 6f 6c 0a 20 20 20 26 26 20 73 71 6c 69 74  pCol.   && sqlit
acf0: 65 33 53 74 72 49 43 6d 70 28 73 71 6c 69 74 65  e3StrICmp(sqlite
ad00: 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c  3ColumnType(pCol
ad10: 2c 22 22 29 2c 20 22 49 4e 54 45 47 45 52 22 29  ,""), "INTEGER")
ad20: 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72 74 4f 72  ==0.   && sortOr
ad30: 64 65 72 21 3d 53 51 4c 49 54 45 5f 53 4f 5f 44  der!=SQLITE_SO_D
ad40: 45 53 43 0a 20 20 29 7b 0a 20 20 20 20 70 54 61  ESC.  ){.    pTa
ad50: 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b  b->iPKey = iCol;
ad60: 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f  .    pTab->keyCo
ad70: 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72  nf = (u8)onError
ad80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 75  ;.    assert( au
ad90: 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f  toInc==0 || auto
ada0: 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54  Inc==1 );.    pT
adb0: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
adc0: 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69  autoInc*TF_Autoi
add0: 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 20 20 69 66  ncrement;.    if
ade0: 28 20 70 4c 69 73 74 20 29 20 70 50 61 72 73 65  ( pList ) pParse
adf0: 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 20 3d  ->iPkSortOrder =
ae00: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72   pList->a[0].sor
ae10: 74 4f 72 64 65 72 3b 0a 20 20 7d 65 6c 73 65 20  tOrder;.  }else 
ae20: 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23  if( autoInc ){.#
ae30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ae40: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
ae50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
ae60: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41 55  rMsg(pParse, "AU
ae70: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f  TOINCREMENT is o
ae80: 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61  nly allowed on a
ae90: 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45  n ".       "INTE
aea0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
aeb0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
aec0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72  e{.    sqlite3Cr
aed0: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
aee0: 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74  , 0, 0, 0, pList
aef0: 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20  , onError, 0,.  
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af10: 20 20 20 20 20 20 20 20 20 30 2c 20 73 6f 72 74           0, sort
af20: 4f 72 64 65 72 2c 20 30 2c 20 53 51 4c 49 54 45  Order, 0, SQLITE
af30: 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59  _IDXTYPE_PRIMARY
af40: 4b 45 59 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  KEY);.    pList 
af50: 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72  = 0;.  }..primar
af60: 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71  y_key_exit:.  sq
af70: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
af80: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
af90: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
afa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
afb0: 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74   new CHECK const
afc0: 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62  raint to the tab
afd0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
afe0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
aff0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b000: 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69  AddCheckConstrai
b010: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
b020: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
b030: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
b040: 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72  Expr *pCheckExpr
b050: 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65    /* The check e
b060: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a  xpression */.){.
b070: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b080: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c  MIT_CHECK.  Tabl
b090: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
b0a0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 73  ->pNewTable;.  s
b0b0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
b0c0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
b0d0: 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41  Tab && !IN_DECLA
b0e0: 52 45 5f 56 54 41 42 0a 20 20 20 26 26 20 21 73  RE_VTAB.   && !s
b0f0: 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 65 61  qlite3BtreeIsRea
b100: 64 6f 6e 6c 79 28 64 62 2d 3e 61 44 62 5b 64 62  donly(db->aDb[db
b110: 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e 70 42 74 29  ->init.iDb].pBt)
b120: 0a 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  .  ){.    pTab->
b130: 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33  pCheck = sqlite3
b140: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
b150: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68  Parse, pTab->pCh
b160: 65 63 6b 2c 20 70 43 68 65 63 6b 45 78 70 72 29  eck, pCheckExpr)
b170: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
b180: 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65  ->constraintName
b190: 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  .n ){.      sqli
b1a0: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
b1b0: 6d 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  me(pParse, pTab-
b1c0: 3e 70 43 68 65 63 6b 2c 20 26 70 50 61 72 73 65  >pCheck, &pParse
b1d0: 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65  ->constraintName
b1e0: 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 1);.    }.  }e
b1f0: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
b200: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
b210: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
b220: 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20   pCheckExpr);.  
b230: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
b240: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  he collation fun
b250: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ction of the mos
b260: 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65  t recently parse
b270: 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a  d table column.*
b280: 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71  * to the CollSeq
b290: 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20   given..*/.void 
b2a0: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74  sqlite3AddCollat
b2b0: 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  eType(Parse *pPa
b2c0: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  rse, Token *pTok
b2d0: 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  en){.  Table *p;
b2e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
b2f0: 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *zColl;        
b300: 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65        /* Dequote
b310: 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74  d name of collat
b320: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ion sequence */.
b330: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
b340: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
b350: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
b360: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
b370: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62   p->nCol-1;.  db
b380: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
b390: 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
b3a0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
b3b0: 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28  , pToken);.  if(
b3c0: 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e   !zColl ) return
b3d0: 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
b3e0: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
b3f0: 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  arse, zColl) ){.
b400: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
b410: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
b420: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69  ee(db, p->aCol[i
b430: 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d  ].zColl);.    p-
b440: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d  >aCol[i].zColl =
b450: 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f   zColl;.  .    /
b460: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
b470: 69 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 22  is declared as "
b480: 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b  <name> PRIMARY K
b490: 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65  EY COLLATE <type
b4a0: 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  >",.    ** then 
b4b0: 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76  an index may hav
b4c0: 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f  e been created o
b4d0: 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65  n this column be
b4e0: 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  fore the.    ** 
b4f0: 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77  collation type w
b500: 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63  as added. Correc
b510: 74 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20  t this if it is 
b520: 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  the case..    */
b530: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d  .    for(pIdx=p-
b540: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
b550: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
b560: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b570: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31  pIdx->nKeyCol==1
b580: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
b590: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
b5a0: 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =i ){.        pI
b5b0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20  dx->azColl[0] = 
b5c0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c  p->aCol[i].zColl
b5d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b5e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
b5f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
b600: 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Coll);.  }.}../*
b610: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
b620: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f  n returns the co
b630: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
b640: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61   for database na
b650: 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63  tive text.** enc
b660: 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64  oding identified
b670: 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a   by the string z
b680: 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61  Name, length nNa
b690: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  me..**.** If the
b6a0: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
b6b0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73  tion sequence is
b6c0: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20   not available, 
b6d0: 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  or not available
b6e0: 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62  .** in the datab
b6f0: 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64  ase native encod
b700: 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69  ing, the collati
b710: 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e  on factory is in
b720: 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75  voked to.** requ
b730: 65 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63  est it. If the c
b740: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
b750: 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79   does not supply
b760: 20 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65   such a sequence
b770: 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71  ,.** and the seq
b780: 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62  uence is availab
b790: 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65  le in another te
b7a0: 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65  xt encoding, the
b7b0: 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74  n that is.** ret
b7c0: 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a  urned instead..*
b7d0: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69  *.** If no versi
b7e0: 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65  ons of the reque
b7f0: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20  sted collations 
b800: 73 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61  sequence are ava
b810: 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e  ilable, or.** an
b820: 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75  other error occu
b830: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
b840: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
b850: 72 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65  r message writte
b860: 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65  n into.** pParse
b870: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
b880: 74 69 6e 65 20 69 73 20 61 20 77 72 61 70 70 65  tine is a wrappe
b890: 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33  r around sqlite3
b8a0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20  FindCollSeq().  
b8b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
b8c0: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c  invokes the coll
b8d0: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 66  ation factory if
b8e0: 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61   the named colla
b8f0: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66  tion cannot be f
b900: 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  ound.** and gene
b910: 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  rates an error m
b920: 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65  essage..**.** Se
b930: 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46  e also: sqlite3F
b940: 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71  indCollSeq(), sq
b950: 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28  lite3GetCollSeq(
b960: 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ).*/.CollSeq *sq
b970: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
b980: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
b990: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
b9a0: 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ame){.  sqlite3 
b9b0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
b9c0: 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43  ;.  u8 enc = ENC
b9d0: 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62  (db);.  u8 initb
b9e0: 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62  usy = db->init.b
b9f0: 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  usy;.  CollSeq *
ba00: 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20  pColl;..  pColl 
ba10: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
ba20: 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e  lSeq(db, enc, zN
ba30: 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a  ame, initbusy);.
ba40: 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20    if( !initbusy 
ba50: 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70  && (!pColl || !p
ba60: 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20  Coll->xCmp) ){. 
ba70: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
ba80: 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61  e3GetCollSeq(pPa
ba90: 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c  rse, enc, pColl,
baa0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20   zName);.  }..  
bab0: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
bac0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
bad0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
bae0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63  increment the sc
baf0: 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a  hema cookie..**.
bb00: 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f  ** The schema co
bb10: 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20  okie is used to 
bb20: 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74  determine when t
bb30: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
bb40: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
bb50: 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61  anges.  After ea
bb60: 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ch schema change
bb70: 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c  , the cookie val
bb80: 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  ue.** changes.  
bb90: 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66  When a process f
bba0: 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73  irst reads the s
bbb0: 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73  chema it records
bbc0: 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20   the.** cookie. 
bbd0: 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65   Thereafter, whe
bbe0: 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f  never it goes to
bbf0: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
bc00: 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63  base,.** it chec
bc10: 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  ks the cookie to
bc20: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
bc30: 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68  chema has not ch
bc40: 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69  anged.** since i
bc50: 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e  t was last read.
bc60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e  .**.** This plan
bc70: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   is not complete
bc80: 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e  ly bullet-proof.
bc90: 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
bca0: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65   for.** the sche
bcb0: 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c  ma to change mul
bcc0: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20  tiple times and 
bcd0: 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  for the cookie t
bce0: 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b  o be.** set back
bcf0: 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e   to prior value.
bd00: 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61    But schema cha
bd10: 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75  nges are infrequ
bd20: 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70  ent.** and the p
bd30: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69  robability of hi
bd40: 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  tting the same c
bd50: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f  ookie value is o
bd60: 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20  nly.** 1 chance 
bd70: 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27  in 2^32.  So we'
bd80: 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a  re safe enough..
bd90: 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  **.** IMPLEMENTA
bda0: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 33 34 32 33 30  TION-OF: R-34230
bdb0: 2d 35 36 30 34 39 20 53 51 4c 69 74 65 20 61 75  -56049 SQLite au
bdc0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69 6e 63 72  tomatically incr
bdd0: 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20 73 63  ements.** the sc
bde0: 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 77 68 65  hema-version whe
bdf0: 6e 65 76 65 72 20 74 68 65 20 73 63 68 65 6d 61  never the schema
be00: 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a 76 6f 69   changes..*/.voi
be10: 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43  d sqlite3ChangeC
be20: 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61  ookie(Parse *pPa
be30: 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  rse, int iDb){. 
be40: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
be50: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
be60: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
be70: 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
be80: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
be90: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
bea0: 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  0) );.  sqlite3V
beb0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
bec0: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
bed0: 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52  BTREE_SCHEMA_VER
bee0: 53 49 4f 4e 2c 20 0a 20 20 20 20 20 20 20 20 20  SION, .         
bef0: 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61             db->a
bf00: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
bf10: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31  >schema_cookie+1
bf20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73  );.}../*.** Meas
bf30: 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ure the number o
bf40: 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65  f characters nee
bf50: 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68  ded to output th
bf60: 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74  e given.** ident
bf70: 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62  ifier.  The numb
bf80: 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  er returned incl
bf90: 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20  udes any quotes 
bfa0: 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73  used.** but does
bfb0: 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65   not include the
bfc0: 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72   null terminator
bfd0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69  ..**.** The esti
bfe0: 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61  mate is conserva
bff0: 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20  tive.  It might 
c000: 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77  be larger that w
c010: 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79  hat is.** really
c020: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
c030: 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67  ic int identLeng
c040: 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  th(const char *z
c050: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f  ){.  int n;.  fo
c060: 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20  r(n=0; *z; n++, 
c070: 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a  z++){.    if( *z
c080: 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a  =='"' ){ n++; }.
c090: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b    }.  return n +
c0a0: 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   2;.}../*.** The
c0b0: 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72   first parameter
c0c0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
c0d0: 20 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65   an output buffe
c0e0: 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a  r. The second .*
c0f0: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  * parameter is a
c100: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
c110: 6e 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74  nteger that cont
c120: 61 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20  ains the offset 
c130: 61 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77  at.** which to w
c140: 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  rite into the ou
c150: 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 69  tput buffer. Thi
c160: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65  s function copie
c170: 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72  s the.** nul-ter
c180: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70  minated string p
c190: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
c1a0: 20 74 68 69 72 64 20 70 61 72 61 6d 65 74 65 72   third parameter
c1b0: 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a  , zSignedIdent,.
c1c0: 2a 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  ** to the specif
c1d0: 69 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68  ied offset in th
c1e0: 65 20 62 75 66 66 65 72 20 61 6e 64 20 75 70 64  e buffer and upd
c1f0: 61 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65  ates *pIdx to re
c200: 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69  fer.** to the fi
c210: 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20 74  rst byte after t
c220: 68 65 20 6c 61 73 74 20 62 79 74 65 20 77 72 69  he last byte wri
c230: 74 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75  tten before retu
c240: 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  rning..** .** If
c250: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67   the string zSig
c260: 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74  nedIdent consist
c270: 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c  s entirely of al
c280: 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63  pha-numeric.** c
c290: 68 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20  haracters, does 
c2a0: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  not begin with a
c2b0: 20 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f   digit and is no
c2c0: 74 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64  t an SQL keyword
c2d0: 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20  ,.** then it is 
c2e0: 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75  copied to the ou
c2f0: 74 70 75 74 20 62 75 66 66 65 72 20 65 78 61 63  tput buffer exac
c300: 74 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74  tly as it is. Ot
c310: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69  herwise,.** it i
c320: 73 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64  s quoted using d
c330: 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f  ouble-quotes..*/
c340: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65  .static void ide
c350: 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69  ntPut(char *z, i
c360: 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a  nt *pIdx, char *
c370: 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20  zSignedIdent){. 
c380: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c390: 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e  zIdent = (unsign
c3a0: 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64  ed char*)zSigned
c3b0: 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20  Ident;.  int i, 
c3c0: 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20  j, needQuote;.  
c3d0: 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f  i = *pIdx;..  fo
c3e0: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
c3f0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; j++){.    if( 
c400: 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28  !sqlite3Isalnum(
c410: 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49  zIdent[j]) && zI
c420: 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62  dent[j]!='_' ) b
c430: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64  reak;.  }.  need
c440: 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49  Quote = sqlite3I
c450: 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d  sdigit(zIdent[0]
c460: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ).            ||
c470: 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43   sqlite3KeywordC
c480: 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d  ode(zIdent, j)!=
c490: 54 4b 5f 49 44 0a 20 20 20 20 20 20 20 20 20 20  TK_ID.          
c4a0: 20 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d    || zIdent[j]!=
c4b0: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0.            ||
c4c0: 20 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28 20 6e 65   j==0;..  if( ne
c4d0: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
c4e0: 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d   = '"';.  for(j=
c4f0: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
c500: 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d  +){.    z[i++] =
c510: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20   zIdent[j];.    
c520: 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27  if( zIdent[j]=='
c530: 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  "' ) z[i++] = '"
c540: 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65  ';.  }.  if( nee
c550: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
c560: 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20  = '"';.  z[i] = 
c570: 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a  0;.  *pIdx = i;.
c580: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
c590: 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  e a CREATE TABLE
c5a0: 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f   statement appro
c5b0: 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67  priate for the g
c5c0: 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20  iven.** table.  
c5d0: 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74  Memory to hold t
c5e0: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73  he text of the s
c5f0: 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61  tatement is obta
c600: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c  ined.** from sql
c610: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
c620: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
c630: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
c640: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
c650: 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62   char *createTab
c660: 6c 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a  leStmt(sqlite3 *
c670: 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20  db, Table *p){. 
c680: 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20   int i, k, n;.  
c690: 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63  char *zStmt;.  c
c6a0: 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70  har *zSep, *zSep
c6b0: 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75  2, *zEnd;.  Colu
c6c0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20  mn *pCol;.  n = 
c6d0: 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20  0;.  for(pCol = 
c6e0: 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c  p->aCol, i=0; i<
c6f0: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  p->nCol; i++, pC
c700: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ol++){.    n += 
c710: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c  identLength(pCol
c720: 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20  ->zName) + 5;.  
c730: 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65  }.  n += identLe
c740: 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  ngth(p->zName);.
c750: 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20    if( n<50 ){ . 
c760: 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20     zSep = "";.  
c770: 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20    zSep2 = ",";. 
c780: 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20     zEnd = ")";. 
c790: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70   }else{.    zSep
c7a0: 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a   = "\n  ";.    z
c7b0: 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a  Sep2 = ",\n  ";.
c7c0: 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22      zEnd = "\n)"
c7d0: 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20  ;.  }.  n += 35 
c7e0: 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a  + 6*p->nCol;.  z
c7f0: 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 44 62  Stmt = sqlite3Db
c800: 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29 3b  MallocRaw(0, n);
c810: 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20  .  if( zStmt==0 
c820: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  ){.    sqlite3Oo
c830: 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
c840: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
c850: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
c860: 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45 41  (n, zStmt, "CREA
c870: 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b  TE TABLE ");.  k
c880: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
c890: 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65  30(zStmt);.  ide
c8a0: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
c8b0: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53   p->zName);.  zS
c8c0: 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a  tmt[k++] = '(';.
c8d0: 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43    for(pCol=p->aC
c8e0: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
c8f0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
c900: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
c910: 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  st char * const 
c920: 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 20  azType[] = {.   
c930: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
c940: 46 46 5f 42 4c 4f 42 20 20 20 20 2a 2f 20 22 22  FF_BLOB    */ ""
c950: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
c960: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20  ITE_AFF_TEXT    
c970: 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20 20  */ " TEXT",.    
c980: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
c990: 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20 4e  F_NUMERIC */ " N
c9a0: 55 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  UM",.        /* 
c9b0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
c9c0: 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20 20  ER */ " INT",.  
c9d0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
c9e0: 41 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20 22  AFF_REAL    */ "
c9f0: 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20 20   REAL".    };.  
ca00: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63    int len;.    c
ca10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
ca20: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ;..    sqlite3_s
ca30: 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53  nprintf(n-k, &zS
ca40: 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20  tmt[k], zSep);. 
ca50: 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53     k += sqlite3S
ca60: 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b  trlen30(&zStmt[k
ca70: 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a  ]);.    zSep = z
ca80: 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50  Sep2;.    identP
ca90: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43  ut(zStmt, &k, pC
caa0: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
cab0: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66  assert( pCol->af
cac0: 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46  finity-SQLITE_AF
cad0: 46 5f 42 4c 4f 42 20 3e 3d 20 30 20 29 3b 0a 20  F_BLOB >= 0 );. 
cae0: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
caf0: 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45  >affinity-SQLITE
cb00: 5f 41 46 46 5f 42 4c 4f 42 20 3c 20 41 72 72 61  _AFF_BLOB < Arra
cb10: 79 53 69 7a 65 28 61 7a 54 79 70 65 29 20 29 3b  ySize(azType) );
cb20: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
cb30: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
cb40: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29  QLITE_AFF_BLOB )
cb50: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
cb60: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
cb70: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
cb80: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
cb90: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
cba0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
cbb0: 52 49 43 20 29 3b 0a 20 20 20 20 74 65 73 74 63  RIC );.    testc
cbc0: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
cbd0: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
cbe0: 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 74  INTEGER );.    t
cbf0: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
cc00: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
cc10: 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20  AFF_REAL );.    
cc20: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 61 7a 54  .    zType = azT
cc30: 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  ype[pCol->affini
cc40: 74 79 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty - SQLITE_AFF_
cc50: 42 4c 4f 42 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d  BLOB];.    len =
cc60: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
cc70: 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 61 73 73  (zType);.    ass
cc80: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ert( pCol->affin
cc90: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
cca0: 42 4c 4f 42 20 0a 20 20 20 20 20 20 20 20 20 20  BLOB .          
ccb0: 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e    || pCol->affin
ccc0: 69 74 79 3d 3d 73 71 6c 69 74 65 33 41 66 66 69  ity==sqlite3Affi
ccd0: 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20  nityType(zType, 
cce0: 30 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  0) );.    memcpy
ccf0: 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70  (&zStmt[k], zTyp
cd00: 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b  e, len);.    k +
cd10: 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65 72  = len;.    asser
cd20: 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20  t( k<=n );.  }. 
cd30: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
cd40: 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d  f(n-k, &zStmt[k]
cd50: 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20  , "%s", zEnd);. 
cd60: 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d   return zStmt;.}
cd70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61  ../*.** Resize a
cd80: 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74  n Index object t
cd90: 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73  o hold N columns
cda0: 20 74 6f 74 61 6c 2e 20 20 52 65 74 75 72 6e 20   total.  Return 
cdb0: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
cdc0: 73 75 63 63 65 73 73 20 61 6e 64 20 53 51 4c 49  success and SQLI
cdd0: 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f  TE_NOMEM on an O
cde0: 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  OM error..*/.sta
cdf0: 74 69 63 20 69 6e 74 20 72 65 73 69 7a 65 49 6e  tic int resizeIn
ce00: 64 65 78 4f 62 6a 65 63 74 28 73 71 6c 69 74 65  dexObject(sqlite
ce10: 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49  3 *db, Index *pI
ce20: 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68  dx, int N){.  ch
ce30: 61 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20 69 6e  ar *zExtra;.  in
ce40: 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70  t nByte;.  if( p
ce50: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20  Idx->nColumn>=N 
ce60: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
ce70: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  OK;.  assert( pI
ce80: 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d 3d 30  dx->isResized==0
ce90: 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 73   );.  nByte = (s
cea0: 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b 20 73  izeof(char*) + s
ceb0: 69 7a 65 6f 66 28 69 31 36 29 20 2b 20 31 29 2a  izeof(i16) + 1)*
cec0: 4e 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 73 71  N;.  zExtra = sq
ced0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
cee0: 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  o(db, nByte);.  
cef0: 69 66 28 20 7a 45 78 74 72 61 3d 3d 30 20 29 20  if( zExtra==0 ) 
cf00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
cf10: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63  MEM_BKPT;.  memc
cf20: 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d  py(zExtra, pIdx-
cf30: 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66 28  >azColl, sizeof(
cf40: 63 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e 43 6f  char*)*pIdx->nCo
cf50: 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn);.  pIdx->a
cf60: 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63  zColl = (const c
cf70: 68 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a 20 20  har**)zExtra;.  
cf80: 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66  zExtra += sizeof
cf90: 28 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d  (char*)*N;.  mem
cfa0: 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78  cpy(zExtra, pIdx
cfb0: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65  ->aiColumn, size
cfc0: 6f 66 28 69 31 36 29 2a 70 49 64 78 2d 3e 6e 43  of(i16)*pIdx->nC
cfd0: 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e  olumn);.  pIdx->
cfe0: 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a  aiColumn = (i16*
cff0: 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72  )zExtra;.  zExtr
d000: 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29  a += sizeof(i16)
d010: 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78  *N;.  memcpy(zEx
d020: 74 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f 72 74  tra, pIdx->aSort
d030: 4f 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e 43 6f  Order, pIdx->nCo
d040: 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn);.  pIdx->a
d050: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
d060: 29 7a 45 78 74 72 61 3b 0a 20 20 70 49 64 78 2d  )zExtra;.  pIdx-
d070: 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20  >nColumn = N;.  
d080: 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 20  pIdx->isResized 
d090: 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
d0a0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
d0b0: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 74  * Estimate the t
d0c0: 6f 74 61 6c 20 72 6f 77 20 77 69 64 74 68 20 66  otal row width f
d0d0: 6f 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  or a table..*/.s
d0e0: 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d  tatic void estim
d0f0: 61 74 65 54 61 62 6c 65 57 69 64 74 68 28 54 61  ateTableWidth(Ta
d100: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 75 6e  ble *pTab){.  un
d110: 73 69 67 6e 65 64 20 77 54 61 62 6c 65 20 3d 20  signed wTable = 
d120: 30 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d  0;.  const Colum
d130: 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 69 6e  n *pTabCol;.  in
d140: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61  t i;.  for(i=pTa
d150: 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43 6f 6c  b->nCol, pTabCol
d160: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30  =pTab->aCol; i>0
d170: 3b 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b  ; i--, pTabCol++
d180: 29 7b 0a 20 20 20 20 77 54 61 62 6c 65 20 2b 3d  ){.    wTable +=
d190: 20 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b   pTabCol->szEst;
d1a0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d  .  }.  if( pTab-
d1b0: 3e 69 50 4b 65 79 3c 30 20 29 20 77 54 61 62 6c  >iPKey<0 ) wTabl
d1c0: 65 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 54  e++;.  pTab->szT
d1d0: 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  abRow = sqlite3L
d1e0: 6f 67 45 73 74 28 77 54 61 62 6c 65 2a 34 29 3b  ogEst(wTable*4);
d1f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  .}../*.** Estima
d200: 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20 73  te the average s
d210: 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 66 6f 72  ize of a row for
d220: 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74   an index..*/.st
d230: 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61  atic void estima
d240: 74 65 49 6e 64 65 78 57 69 64 74 68 28 49 6e 64  teIndexWidth(Ind
d250: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73  ex *pIdx){.  uns
d260: 69 67 6e 65 64 20 77 49 6e 64 65 78 20 3d 20 30  igned wIndex = 0
d270: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  ;.  int i;.  con
d280: 73 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20  st Column *aCol 
d290: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
d2a0: 61 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aCol;.  for(i=0;
d2b0: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
d2c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31 36 20  ; i++){.    i16 
d2d0: 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  x = pIdx->aiColu
d2e0: 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  mn[i];.    asser
d2f0: 74 28 20 78 3c 70 49 64 78 2d 3e 70 54 61 62 6c  t( x<pIdx->pTabl
d300: 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 77  e->nCol );.    w
d310: 49 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f 20 31  Index += x<0 ? 1
d320: 20 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69   : aCol[pIdx->ai
d330: 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74  Column[i]].szEst
d340: 3b 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73 7a  ;.  }.  pIdx->sz
d350: 49 64 78 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  IdxRow = sqlite3
d360: 4c 6f 67 45 73 74 28 77 49 6e 64 65 78 2a 34 29  LogEst(wIndex*4)
d370: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  ;.}../* Return t
d380: 72 75 65 20 69 66 20 76 61 6c 75 65 20 78 20 69  rue if value x i
d390: 73 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66 20 74  s found any of t
d3a0: 68 65 20 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e  he first nCol en
d3b0: 74 72 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b 5d  tries of aiCol[]
d3c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
d3d0: 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69  asColumn(const i
d3e0: 31 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e  16 *aiCol, int n
d3f0: 43 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77  Col, int x){.  w
d400: 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30  hile( nCol-- > 0
d410: 20 29 20 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f   ) if( x==*(aiCo
d420: 6c 2b 2b 29 20 29 20 72 65 74 75 72 6e 20 31 3b  l++) ) return 1;
d430: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
d440: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
d450: 6e 65 20 72 75 6e 73 20 61 74 20 74 68 65 20 65  ne runs at the e
d460: 6e 64 20 6f 66 20 70 61 72 73 69 6e 67 20 61 20  nd of parsing a 
d470: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
d480: 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20 68  tement that.** h
d490: 61 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  as a WITHOUT ROW
d4a0: 49 44 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  ID clause.  The 
d4b0: 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
d4c0: 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76 65 72  ine is to conver
d4d0: 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72 6e  t both.** intern
d4e0: 61 6c 20 73 63 68 65 6d 61 20 64 61 74 61 20 73  al schema data s
d4f0: 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 74 68  tructures and th
d500: 65 20 67 65 6e 65 72 61 74 65 64 20 56 44 42 45  e generated VDBE
d510: 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20 74 68   code so that th
d520: 65 79 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f 70  ey.** are approp
d530: 72 69 61 74 65 20 66 6f 72 20 61 20 57 49 54 48  riate for a WITH
d540: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20  OUT ROWID table 
d550: 69 6e 73 74 65 61 64 20 6f 66 20 61 20 72 6f 77  instead of a row
d560: 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68 61  id table..** Cha
d570: 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a  nges include:.**
d580: 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 53 65 74  .**     (1)  Set
d590: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   all columns of 
d5a0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d5b0: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f  schema object to
d5c0: 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a   be NOT NULL..**
d5d0: 20 20 20 20 20 28 32 29 20 20 43 6f 6e 76 65 72       (2)  Conver
d5e0: 74 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 54  t the OP_CreateT
d5f0: 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f  able into an OP_
d600: 43 72 65 61 74 65 49 6e 64 65 78 2e 20 20 54 68  CreateIndex.  Th
d610: 65 72 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20  ere is.**       
d620: 20 20 20 6e 6f 20 72 6f 77 69 64 20 62 74 72 65     no rowid btre
d630: 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20  e for a WITHOUT 
d640: 52 4f 57 49 44 2e 20 20 49 6e 73 74 65 61 64 2c  ROWID.  Instead,
d650: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a   the canonical.*
d660: 2a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20  *          data 
d670: 73 74 6f 72 61 67 65 20 69 73 20 61 20 63 6f 76  storage is a cov
d680: 65 72 69 6e 67 20 69 6e 64 65 78 20 62 74 72 65  ering index btre
d690: 65 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 42  e..**     (3)  B
d6a0: 79 70 61 73 73 20 74 68 65 20 63 72 65 61 74 69  ypass the creati
d6b0: 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  on of the sqlite
d6c0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e  _master table en
d6d0: 74 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  try.**          
d6e0: 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59 20  for the PRIMARY 
d6f0: 4b 45 59 20 61 73 20 74 68 65 20 70 72 69 6d 61  KEY as the prima
d700: 72 79 20 6b 65 79 20 69 6e 64 65 78 20 69 73 20  ry key index is 
d710: 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  now.**          
d720: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
d730: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
d740: 74 61 62 6c 65 20 65 6e 74 72 79 20 6f 66 20 74  table entry of t
d750: 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e  he table itself.
d760: 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53 65 74  .**     (4)  Set
d770: 20 74 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d 20   the Index.tnum 
d780: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
d790: 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  EY Index object 
d7a0: 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
d7b0: 20 20 20 73 63 68 65 6d 61 20 74 6f 20 74 68 65     schema to the
d7c0: 20 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20 74   rootpage from t
d7d0: 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a  he main table..*
d7e0: 2a 20 20 20 20 20 28 35 29 20 20 41 64 64 20 61  *     (5)  Add a
d7f0: 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  ll table columns
d800: 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20   to the PRIMARY 
d810: 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  KEY Index object
d820: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f 20  .**          so 
d830: 74 68 61 74 20 74 68 65 20 50 52 49 4d 41 52 59  that the PRIMARY
d840: 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72 69   KEY is a coveri
d850: 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20 73  ng index.  The s
d860: 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20 20  urplus.**       
d870: 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70     columns are p
d880: 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e 6e  art of KeyInfo.n
d890: 58 46 69 65 6c 64 20 61 6e 64 20 61 72 65 20 6e  XField and are n
d8a0: 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20  ot used for.**  
d8b0: 20 20 20 20 20 20 20 20 73 6f 72 74 69 6e 67 20          sorting 
d8c0: 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e 69  or lookup or uni
d8d0: 71 75 65 6e 65 73 73 20 63 68 65 63 6b 73 2e 0a  queness checks..
d8e0: 2a 2a 20 20 20 20 20 28 36 29 20 20 52 65 70 6c  **     (6)  Repl
d8f0: 61 63 65 20 74 68 65 20 72 6f 77 69 64 20 74 61  ace the rowid ta
d900: 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d 61  il on all automa
d910: 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  tically generate
d920: 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20 20 20  d UNIQUE.**     
d930: 20 20 20 20 20 69 6e 64 69 63 65 73 20 77 69 74       indices wit
d940: 68 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  h the PRIMARY KE
d950: 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a  Y columns..**.**
d960: 20 46 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62   For virtual tab
d970: 6c 65 73 2c 20 6f 6e 6c 79 20 28 31 29 20 69 73  les, only (1) is
d980: 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73   performed..*/.s
d990: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 76 65  tatic void conve
d9a0: 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64  rtToWithoutRowid
d9b0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
d9c0: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
d9d0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  ){.  Index *pIdx
d9e0: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 0a  ;.  Index *pPk;.
d9f0: 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e 74    int nPk;.  int
da00: 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33   i, j;.  sqlite3
da10: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
da20: 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  b;.  Vdbe *v = p
da30: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20  Parse->pVdbe;.. 
da40: 20 2f 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 50   /* Mark every P
da50: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
da60: 6e 20 61 73 20 4e 4f 54 20 4e 55 4c 4c 20 28 65  n as NOT NULL (e
da70: 78 63 65 70 74 20 66 6f 72 20 69 6d 70 6f 73 74  xcept for impost
da80: 65 72 20 74 61 62 6c 65 73 29 0a 20 20 2a 2f 0a  er tables).  */.
da90: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
daa0: 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29 7b  imposterTable ){
dab0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
dac0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
dad0: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61  {.      if( (pTa
dae0: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c  b->aCol[i].colFl
daf0: 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52  ags & COLFLAG_PR
db00: 49 4d 4b 45 59 29 21 3d 30 20 29 7b 0a 20 20 20  IMKEY)!=0 ){.   
db10: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
db20: 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 4f 45 5f  i].notNull = OE_
db30: 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Abort;.      }. 
db40: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
db50: 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 72 61  he remaining tra
db60: 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 20 6f 6e 6c  nsformations onl
db70: 79 20 61 70 70 6c 79 20 74 6f 20 62 2d 74 72 65  y apply to b-tre
db80: 65 20 74 61 62 6c 65 73 2c 20 6e 6f 74 20 74 6f  e tables, not to
db90: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  .  ** virtual ta
dba0: 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 49 4e  bles */.  if( IN
dbb0: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20  _DECLARE_VTAB ) 
dbc0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 43 6f  return;..  /* Co
dbd0: 6e 76 65 72 74 20 74 68 65 20 4f 50 5f 43 72 65  nvert the OP_Cre
dbe0: 61 74 65 54 61 62 6c 65 20 6f 70 63 6f 64 65 20  ateTable opcode 
dbf0: 74 68 61 74 20 77 6f 75 6c 64 20 6e 6f 72 6d 61  that would norma
dc00: 6c 6c 79 20 63 72 65 61 74 65 20 74 68 65 0a 20  lly create the. 
dc10: 20 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 66 6f   ** root-page fo
dc20: 72 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f  r the table into
dc30: 20 61 6e 20 4f 50 5f 43 72 65 61 74 65 49 6e 64   an OP_CreateInd
dc40: 65 78 20 6f 70 63 6f 64 65 2e 20 20 54 68 65 20  ex opcode.  The 
dc50: 69 6e 64 65 78 0a 20 20 2a 2a 20 63 72 65 61 74  index.  ** creat
dc60: 65 64 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ed will become t
dc70: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
dc80: 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ndex..  */.  if(
dc90: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54   pParse->addrCrT
dca0: 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
dcb0: 28 20 76 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ( v );.    sqlit
dcc0: 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f  e3VdbeChangeOpco
dcd0: 64 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64  de(v, pParse->ad
dce0: 64 72 43 72 54 61 62 2c 20 4f 50 5f 43 72 65 61  drCrTab, OP_Crea
dcf0: 74 65 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20  teIndex);.  }.. 
dd00: 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 50   /* Locate the P
dd10: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
dd20: 2e 20 20 4f 72 2c 20 69 66 20 74 68 69 73 20 74  .  Or, if this t
dd30: 61 62 6c 65 20 77 61 73 20 6f 72 69 67 69 6e 61  able was origina
dd40: 6c 6c 79 0a 20 20 2a 2a 20 61 6e 20 49 4e 54 45  lly.  ** an INTE
dd50: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
dd60: 74 61 62 6c 65 2c 20 63 72 65 61 74 65 20 61 20  table, create a 
dd70: 6e 65 77 20 50 52 49 4d 41 52 59 20 4b 45 59 20  new PRIMARY KEY 
dd80: 69 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a 20 20 69  index. .  */.  i
dd90: 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d  f( pTab->iPKey>=
dda0: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  0 ){.    ExprLis
ddb0: 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 54 6f  t *pList;.    To
ddc0: 6b 65 6e 20 69 70 6b 54 6f 6b 65 6e 3b 0a 20 20  ken ipkToken;.  
ddd0: 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e    sqlite3TokenIn
dde0: 69 74 28 26 69 70 6b 54 6f 6b 65 6e 2c 20 70 54  it(&ipkToken, pT
ddf0: 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69  ab->aCol[pTab->i
de00: 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  PKey].zName);.  
de10: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
de20: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
de30: 70 50 61 72 73 65 2c 20 30 2c 20 0a 20 20 20 20  pParse, 0, .    
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
de50: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
de60: 62 2c 20 54 4b 5f 49 44 2c 20 26 69 70 6b 54 6f  b, TK_ID, &ipkTo
de70: 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 69 66  ken, 0));.    if
de80: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
de90: 75 72 6e 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  urn;.    pList->
dea0: 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
deb0: 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74   pParse->iPkSort
dec0: 4f 72 64 65 72 3b 0a 20 20 20 20 61 73 73 65 72  Order;.    asser
ded0: 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  t( pParse->pNewT
dee0: 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20  able==pTab );.  
def0: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49    sqlite3CreateI
df00: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20  ndex(pParse, 0, 
df10: 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 70 54 61  0, 0, pList, pTa
df20: 62 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c 20 30  b->keyConf, 0, 0
df30: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
df50: 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52  QLITE_IDXTYPE_PR
df60: 49 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20 20 69  IMARYKEY);.    i
df70: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
df80: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
df90: 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50    pPk = sqlite3P
dfa0: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
dfb0: 54 61 62 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  Tab);.    pTab->
dfc0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 7d 65  iPKey = -1;.  }e
dfd0: 6c 73 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73  lse{.    pPk = s
dfe0: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
dff0: 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 0a 20 20  Index(pTab);..  
e000: 20 20 2f 2a 20 42 79 70 61 73 73 20 74 68 65 20    /* Bypass the 
e010: 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  creation of the 
e020: 50 52 49 4d 41 52 59 20 4b 45 59 20 62 74 72 65  PRIMARY KEY btre
e030: 65 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65  e and the sqlite
e040: 5f 6d 61 73 74 65 72 0a 20 20 20 20 2a 2a 20 74  _master.    ** t
e050: 61 62 6c 65 20 65 6e 74 72 79 2e 20 54 68 69 73  able entry. This
e060: 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65   is only require
e070: 64 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 67  d if currently g
e080: 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 0a 20  enerating VDBE. 
e090: 20 20 20 2a 2a 20 63 6f 64 65 20 66 6f 72 20 61     ** code for a
e0a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 28 6e   CREATE TABLE (n
e0b0: 6f 74 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  ot when parsing 
e0c0: 6f 6e 65 20 61 73 20 70 61 72 74 20 6f 66 20 72  one as part of r
e0d0: 65 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 61 20  eading.    ** a 
e0e0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 29  database schema)
e0f0: 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 76 20  .  */.    if( v 
e100: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
e110: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
e120: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
e130: 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f  e3VdbeChangeOpco
e140: 64 65 28 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d 2c  de(v, pPk->tnum,
e150: 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 7d   OP_Goto);.    }
e160: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
e170: 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 64 75 6e  Remove all redun
e180: 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  dant columns fro
e190: 6d 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  m the PRIMARY KE
e1a0: 59 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  Y.  For example,
e1b0: 20 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 22   change.    ** "
e1c0: 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c  PRIMARY KEY(a,b,
e1d0: 61 2c 62 2c 63 2c 62 2c 63 2c 64 29 22 20 69 6e  a,b,c,b,c,d)" in
e1e0: 74 6f 20 6a 75 73 74 20 22 50 52 49 4d 41 52 59  to just "PRIMARY
e1f0: 20 4b 45 59 28 61 2c 62 2c 63 2c 64 29 22 2e 20   KEY(a,b,c,d)". 
e200: 20 4c 61 74 65 72 0a 20 20 20 20 2a 2a 20 63 6f   Later.    ** co
e210: 64 65 20 61 73 73 75 6d 65 73 20 74 68 65 20 50  de assumes the P
e220: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 74 61  RIMARY KEY conta
e230: 69 6e 73 20 6e 6f 20 72 65 70 65 61 74 65 64 20  ins no repeated 
e240: 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a  columns..    */.
e250: 20 20 20 20 66 6f 72 28 69 3d 6a 3d 31 3b 20 69      for(i=j=1; i
e260: 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  <pPk->nKeyCol; i
e270: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68  ++){.      if( h
e280: 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69  asColumn(pPk->ai
e290: 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e  Column, j, pPk->
e2a0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a  aiColumn[i]) ){.
e2b0: 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e 43 6f          pPk->nCo
e2c0: 6c 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65  lumn--;.      }e
e2d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 6b  lse{.        pPk
e2e0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20  ->aiColumn[j++] 
e2f0: 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  = pPk->aiColumn[
e300: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
e310: 7d 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b 65 79 43  }.    pPk->nKeyC
e320: 6f 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20 61 73  ol = j;.  }.  as
e330: 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a  sert( pPk!=0 );.
e340: 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72 69 6e    pPk->isCoverin
e350: 67 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 64 62  g = 1;.  if( !db
e360: 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54  ->init.imposterT
e370: 61 62 6c 65 20 29 20 70 50 6b 2d 3e 75 6e 69 71  able ) pPk->uniq
e380: 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 6e  NotNull = 1;.  n
e390: 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  Pk = pPk->nKeyCo
e3a0: 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 6f 6f  l;..  /* The roo
e3b0: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 50 52  t page of the PR
e3c0: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 74 68 65  IMARY KEY is the
e3d0: 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65   table root page
e3e0: 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d 20   */.  pPk->tnum 
e3f0: 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20  = pTab->tnum;.. 
e400: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 69   /* Update the i
e410: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
e420: 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 55  ntation of all U
e430: 4e 49 51 55 45 20 69 6e 64 69 63 65 73 20 62 79  NIQUE indices by
e440: 20 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20 2a 2a   converting.  **
e450: 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64   the final rowid
e460: 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65   column into one
e470: 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73   or more columns
e480: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
e490: 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  KEY..  */.  for(
e4a0: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
e4b0: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
e4c0: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
e4d0: 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 49  int n;.    if( I
e4e0: 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
e4f0: 28 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75  (pIdx) ) continu
e500: 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30  e;.    for(i=n=0
e510: 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20  ; i<nPk; i++){. 
e520: 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c       if( !hasCol
e530: 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75  umn(pIdx->aiColu
e540: 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  mn, pIdx->nKeyCo
e550: 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  l, pPk->aiColumn
e560: 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20 20 20  [i]) ) n++;.    
e570: 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29  }.    if( n==0 )
e580: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
e590: 69 6e 64 65 78 20 69 73 20 61 20 73 75 70 65 72  index is a super
e5a0: 73 65 74 20 6f 66 20 74 68 65 20 70 72 69 6d 61  set of the prima
e5b0: 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20  ry key */.      
e5c0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20  pIdx->nColumn = 
e5d0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20  pIdx->nKeyCol;. 
e5e0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
e5f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73     }.    if( res
e600: 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64  izeIndexObject(d
e610: 62 2c 20 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e  b, pIdx, pIdx->n
e620: 4b 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65 74 75  KeyCol+n) ) retu
e630: 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  rn;.    for(i=0,
e640: 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   j=pIdx->nKeyCol
e650: 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20  ; i<nPk; i++){. 
e660: 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c       if( !hasCol
e670: 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75  umn(pIdx->aiColu
e680: 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  mn, pIdx->nKeyCo
e690: 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  l, pPk->aiColumn
e6a0: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
e6b0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
e6c0: 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ] = pPk->aiColum
e6d0: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70 49  n[i];.        pI
e6e0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20  dx->azColl[j] = 
e6f0: 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  pPk->azColl[i];.
e700: 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
e710: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
e720: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
e730: 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79  lumn>=pIdx->nKey
e740: 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61 73 73  Col+n );.    ass
e750: 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
e760: 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20  mn>=j );.  }..  
e770: 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65  /* Add all table
e780: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
e790: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
e7a0: 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 6b  x.  */.  if( nPk
e7b0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  <pTab->nCol ){. 
e7c0: 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64     if( resizeInd
e7d0: 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 50 6b  exObject(db, pPk
e7e0: 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 20  , pTab->nCol) ) 
e7f0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28  return;.    for(
e800: 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54  i=0, j=nPk; i<pT
e810: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
e820: 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f        if( !hasCo
e830: 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75  lumn(pPk->aiColu
e840: 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20 20 20  mn, j, i) ){.   
e850: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70       assert( j<p
e860: 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  Pk->nColumn );. 
e870: 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f         pPk->aiCo
e880: 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20  lumn[j] = i;.   
e890: 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c       pPk->azColl
e8a0: 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72  [j] = sqlite3Str
e8b0: 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 20 20  BINARY;.        
e8c0: 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j++;.      }.   
e8d0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
e8e0: 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29  Pk->nColumn==j )
e8f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
e900: 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20  ab->nCol==j );. 
e910: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 2d   }else{.    pPk-
e920: 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d  >nColumn = pTab-
e930: 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  >nCol;.  }.}../*
e940: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e950: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
e960: 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22  port the final "
e970: 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  )" that terminat
e980: 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54  es.** a CREATE T
e990: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
e9a0: 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
e9b0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f  structure that o
e9c0: 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74  ther action rout
e9d0: 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62  ines have been b
e9e0: 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64  uilding.** is ad
e9f0: 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ded to the inter
ea00: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c  nal hash tables,
ea10: 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   assuming no err
ea20: 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75  ors have.** occu
ea30: 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  rred..**.** An e
ea40: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62  ntry for the tab
ea50: 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68  le is made in th
ea60: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f  e master table o
ea70: 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a  n disk, unless.*
ea80: 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  * this is a temp
ea90: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64  orary table or d
eaa0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e  b->init.busy==1.
eab0: 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e    When db->init.
eac0: 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65  busy==1.** it me
ead0: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
eae0: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
eaf0: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
eb00: 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f  se we just.** co
eb10: 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64  nnected to the d
eb20: 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75  atabase or becau
eb30: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  se the sqlite_ma
eb40: 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a  ster table has.*
eb50: 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67  * recently chang
eb60: 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79  ed, so the entry
eb70: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
eb80: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
eb90: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
eba0: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57  master table.  W
ebb0: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
ebc0: 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e   create it again
ebd0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
ebe0: 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20  Select argument 
ebf0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
ec00: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
ec10: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63  routine.** was c
ec20: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
ec30: 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  a table generate
ec40: 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52  d from a .** "CR
ec50: 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41  EATE TABLE ... A
ec60: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74  S SELECT ..." st
ec70: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f  atement.  The co
ec80: 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a  lumn names of.**
ec90: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77   the new table w
eca0: 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65  ill match the re
ecb0: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
ecc0: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
ecd0: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
ece0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ecf0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
ed00: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
ed10: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20   Token *pCons,  
ed20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
ed30: 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20  ',' token after 
ed40: 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
ed50: 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  defn. */.  Token
ed60: 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20   *pEnd,         
ed70: 20 20 20 2f 2a 20 54 68 65 20 27 29 27 20 62 65     /* The ')' be
ed80: 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69 6e 20  fore options in 
ed90: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
eda0: 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70 74 73   */.  u8 tabOpts
edb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
edc0: 20 45 78 74 72 61 20 74 61 62 6c 65 20 6f 70 74   Extra table opt
edd0: 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20 30 2e  ions. Usually 0.
ede0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
edf0: 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a  elect         /*
ee00: 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22   Select from a "
ee10: 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45  CREATE ... AS SE
ee20: 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61  LECT" */.){.  Ta
ee30: 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ble *p;         
ee40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
ee50: 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ew table */.  sq
ee60: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
ee70: 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64  se->db; /* The d
ee80: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
ee90: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  on */.  int iDb;
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eeb0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e    /* Database in
eec0: 20 77 68 69 63 68 20 74 68 65 20 74 61 62 6c 65   which the table
eed0: 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e 64 65   lives */.  Inde
eee0: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
eef0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d 70 6c        /* An impl
ef00: 69 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65  ied index of the
ef10: 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28   table */..  if(
ef20: 20 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c   pEnd==0 && pSel
ef30: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ect==0 ){.    re
ef40: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
ef50: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
ef60: 61 69 6c 65 64 20 29 3b 0a 20 20 70 20 3d 20 70  ailed );.  p = p
ef70: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
ef80: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
ef90: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
efa0: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
efb0: 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a   || !pSelect );.
efc0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d  .  /* If the db-
efd0: 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20  >init.busy is 1 
efe0: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
eff0: 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20  reading the SQL 
f000: 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71  off the.  ** "sq
f010: 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20  lite_master" or 
f020: 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73  "sqlite_temp_mas
f030: 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68  ter" table on th
f040: 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20  e disk..  ** So 
f050: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  do not write to 
f060: 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20  the disk again. 
f070: 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f   Extract the roo
f080: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  t page number.  
f090: 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ** for the table
f0a0: 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e   from the db->in
f0b0: 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64  it.newTnum field
f0c0: 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d  .  (The page num
f0d0: 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  ber.  ** should 
f0e0: 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68  have been put th
f0f0: 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74  ere by the sqlit
f100: 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e  eOpenCb routine.
f110: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ).  **.  ** If t
f120: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
f130: 62 65 72 20 69 73 20 31 2c 20 74 68 61 74 20 6d  ber is 1, that m
f140: 65 61 6e 73 20 74 68 69 73 20 69 73 20 74 68 65  eans this is the
f150: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20   sqlite_master. 
f160: 20 2a 2a 20 74 61 62 6c 65 20 69 74 73 65 6c 66   ** table itself
f170: 2e 20 20 53 6f 20 6d 61 72 6b 20 69 74 20 72 65  .  So mark it re
f180: 61 64 2d 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ad-only..  */.  
f190: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
f1a0: 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d  y ){.    p->tnum
f1b0: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
f1c0: 6e 75 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  num;.    if( p->
f1d0: 74 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e 74 61 62  tnum==1 ) p->tab
f1e0: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 52 65 61 64  Flags |= TF_Read
f1f0: 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  only;.  }..  /* 
f200: 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69  Special processi
f210: 6e 67 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  ng for WITHOUT R
f220: 4f 57 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20  OWID Tables */. 
f230: 20 69 66 28 20 74 61 62 4f 70 74 73 20 26 20 54   if( tabOpts & T
f240: 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 29  F_WithoutRowid )
f250: 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61  {.    if( (p->ta
f260: 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
f270: 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20  increment) ){.  
f280: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f290: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
f2a0: 20 20 20 20 20 20 22 41 55 54 4f 49 4e 43 52 45        "AUTOINCRE
f2b0: 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  MENT not allowed
f2c0: 20 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49   on WITHOUT ROWI
f2d0: 44 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20  D tables");.    
f2e0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
f2f0: 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46      if( (p->tabF
f300: 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69  lags & TF_HasPri
f310: 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20  maryKey)==0 ){. 
f320: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
f330: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 50 52  rMsg(pParse, "PR
f340: 49 4d 41 52 59 20 4b 45 59 20 6d 69 73 73 69 6e  IMARY KEY missin
f350: 67 20 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c 20  g on table %s", 
f360: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  p->zName);.    }
f370: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74  else{.      p->t
f380: 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69  abFlags |= TF_Wi
f390: 74 68 6f 75 74 52 6f 77 69 64 20 7c 20 54 46 5f  thoutRowid | TF_
f3a0: 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a  NoVisibleRowid;.
f3b0: 20 20 20 20 20 20 63 6f 6e 76 65 72 74 54 6f 57        convertToW
f3c0: 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65  ithoutRowidTable
f3d0: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
f3e0: 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62 20 3d 20   }.  }..  iDb = 
f3f0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
f400: 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68  ndex(db, p->pSch
f410: 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ema);..#ifndef S
f420: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
f430: 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61  .  /* Resolve na
f440: 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b  mes in all CHECK
f450: 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72   constraint expr
f460: 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  essions..  */.  
f470: 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b  if( p->pCheck ){
f480: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
f490: 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65  lveSelfReference
f4a0: 28 70 50 61 72 73 65 2c 20 70 2c 20 4e 43 5f 49  (pParse, p, NC_I
f4b0: 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e 70 43  sCheck, 0, p->pC
f4c0: 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  heck);.  }.#endi
f4d0: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
f4e0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29  LITE_OMIT_CHECK)
f4f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61   */..  /* Estima
f500: 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20 72  te the average r
f510: 6f 77 20 73 69 7a 65 20 66 6f 72 20 74 68 65 20  ow size for the 
f520: 74 61 62 6c 65 20 61 6e 64 20 66 6f 72 20 61 6c  table and for al
f530: 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64 69 63 65  l implied indice
f540: 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61 74 65 54  s */.  estimateT
f550: 61 62 6c 65 57 69 64 74 68 28 70 29 3b 0a 20 20  ableWidth(p);.  
f560: 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64  for(pIdx=p->pInd
f570: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
f580: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
f590: 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69   estimateIndexWi
f5a0: 64 74 68 28 70 49 64 78 29 3b 0a 20 20 7d 0a 0a  dth(pIdx);.  }..
f5b0: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74    /* If not init
f5c0: 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63  ializing, then c
f5d0: 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66  reate a record f
f5e0: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
f5f0: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c  .  ** in the SQL
f600: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
f610: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
f620: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
f630: 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41  his is a TEMPORA
f640: 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20  RY table, write 
f650: 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74  the entry into t
f660: 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  he auxiliary.  *
f670: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
f680: 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  f into the main 
f690: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
f6a0: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
f6b0: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
f6c0: 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20  int n;.    Vdbe 
f6d0: 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  *v;.    char *zT
f6e0: 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77  ype;    /* "view
f6f0: 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a  " or "table" */.
f700: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32      char *zType2
f710: 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72  ;   /* "VIEW" or
f720: 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20   "TABLE" */.    
f730: 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20  char *zStmt;    
f740: 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 43  /* Text of the C
f750: 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43  REATE TABLE or C
f760: 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
f770: 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d  ment */..    v =
f780: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
f790: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
f7a0: 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
f7b0: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69  eturn;..    sqli
f7c0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
f7d0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a   OP_Close, 0);..
f7e0: 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49      /* .    ** I
f7f0: 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20  nitialize zType 
f800: 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 65 77  for the new view
f810: 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a   or table..    *
f820: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65  /.    if( p->pSe
f830: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lect==0 ){.     
f840: 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61   /* A regular ta
f850: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  ble */.      zTy
f860: 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20  pe = "table";.  
f870: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41      zType2 = "TA
f880: 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51  BLE";.#ifndef SQ
f890: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
f8a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f8b0: 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20  /* A view */.   
f8c0: 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77     zType = "view
f8d0: 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20  ";.      zType2 
f8e0: 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66  = "VIEW";.#endif
f8f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
f900: 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41  f this is a CREA
f910: 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53  TE TABLE xx AS S
f920: 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75  ELECT ..., execu
f930: 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  te the SELECT.  
f940: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
f950: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e  o populate the n
f960: 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f  ew table. The ro
f970: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66  ot-page number f
f980: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65  or the.    ** ne
f990: 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20 72 65  w table is in re
f9a0: 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72  gister pParse->r
f9b0: 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20  egRoot..    **. 
f9c0: 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53     ** Once the S
f9d0: 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63  ELECT has been c
f9e0: 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33 53  oded by sqlite3S
f9f0: 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20 69  elect(), it is i
fa00: 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61  n a.    ** suita
fa10: 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75 65  ble state to que
fa20: 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
fa30: 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65  n names and type
fa40: 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20  s to be used.   
fa50: 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74   ** by the new t
fa60: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  able..    **.   
fa70: 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63   ** A shared-cac
fa80: 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73  he write-lock is
fa90: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f   not required to
faa0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65   write to the ne
fab0: 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20  w table,.    ** 
fac0: 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  as a schema-lock
fad0: 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
fae0: 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  dy been obtained
faf0: 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53   to create it. S
fb00: 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63  ince.    ** a sc
fb10: 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64  hema-lock exclud
fb20: 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74  es all other dat
fb30: 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68 65  abase users, the
fb40: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c   write-lock woul
fb50: 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75  d.    ** be redu
fb60: 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ndant..    */.  
fb70: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
fb80: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
fb90: 74 20 64 65 73 74 3b 20 20 20 20 2f 2a 20 57 68  t dest;    /* Wh
fba0: 65 72 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ere the SELECT s
fbb0: 68 6f 75 6c 64 20 73 74 6f 72 65 20 72 65 73 75  hould store resu
fbc0: 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  lts */.      int
fbd0: 20 72 65 67 59 69 65 6c 64 3b 20 20 20 20 20 20   regYield;      
fbe0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
fbf0: 64 69 6e 67 20 63 6f 2d 72 6f 75 74 69 6e 65 20  ding co-routine 
fc00: 65 6e 74 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20  entry-point */. 
fc10: 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
fc20: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20  ;        /* Top 
fc30: 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  of the co-routin
fc40: 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  e */.      int r
fc50: 65 67 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f  egRec;         /
fc60: 2a 20 41 20 72 65 63 6f 72 64 20 74 6f 20 62 65  * A record to be
fc70: 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 68 65   insert into the
fc80: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
fc90: 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64      int regRowid
fca0: 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64  ;       /* Rowid
fcb0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 72 6f 77   of the next row
fcc0: 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20   to insert */.  
fcd0: 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e 73 4c      int addrInsL
fce0: 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 6f 70 20 6f  oop;    /* Top o
fcf0: 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 69  f the loop for i
fd00: 6e 73 65 72 74 69 6e 67 20 72 6f 77 73 20 2a 2f  nserting rows */
fd10: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53  .      Table *pS
fd20: 65 6c 54 61 62 3b 20 20 20 20 20 2f 2a 20 41 20  elTab;     /* A 
fd30: 74 61 62 6c 65 20 74 68 61 74 20 64 65 73 63 72  table that descr
fd40: 69 62 65 73 20 74 68 65 20 53 45 4c 45 43 54 20  ibes the SELECT 
fd50: 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 20 20  results */..    
fd60: 20 20 72 65 67 59 69 65 6c 64 20 3d 20 2b 2b 70    regYield = ++p
fd70: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
fd80: 20 20 20 72 65 67 52 65 63 20 3d 20 2b 2b 70 50     regRec = ++pP
fd90: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
fda0: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70    regRowid = ++p
fdb0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
fdc0: 20 20 20 61 73 73 65 72 74 28 70 50 61 72 73 65     assert(pParse
fdd0: 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20  ->nTab==1);.    
fde0: 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
fdf0: 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  t(pParse);.     
fe00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fe10: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p3(v, OP_OpenWri
fe20: 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72  te, 1, pParse->r
fe30: 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20  egRoot, iDb);.  
fe40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
fe50: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
fe60: 47 5f 50 32 49 53 52 45 47 29 3b 0a 20 20 20 20  G_P2ISREG);.    
fe70: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
fe80: 20 32 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f   2;.      addrTo
fe90: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
fea0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
feb0: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
fec0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
fed0: 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
fee0: 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 61 64 64  regYield, 0, add
fef0: 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  rTop);.      sql
ff00: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
ff10: 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f  it(&dest, SRT_Co
ff20: 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c  routine, regYiel
ff30: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
ff40: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
ff50: 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b  pSelect, &dest);
ff60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ff70: 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76  beEndCoroutine(v
ff80: 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20  , regYield);.   
ff90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
ffa0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f  mpHere(v, addrTo
ffb0: 70 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 69 66  p - 1);.      if
ffc0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
ffd0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 70   return;.      p
ffe0: 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
fff0: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
10000 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
10010 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  t);.      if( pS
10020 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72  elTab==0 ) retur
10030 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
10040 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20   p->aCol==0 );. 
10050 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70       p->nCol = p
10060 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
10070 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53      p->aCol = pS
10080 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
10090 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
100a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c   = 0;.      pSel
100b0 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
100c0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
100d0 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c  teTable(db, pSel
100e0 54 61 62 29 3b 0a 20 20 20 20 20 20 61 64 64 72  Tab);.      addr
100f0 49 6e 73 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65  InsLoop = sqlite
10100 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
10110 50 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e 69 53  P_Yield, dest.iS
10120 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 56 64  DParm);.      Vd
10130 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
10140 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10150 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
10160 65 52 65 63 6f 72 64 2c 20 64 65 73 74 2e 69 53  eRecord, dest.iS
10170 64 73 74 2c 20 64 65 73 74 2e 6e 53 64 73 74 2c  dst, dest.nSdst,
10180 20 72 65 67 52 65 63 29 3b 0a 20 20 20 20 20 20   regRec);.      
10190 73 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66 69  sqlite3TableAffi
101a0 6e 69 74 79 28 76 2c 20 70 2c 20 30 29 3b 0a 20  nity(v, p, 0);. 
101b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
101c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
101d0 52 6f 77 69 64 2c 20 31 2c 20 72 65 67 52 6f 77  Rowid, 1, regRow
101e0 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
101f0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
10200 4f 50 5f 49 6e 73 65 72 74 2c 20 31 2c 20 72 65  OP_Insert, 1, re
10210 67 52 65 63 2c 20 72 65 67 52 6f 77 69 64 29 3b  gRec, regRowid);
10220 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10230 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 49 6e  beGoto(v, addrIn
10240 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71  sLoop);.      sq
10250 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
10260 65 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70  e(v, addrInsLoop
10270 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10280 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
10290 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20  _Close, 1);.    
102a0 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  }..    /* Comput
102b0 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  e the complete t
102c0 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
102d0 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
102e0 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
102f0 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  {.      zStmt = 
10300 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
10310 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73  db, p);.    }els
10320 65 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a  e{.      Token *
10330 70 45 6e 64 32 20 3d 20 74 61 62 4f 70 74 73 20  pEnd2 = tabOpts 
10340 3f 20 26 70 50 61 72 73 65 2d 3e 73 4c 61 73 74  ? &pParse->sLast
10350 54 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20  Token : pEnd;.  
10360 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45      n = (int)(pE
10370 6e 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d  nd2->z - pParse-
10380 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a  >sNameToken.z);.
10390 20 20 20 20 20 20 69 66 28 20 70 45 6e 64 32 2d        if( pEnd2-
103a0 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b  >z[0]!=';' ) n +
103b0 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20  = pEnd2->n;.    
103c0 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
103d0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20  3MPrintf(db, .  
103e0 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
103f0 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32  %s %.*s", zType2
10400 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61  , n, pParse->sNa
10410 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20  meToken.z.      
10420 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
10430 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20   A slot for the 
10440 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61  record has alrea
10450 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
10460 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a  d in the .    **
10470 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
10480 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e  able.  We just n
10490 65 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68  eed to update th
104a0 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c  at slot with all
104b0 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f  .    ** the info
104c0 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f  rmation we've co
104d0 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  llected..    */.
104e0 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
104f0 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
10500 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e       "UPDATE %Q.
10510 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53  %s ".         "S
10520 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61  ET type='%s', na
10530 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d  me=%Q, tbl_name=
10540 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25 64  %Q, rootpage=#%d
10550 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20  , sql=%Q ".     
10560 20 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23    "WHERE rowid=#
10570 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61  %d",.      db->a
10580 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
10590 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20  , MASTER_NAME,. 
105a0 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20       zType,.    
105b0 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
105c0 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
105d0 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f    pParse->regRoo
105e0 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a  t,.      zStmt,.
105f0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65        pParse->re
10600 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20  gRowid.    );.  
10610 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
10620 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20  db, zStmt);.    
10630 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
10640 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
10650 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
10660 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
10670 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63  MENT.    /* Chec
10680 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e  k to see if we n
10690 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e  eed to create an
106a0 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
106b0 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a   table for.    *
106c0 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20  * keeping track 
106d0 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  of autoincrement
106e0 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20   keys..    */.  
106f0 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61    if( (p->tabFla
10700 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
10710 65 6d 65 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20  ement)!=0 ){.   
10720 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
10730 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20  ->aDb[iDb];.    
10740 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10750 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
10760 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
10770 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
10780 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d  Schema->pSeqTab=
10790 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
107a0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
107b0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
107c0 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
107d0 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
107e0 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a  nce(name,seq)",.
107f0 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a            pDb->z
10800 44 62 53 4e 61 6d 65 0a 20 20 20 20 20 20 20 20  DbSName.        
10810 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10820 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
10830 52 65 70 61 72 73 65 20 65 76 65 72 79 74 68 69  Reparse everythi
10840 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72  ng to update our
10850 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73   internal data s
10860 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20  tructures */.   
10870 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
10880 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20  arseSchemaOp(v, 
10890 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
108a0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
108b0 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71  b, "tbl_name='%q
108c0 27 20 41 4e 44 20 74 79 70 65 21 3d 27 74 72 69  ' AND type!='tri
108d0 67 67 65 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65  gger'", p->zName
108e0 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ));.  }...  /* A
108f0 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  dd the table to 
10900 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
10910 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
10920 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
10930 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
10940 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54 61  t.busy ){.    Ta
10950 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53  ble *pOld;.    S
10960 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
10970 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20   p->pSchema;.   
10980 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10990 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
109a0 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
109b0 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65     pOld = sqlite
109c0 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53 63  3HashInsert(&pSc
109d0 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70  hema->tblHash, p
109e0 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a 20 20 20  ->zName, p);.   
109f0 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20   if( pOld ){.   
10a00 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f     assert( p==pO
10a10 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ld );  /* Malloc
10a20 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
10a30 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73  d inside HashIns
10a40 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 73  ert() */.      s
10a50 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
10a60 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  b);.      return
10a70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
10a80 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
10a90 30 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  0;.    db->flags
10aa0 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
10ab0 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64  nChanges;..#ifnd
10ac0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
10ad0 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66  LTERTABLE.    if
10ae0 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b  ( !p->pSelect ){
10af0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
10b00 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73  r *zName = (cons
10b10 74 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d  t char *)pParse-
10b20 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20  >sNameToken.z;. 
10b30 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a       int nName;.
10b40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
10b50 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20  Select && pCons 
10b60 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20  && pEnd );.     
10b70 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30   if( pCons->z==0
10b80 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e   ){.        pCon
10b90 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  s = pEnd;.      
10ba0 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20  }.      nName = 
10bb0 28 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61  (int)((const cha
10bc0 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a  r *)pCons->z - z
10bd0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Name);.      p->
10be0 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31  addColOffset = 1
10bf0 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43  3 + sqlite3Utf8C
10c00 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e  harLen(zName, nN
10c10 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ame);.    }.#end
10c20 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  if.  }.}..#ifnde
10c30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10c40 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72  EW./*.** The par
10c50 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
10c60 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20  outine in order 
10c70 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
10c80 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  VIEW.*/.void sql
10c90 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a  ite3CreateView(.
10ca0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10cb0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
10cc0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
10cd0 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20   Token *pBegin, 
10ce0 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
10cf0 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
10d00 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ins the statemen
10d10 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
10d20 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame1,     /* The
10d30 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
10d40 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
10d50 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  e view */.  Toke
10d60 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
10d70 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
10d80 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
10d90 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
10da0 20 45 78 70 72 4c 69 73 74 20 2a 70 43 4e 61 6d   ExprList *pCNam
10db0 65 73 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20  es, /* Optional 
10dc0 6c 69 73 74 20 6f 66 20 76 69 65 77 20 63 6f 6c  list of view col
10dd0 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 53  umn names */.  S
10de0 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
10df0 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
10e00 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c  atement that wil
10e10 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
10e20 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
10e30 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  sTemp,        /*
10e40 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50   TRUE for a TEMP
10e50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20  ORARY view */.  
10e60 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20  int noErr       
10e70 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65     /* Suppress e
10e80 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66  rror messages if
10e90 20 56 49 45 57 20 61 6c 72 65 61 64 79 20 65 78   VIEW already ex
10ea0 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ists */.){.  Tab
10eb0 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a  le *p;.  int n;.
10ec0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
10ed0 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20  .  Token sEnd;. 
10ee0 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20   DbFixer sFix;. 
10ef0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20   Token *pName = 
10f00 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20  0;.  int iDb;.  
10f10 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
10f20 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
10f30 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20   pParse->nVar>0 
10f40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
10f50 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
10f60 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e  parameters are n
10f70 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69  ot allowed in vi
10f80 65 77 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ews");.    goto 
10f90 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c  create_view_fail
10fa0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
10fb0 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65  tartTable(pParse
10fc0 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
10fd0 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20  , isTemp, 1, 0, 
10fe0 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50  noErr);.  p = pP
10ff0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
11000 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
11010 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
11020 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66  to create_view_f
11030 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54 77  ail;.  sqlite3Tw
11040 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
11050 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
11060 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62  , &pName);.  iDb
11070 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
11080 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
11090 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
110a0 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
110b0 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76   pParse, iDb, "v
110c0 69 65 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  iew", pName);.  
110d0 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 65  if( sqlite3FixSe
110e0 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c  lect(&sFix, pSel
110f0 65 63 74 29 20 29 20 67 6f 74 6f 20 63 72 65 61  ect) ) goto crea
11100 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20  te_view_fail;.. 
11110 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20   /* Make a copy 
11120 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45  of the entire SE
11130 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
11140 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
11150 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20  view..  ** This 
11160 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74  will force all t
11170 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20  he Expr.token.z 
11180 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e  values to be dyn
11190 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c  amically.  ** al
111a0 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74  located rather t
111b0 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  han point to the
111c0 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20   input string - 
111d0 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
111e0 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20  .  ** they will 
111f0 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68  persist after th
11200 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65  e current sqlite
11210 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65  3_exec() call re
11220 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d  turns..  */.  p-
11230 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
11240 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
11250 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50  pSelect, EXPRDUP
11260 5f 52 45 44 55 43 45 29 3b 0a 20 20 70 2d 3e 70  _REDUCE);.  p->p
11270 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  Check = sqlite3E
11280 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
11290 43 4e 61 6d 65 73 2c 20 45 58 50 52 44 55 50 5f  CNames, EXPRDUP_
112a0 52 45 44 55 43 45 29 3b 0a 20 20 69 66 28 20 64  REDUCE);.  if( d
112b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
112c0 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69  ) goto create_vi
112d0 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c  ew_fail;..  /* L
112e0 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  ocate the end of
112f0 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57   the CREATE VIEW
11300 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b   statement.  Mak
11310 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a  e sEnd point to.
11320 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20    ** the end..  
11330 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72  */.  sEnd = pPar
11340 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a  se->sLastToken;.
11350 20 20 61 73 73 65 72 74 28 20 73 45 6e 64 2e 7a    assert( sEnd.z
11360 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  [0]!=0 );.  if( 
11370 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29  sEnd.z[0]!=';' )
11380 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20  {.    sEnd.z += 
11390 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45  sEnd.n;.  }.  sE
113a0 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20  nd.n = 0;.  n = 
113b0 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70  (int)(sEnd.z - p
113c0 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 61 73 73  Begin->z);.  ass
113d0 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 7a 20  ert( n>0 );.  z 
113e0 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77  = pBegin->z;.  w
113f0 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73  hile( sqlite3Iss
11400 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20  pace(z[n-1]) ){ 
11410 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20  n--; }.  sEnd.z 
11420 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e  = &z[n-1];.  sEn
11430 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55  d.n = 1;..  /* U
11440 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  se sqlite3EndTab
11450 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20  le() to add the 
11460 76 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49  view to the SQLI
11470 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
11480 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54  */.  sqlite3EndT
11490 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20  able(pParse, 0, 
114a0 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 0a 63  &sEnd, 0, 0);..c
114b0 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3a  reate_view_fail:
114c0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
114d0 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
114e0 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ct);.  sqlite3Ex
114f0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
11500 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20 72 65 74   pCNames);.  ret
11510 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  urn;.}.#endif /*
11520 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
11530 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  W */..#if !defin
11540 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
11550 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
11560 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
11570 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a  TUALTABLE)./*.**
11580 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
11590 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72  ture pTable is r
115a0 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46  eally a VIEW.  F
115b0 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73  ill in the names
115c0 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   of.** the colum
115d0 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69  ns of the view i
115e0 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72  n the pTable str
115f0 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20  ucture.  Return 
11600 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
11610 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20   errors.  If an 
11620 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65  error is seen le
11630 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
11640 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
11650 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
11660 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
11670 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20  lumnNames(Parse 
11680 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
11690 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65  pTable){.  Table
116a0 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20   *pSelTab;   /* 
116b0 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f  A fake table fro
116c0 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74  m which we get t
116d0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
116e0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b  .  Select *pSel;
116f0 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
11700 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20  the SELECT that 
11710 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
11720 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72  iew */.  int nEr
11730 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  r = 0;     /* Nu
11740 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65  mber of errors e
11750 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20  ncountered */.  
11760 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
11770 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79    /* Temporarily
11780 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65   holds the numbe
11790 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73  r of cursors ass
117a0 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  igned */.  sqlit
117b0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
117c0 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  >db;  /* Databas
117d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72  e connection for
117e0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a   malloc errors *
117f0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
11800 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
11810 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f 78 61  ION.  sqlite3_xa
11820 75 74 68 20 78 41 75 74 68 3b 20 20 20 20 20 20  uth xAuth;      
11830 20 2f 2a 20 53 61 76 65 64 20 78 41 75 74 68 20   /* Saved xAuth 
11840 70 6f 69 6e 74 65 72 20 2a 2f 0a 23 65 6e 64 69  pointer */.#endi
11850 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  f..  assert( pTa
11860 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ble );..#ifndef 
11870 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
11880 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 73  UALTABLE.  if( s
11890 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43 6f  qlite3VtabCallCo
118a0 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70 54  nnect(pParse, pT
118b0 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  able) ){.    ret
118c0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
118d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69  ;.  }.  if( IsVi
118e0 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20  rtual(pTable) ) 
118f0 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
11900 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11910 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20  _OMIT_VIEW.  /* 
11920 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20  A positive nCol 
11930 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e  means the column
11940 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73  s names for this
11950 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61   view are.  ** a
11960 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20  lready known..  
11970 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
11980 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e  >nCol>0 ) return
11990 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61   0;..  /* A nega
119a0 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73  tive nCol is a s
119b0 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65  pecial marker me
119c0 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72  aning that we ar
119d0 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a  e currently.  **
119e0 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75   trying to compu
119f0 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  te the column na
11a00 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65  mes.  If we ente
11a10 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
11a20 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74  ith.  ** a negat
11a30 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61  ive nCol, it mea
11a40 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76  ns two or more v
11a50 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70  iews form a loop
11a60 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a  , like this:.  *
11a70 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  *.  **     CREAT
11a80 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45  E VIEW one AS SE
11a90 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b  LECT * FROM two;
11aa0 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
11ab0 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c   VIEW two AS SEL
11ac0 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a  ECT * FROM one;.
11ad0 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
11ae0 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61 62  ly, the error ab
11af0 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67 68  ove is now caugh
11b00 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68  t prior to reach
11b10 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a  ing this point..
11b20 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f 6c    ** But the fol
11b30 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20 73  lowing test is s
11b40 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61  till important a
11b50 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20 75  s it does come u
11b60 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f  p.  ** in the fo
11b70 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20  llowing:.  ** . 
11b80 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54   **     CREATE T
11b90 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61 29  ABLE main.ex1(a)
11ba0 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
11bb0 45 20 54 45 4d 50 20 56 49 45 57 20 65 78 31 20  E TEMP VIEW ex1 
11bc0 41 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  AS SELECT a FROM
11bd0 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53   ex1;.  **     S
11be0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d  ELECT * FROM tem
11bf0 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66  p.ex1;.  */.  if
11c00 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30  ( pTable->nCol<0
11c10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
11c20 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11c30 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63  "view %s is circ
11c40 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c  ularly defined",
11c50 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
11c60 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
11c70 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61   }.  assert( pTa
11c80 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a  ble->nCol>=0 );.
11c90 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
11ca0 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
11cb0 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f  ns we need to co
11cc0 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20  mpute the table 
11cd0 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65  names..  ** Note
11ce0 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74   that the call t
11cf0 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  o sqlite3ResultS
11d00 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c  etOfSelect() wil
11d10 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a  l expand any.  *
11d20 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69  * "*" elements i
11d30 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65  n the results se
11d40 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e  t of the view an
11d50 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75  d will assign cu
11d60 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68  rsors.  ** to th
11d70 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  e elements of th
11d80 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
11d90 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61  But we do not wa
11da0 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73  nt these changes
11db0 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d  .  ** to be perm
11dc0 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63  anent.  So the c
11dd0 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f  omputation is do
11de0 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20  ne on a copy of 
11df0 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20  the SELECT.  ** 
11e00 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
11e10 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
11e20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
11e30 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20  pTable->pSelect 
11e40 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69  );.  pSel = sqli
11e50 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
11e60 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
11e70 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  , 0);.  if( pSel
11e80 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 72   ){.    n = pPar
11e90 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71  se->nTab;.    sq
11ea0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
11eb0 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
11ec0 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20  , pSel->pSrc);. 
11ed0 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
11ee0 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  = -1;.    db->lo
11ef0 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65  okaside.bDisable
11f00 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
11f10 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
11f20 41 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20  ATION.    xAuth 
11f30 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20  = db->xAuth;.   
11f40 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a   db->xAuth = 0;.
11f50 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
11f60 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
11f70 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
11f80 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41  Sel);.    db->xA
11f90 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c  uth = xAuth;.#el
11fa0 73 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d  se.    pSelTab =
11fb0 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
11fc0 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
11fd0 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a  , pSel);.#endif.
11fe0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
11ff0 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 54   = n;.    if( pT
12000 61 62 6c 65 2d 3e 70 43 68 65 63 6b 20 29 7b 0a  able->pCheck ){.
12010 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20        /* CREATE 
12020 56 49 45 57 20 6e 61 6d 65 28 61 72 67 6c 69 73  VIEW name(arglis
12030 74 29 20 41 53 20 2e 2e 2e 0a 20 20 20 20 20 20  t) AS ....      
12040 2a 2a 20 54 68 65 20 6e 61 6d 65 73 20 6f 66 20  ** The names of 
12050 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  the columns in t
12060 68 65 20 74 61 62 6c 65 20 61 72 65 20 74 61 6b  he table are tak
12070 65 6e 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a  en from.      **
12080 20 61 72 67 6c 69 73 74 20 77 68 69 63 68 20 69   arglist which i
12090 73 20 73 74 6f 72 65 64 20 69 6e 20 70 54 61 62  s stored in pTab
120a0 6c 65 2d 3e 70 43 68 65 63 6b 2e 20 20 54 68 65  le->pCheck.  The
120b0 20 70 43 68 65 63 6b 20 66 69 65 6c 64 0a 20 20   pCheck field.  
120c0 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20      ** normally 
120d0 68 6f 6c 64 73 20 43 48 45 43 4b 20 63 6f 6e 73  holds CHECK cons
120e0 74 72 61 69 6e 74 73 20 6f 6e 20 61 6e 20 6f 72  traints on an or
120f0 64 69 6e 61 72 79 20 74 61 62 6c 65 2c 20 62 75  dinary table, bu
12100 74 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61  t for.      ** a
12110 20 56 49 45 57 20 69 74 20 68 6f 6c 64 73 20 74   VIEW it holds t
12120 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
12130 6e 20 6e 61 6d 65 73 2e 0a 20 20 20 20 20 20 2a  n names..      *
12140 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  /.      sqlite3C
12150 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
12160 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  st(pParse, pTabl
12170 65 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20  e->pCheck, .    
12180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12190 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54               &pT
121a0 61 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  able->nCol, &pTa
121b0 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  ble->aCol);.    
121c0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
121d0 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20  Failed==0 .     
121e0 20 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72    && pParse->nEr
121f0 72 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70  r==0.       && p
12200 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65  Table->nCol==pSe
12210 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l->pEList->nExpr
12220 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
12230 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
12240 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
12250 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
12260 20 70 54 61 62 6c 65 2c 20 70 53 65 6c 29 3b 0a   pTable, pSel);.
12270 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
12280 65 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b  e if( pSelTab ){
12290 0a 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45  .      /* CREATE
122a0 20 56 49 45 57 20 6e 61 6d 65 20 41 53 2e 2e 2e   VIEW name AS...
122b0 20 20 77 69 74 68 6f 75 74 20 61 6e 20 61 72 67    without an arg
122c0 75 6d 65 6e 74 20 6c 69 73 74 2e 20 20 43 6f 6e  ument list.  Con
122d0 73 74 72 75 63 74 0a 20 20 20 20 20 20 2a 2a 20  struct.      ** 
122e0 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
122f0 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54   from the SELECT
12300 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
12310 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
12320 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
12330 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
12340 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
12350 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
12360 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
12370 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43        pTable->aC
12380 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
12390 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61  ol;.      pSelTa
123a0 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
123b0 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
123c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
123d0 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
123e0 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
123f0 2c 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d  , pTable->pSchem
12400 61 29 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  a) );.    }else{
12410 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  .      pTable->n
12420 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  Col = 0;.      n
12430 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  Err++;.    }.   
12440 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
12450 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29  ble(db, pSelTab)
12460 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
12470 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
12480 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  el);.    db->loo
12490 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2d  kaside.bDisable-
124a0 2d 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  -;.  } else {.  
124b0 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20    nErr++;.  }.  
124c0 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
124d0 3e 73 63 68 65 6d 61 46 6c 61 67 73 20 7c 3d 20  >schemaFlags |= 
124e0 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b  DB_UnresetViews;
124f0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12500 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20  E_OMIT_VIEW */. 
12510 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a   return nErr;  .
12520 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
12530 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
12540 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
12550 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
12560 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a  IRTUALTABLE) */.
12570 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12580 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
12590 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
125a0 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72   names from ever
125b0 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61  y VIEW in databa
125c0 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69  se idx..*/.stati
125d0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65  c void sqliteVie
125e0 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65  wResetAll(sqlite
125f0 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b  3 *db, int idx){
12600 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a  .  HashElem *i;.
12610 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12620 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
12630 28 64 62 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a  (db, idx, 0) );.
12640 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70    if( !DbHasProp
12650 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
12660 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29  _UnresetViews) )
12670 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
12680 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
12690 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70  (&db->aDb[idx].p
126a0 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
126b0 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68  ; i;i=sqliteHash
126c0 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61  Next(i)){.    Ta
126d0 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
126e0 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
126f0 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
12700 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71  lect ){.      sq
12710 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d  lite3DeleteColum
12720 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29  nNames(db, pTab)
12730 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43  ;.      pTab->aC
12740 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54  ol = 0;.      pT
12750 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
12760 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61    }.  }.  DbClea
12770 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  rProperty(db, id
12780 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
12790 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  ws);.}.#else.# d
127a0 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77  efine sqliteView
127b0 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65  ResetAll(A,B).#e
127c0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
127d0 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a  MIT_VIEW */../*.
127e0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
127f0 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
12800 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74  e VDBE to adjust
12810 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63   the internal sc
12820 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20  hema.** used by 
12830 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20  SQLite when the 
12840 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65  btree layer move
12850 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70  s a table root p
12860 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74  age. The.** root
12870 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65  -page of a table
12880 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74   or index in dat
12890 61 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68  abase iDb has ch
128a0 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d  anged from iFrom
128b0 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a  .** to iTo..**.*
128c0 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20  * Ticket #1728: 
128d0 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c   The symbol tabl
128e0 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f  e might still co
128f0 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ntain informatio
12900 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61  n.** on tables a
12910 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68  nd/or indices th
12920 61 74 20 61 72 65 20 74 68 65 20 70 72 6f 63 65  at are the proce
12930 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65  ss of being dele
12940 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61  ted..** If you a
12950 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20  re unlucky, one 
12960 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64  of those deleted
12970 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c   indices or tabl
12980 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65  es might.** have
12990 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61   the same rootpa
129a0 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65  ge number as the
129b0 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69   real table or i
129c0 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20  ndex that is.** 
129d0 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f  being moved.  So
129e0 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20   we cannot stop 
129f0 73 65 61 72 63 68 69 6e 67 20 61 66 74 65 72 20  searching after 
12a00 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20  the first match 
12a10 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20  .** because the 
12a20 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68  first match migh
12a30 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20  t be for one of 
12a40 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69  the deleted indi
12a50 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73  ces.** or tables
12a60 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62   and not the tab
12a70 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73  le/index that is
12a80 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20   actually being 
12a90 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73  moved..** We mus
12aa0 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69  t continue loopi
12ab0 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62  ng until all tab
12ac0 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20  les and indices 
12ad0 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65  with.** rootpage
12ae0 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65  ==iFrom have bee
12af0 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68  n converted to h
12b00 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f  ave a rootpage o
12b10 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65  f iTo.** in orde
12b20 72 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20  r to be certain 
12b30 74 68 61 74 20 77 65 20 67 6f 74 20 74 68 65 20  that we got the 
12b40 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69  right one..*/.#i
12b50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12b60 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69  T_AUTOVACUUM.voi
12b70 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67  d sqlite3RootPag
12b80 65 4d 6f 76 65 64 28 73 71 6c 69 74 65 33 20 2a  eMoved(sqlite3 *
12b90 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  db, int iDb, int
12ba0 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29   iFrom, int iTo)
12bb0 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45  {.  HashElem *pE
12bc0 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61  lem;.  Hash *pHa
12bd0 73 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  sh;.  Db *pDb;..
12be0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12bf0 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
12c00 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
12c10 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
12c20 5b 69 44 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d  [iDb];.  pHash =
12c30 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e   &pDb->pSchema->
12c40 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  tblHash;.  for(p
12c50 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
12c60 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c  irst(pHash); pEl
12c70 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
12c80 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
12c90 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
12ca0 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
12cb0 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69  ta(pElem);.    i
12cc0 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69  f( pTab->tnum==i
12cd0 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54  From ){.      pT
12ce0 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a  ab->tnum = iTo;.
12cf0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73      }.  }.  pHas
12d00 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d  h = &pDb->pSchem
12d10 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f  a->idxHash;.  fo
12d20 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
12d30 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20  shFirst(pHash); 
12d40 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
12d50 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
12d60 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  m)){.    Index *
12d70 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73  pIdx = sqliteHas
12d80 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
12d90 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d    if( pIdx->tnum
12da0 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
12db0 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54   pIdx->tnum = iT
12dc0 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  o;.    }.  }.}.#
12dd0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
12de0 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  te code to erase
12df0 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
12e00 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65  root-page iTable
12e10 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69   from database i
12e20 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74  Db..** Also writ
12e30 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79  e code to modify
12e40 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
12e50 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74  er table and int
12e60 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
12e70 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f  if a root-page o
12e80 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  f another table 
12e90 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20  is moved by the 
12ea0 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c  btree-layer whil
12eb0 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54  st.** erasing iT
12ec0 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68  able (this can h
12ed0 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75  appen with an au
12ee0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
12ef0 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  se)..*/ .static 
12f00 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74  void destroyRoot
12f10 50 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  Page(Parse *pPar
12f20 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  se, int iTable, 
12f30 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
12f40 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
12f50 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
12f60 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
12f70 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
12f80 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 54  e);.  assert( iT
12f90 61 62 6c 65 3e 31 20 29 3b 0a 20 20 73 71 6c 69  able>1 );.  sqli
12fa0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
12fb0 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61   OP_Destroy, iTa
12fc0 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20  ble, r1, iDb);. 
12fd0 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
12fe0 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
12ff0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
13000 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50  TOVACUUM.  /* OP
13010 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20  _Destroy stores 
13020 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31  an in integer r1
13030 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65  . If this intege
13040 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  r.  ** is non-ze
13050 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
13060 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
13070 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d  ber of a table m
13080 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63  oved to.  ** loc
13090 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68  ation iTable. Th
130a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
130b0 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71   modifies the sq
130c0 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
130d0 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63  e to.  ** reflec
130e0 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a  t this..  **.  *
130f0 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20  * The "#NNN" in 
13100 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65  the SQL is a spe
13110 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68  cial constant th
13120 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65  at means whateve
13130 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20  r value.  ** is 
13140 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e  in register NNN.
13150 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75    See grammar ru
13160 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  les associated w
13170 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53  ith the TK_REGIS
13180 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66  TER.  ** token f
13190 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
131a0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  formation..  */.
131b0 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
131c0 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
131d0 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
131e0 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64   SET rootpage=%d
131f0 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72   WHERE #%d AND r
13200 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20  ootpage=#%d",.  
13210 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61     pParse->db->a
13220 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
13230 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 69  , MASTER_NAME, i
13240 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a  Table, r1, r1);.
13250 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
13260 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
13270 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f  Parse, r1);.}../
13280 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20  *.** Write VDBE 
13290 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61  code to erase ta
132a0 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c  ble pTab and all
132b0 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69   associated indi
132c0 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20  ces on disk..** 
132d0 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74  Code to update t
132e0 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
132f0 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65   tables and inte
13300 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69  rnal schema defi
13310 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61  nitions.** in ca
13320 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62  se a root-page b
13330 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74  elonging to anot
13340 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
13350 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20  ed by the btree 
13360 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f  layer.** is also
13370 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e   added (this can
13380 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
13390 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
133a0 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  base)..*/.static
133b0 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62   void destroyTab
133c0 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
133d0 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  , Table *pTab){.
133e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
133f0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
13400 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
13410 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
13420 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
13430 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
13440 70 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74  pSchema);.  dest
13450 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
13460 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  se, pTab->tnum, 
13470 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78  iDb);.  for(pIdx
13480 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
13490 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
134a0 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74  pNext){.    dest
134b0 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
134c0 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  se, pIdx->tnum, 
134d0 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  iDb);.  }.#else.
134e0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
134f0 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f  base may be auto
13500 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20  -vacuum capable 
13510 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  (if SQLITE_OMIT_
13520 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20  AUTOVACUUM.  ** 
13530 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c  is not defined),
13540 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f   then it is impo
13550 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50  rtant to call OP
13560 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a  _Destroy on the.
13570 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69    ** table and i
13580 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20  ndex root-pages 
13590 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69  in order, starti
135a0 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65  ng with the nume
135b0 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61  rically .  ** la
135c0 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
135d0 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61  number. This gua
135e0 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e  rantees that non
135f0 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61  e of the root-pa
13600 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64  ges.  ** to be d
13610 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f  estroyed is relo
13620 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c  cated by an earl
13630 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20  ier OP_Destroy. 
13640 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a  i.e. if the.  **
13650 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20   following were 
13660 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  coded:.  **.  **
13670 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a   OP_Destroy 4 0.
13680 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50    ** ....  ** OP
13690 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a  _Destroy 5 0.  *
136a0 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20  *.  ** and root 
136b0 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20  page 5 happened 
136c0 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73  to be the larges
136d0 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
136e0 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64  er in the.  ** d
136f0 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f  atabase, then ro
13700 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20  ot page 5 would 
13710 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65  be moved to page
13720 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20   4 by the .  ** 
13730 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22  "OP_Destroy 4 0"
13740 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62   opcode. The sub
13750 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74  sequent "OP_Dest
13760 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68  roy 5 0" would h
13770 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c  it.  ** a free-l
13780 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  ist page..  */. 
13790 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62   int iTab = pTab
137a0 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44  ->tnum;.  int iD
137b0 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20  estroyed = 0;.. 
137c0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
137d0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
137e0 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d    int iLargest =
137f0 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65   0;..    if( iDe
13800 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54  stroyed==0 || iT
13810 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b  ab<iDestroyed ){
13820 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20  .      iLargest 
13830 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20  = iTab;.    }.  
13840 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
13850 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
13860 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
13870 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78  {.      int iIdx
13880 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20   = pIdx->tnum;. 
13890 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
138a0 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
138b0 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
138c0 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79     if( (iDestroy
138d0 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69  ed==0 || (iIdx<i
138e0 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69  Destroyed)) && i
138f0 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a  Idx>iLargest ){.
13900 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74          iLargest
13910 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d   = iIdx;.      }
13920 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
13930 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20  Largest==0 ){.  
13940 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
13950 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
13960 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
13970 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
13980 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
13990 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 61 73  chema);.      as
139a0 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
139b0 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e  iDb<pParse->db->
139c0 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 64 65 73  nDb );.      des
139d0 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
139e0 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69  rse, iLargest, i
139f0 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74  Db);.      iDest
13a00 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74  royed = iLargest
13a10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
13a20 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  if.}../*.** Remo
13a30 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
13a40 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e  the sqlite_statN
13a50 20 74 61 62 6c 65 73 20 28 66 6f 72 20 4e 20 69   tables (for N i
13a60 6e 20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66  n (1,2,3)).** af
13a70 74 65 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58  ter a DROP INDEX
13a80 20 6f 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63   or DROP TABLE c
13a90 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  ommand..*/.stati
13aa0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c  c void sqlite3Cl
13ab0 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20  earStatTables(. 
13ac0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
13ad0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
13ae0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
13af0 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20  /.  int iDb,    
13b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13b10 65 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65  e database numbe
13b20 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
13b30 72 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a  r *zType,     /*
13b40 20 22 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20   "idx" or "tbl" 
13b50 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
13b60 2a 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e  *zName      /* N
13b70 61 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20  ame of index or 
13b80 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  table */.){.  in
13b90 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t i;.  const cha
13ba0 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61  r *zDbName = pPa
13bb0 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
13bc0 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 66 6f  ].zDbSName;.  fo
13bd0 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b  r(i=1; i<=4; i++
13be0 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 61 62  ){.    char zTab
13bf0 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  [24];.    sqlite
13c00 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
13c10 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73 71  f(zTab),zTab,"sq
13c20 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69 29 3b  lite_stat%d",i);
13c30 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13c40 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
13c50 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e  ->db, zTab, zDbN
13c60 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ame) ){.      sq
13c70 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
13c80 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
13c90 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
13ca0 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25 51 22  .%s WHERE %s=%Q"
13cb0 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d  ,.        zDbNam
13cc0 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20  e, zTab, zType, 
13cd0 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
13ce0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
13cf0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
13d00 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e  to drop a table.
13d10 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13d20 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 50 61  CodeDropTable(Pa
13d30 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
13d40 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 44  le *pTab, int iD
13d50 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a  b, int isView){.
13d60 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
13d70 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
13d80 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72  e->db;.  Trigger
13d90 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 44 62   *pTrigger;.  Db
13da0 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
13db0 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71  [iDb];..  v = sq
13dc0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
13dd0 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
13de0 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  v!=0 );.  sqlite
13df0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
13e00 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
13e10 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
13e20 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
13e30 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73  ALTABLE.  if( Is
13e40 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
13e50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13e60 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65  AddOp0(v, OP_VBe
13e70 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  gin);.  }.#endif
13e80 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20  ..  /* Drop all 
13e90 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61  triggers associa
13ea0 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
13eb0 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
13ec0 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67  . Code.  ** is g
13ed0 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f  enerated to remo
13ee0 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
13ef0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e  sqlite_master an
13f00 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65  d/or.  ** sqlite
13f10 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20  _temp_master if 
13f20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20  required..  */. 
13f30 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69   pTrigger = sqli
13f40 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28 70  te3TriggerList(p
13f50 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
13f60 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20  while( pTrigger 
13f70 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
13f80 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
13f90 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
13fa0 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54 72 69  || .        pTri
13fb0 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64  gger->pSchema==d
13fc0 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
13fd0 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  a );.    sqlite3
13fe0 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70  DropTriggerPtr(p
13ff0 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29  Parse, pTrigger)
14000 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  ;.    pTrigger =
14010 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74   pTrigger->pNext
14020 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
14030 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
14040 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65  NCREMENT.  /* Re
14050 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73  move any entries
14060 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73   of the sqlite_s
14070 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73  equence table as
14080 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20  sociated with.  
14090 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
140a0 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73  ng dropped. This
140b0 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   is done before 
140c0 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f  the table is dro
140d0 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74 68 65  pped.  ** at the
140e0 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e   btree level, in
140f0 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65   case the sqlite
14100 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
14110 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f  needs to.  ** mo
14120 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ve as a result o
14130 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20  f the drop (can 
14140 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76  happen in auto-v
14150 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a  acuum mode)..  *
14160 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61  /.  if( pTab->ta
14170 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
14180 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20  increment ){.   
14190 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
141a0 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
141b0 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
141c0 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  Q.sqlite_sequenc
141d0 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  e WHERE name=%Q"
141e0 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62  ,.      pDb->zDb
141f0 53 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  SName, pTab->zNa
14200 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65  me.    );.  }.#e
14210 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20  ndif..  /* Drop 
14220 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  all SQLITE_MASTE
14230 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  R table and inde
14240 78 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72  x entries that r
14250 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  efer to the.  **
14260 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67   table. The prog
14270 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74  ram name loops t
14280 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65  hrough the maste
14290 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65  r table and dele
142a0 74 65 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72  tes.  ** every r
142b0 6f 77 20 74 68 61 74 20 72 65 66 65 72 73 20 74  ow that refers t
142c0 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65  o a table of the
142d0 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
142e0 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a  e one being.  **
142f0 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65   dropped. Trigge
14300 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  rs are handled s
14310 65 70 61 72 61 74 65 6c 79 20 62 65 63 61 75 73  eparately becaus
14320 65 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20  e a trigger can 
14330 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  be.  ** created 
14340 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  in the temp data
14350 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73  base that refers
14360 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61   to a table in a
14370 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61  nother.  ** data
14380 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  base..  */.  sql
14390 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
143a0 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
143b0 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
143c0 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65  s WHERE tbl_name
143d0 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74  =%Q and type!='t
143e0 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20  rigger'",.      
143f0 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 4d  pDb->zDbSName, M
14400 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70 54 61 62  ASTER_NAME, pTab
14410 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
14420 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56 69  !isView && !IsVi
14430 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
14440 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28     destroyTable(
14450 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
14460 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20   }..  /* Remove 
14470 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
14480 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e  from SQLite's in
14490 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e  ternal schema an
144a0 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68  d modify.  ** th
144b0 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
144c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  .  */.  if( IsVi
144d0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
144e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
144f0 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74  dOp4(v, OP_VDest
14500 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  roy, iDb, 0, 0, 
14510 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
14520 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
14530 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44  beAddOp4(v, OP_D
14540 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30  ropTable, iDb, 0
14550 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
14560 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  , 0);.  sqlite3C
14570 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
14580 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  se, iDb);.  sqli
14590 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64  teViewResetAll(d
145a0 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  b, iDb);.}../*.*
145b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
145c0 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74  s called to do t
145d0 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f  he work of a DRO
145e0 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  P TABLE statemen
145f0 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74  t..** pName is t
14600 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
14610 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70  able to be dropp
14620 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
14630 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72  te3DropTable(Par
14640 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
14650 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ist *pName, int 
14660 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72  isView, int noEr
14670 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  r){.  Table *pTa
14680 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
14690 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
146a0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
146b0 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e  iDb;..  if( db->
146c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
146d0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
146e0 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
146f0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
14700 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73  nErr==0 );.  ass
14710 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
14720 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  ==1 );.  if( sql
14730 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
14740 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78  Parse) ) goto ex
14750 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
14760 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d   if( noErr ) db-
14770 3e 73 75 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a  >suppressErr++;.
14780 20 20 61 73 73 65 72 74 28 20 69 73 56 69 65 77    assert( isView
14790 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d 4c  ==0 || isView==L
147a0 4f 43 41 54 45 5f 56 49 45 57 20 29 3b 0a 20 20  OCATE_VIEW );.  
147b0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
147c0 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
147d0 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20 26 70  arse, isView, &p
147e0 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69  Name->a[0]);.  i
147f0 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73  f( noErr ) db->s
14800 75 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20  uppressErr--;.. 
14810 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
14820 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20      if( noErr ) 
14830 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
14840 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61  yNamedSchema(pPa
14850 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  rse, pName->a[0]
14860 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
14870 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14880 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62  table;.  }.  iDb
14890 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
148a0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
148b0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73  ->pSchema);.  as
148c0 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
148d0 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a  iDb<db->nDb );..
148e0 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20    /* If pTab is 
148f0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  a virtual table,
14900 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c   call ViewGetCol
14910 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e  umnNames() to en
14920 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20  sure.  ** it is 
14930 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
14940 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
14950 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74  l(pTab) && sqlit
14960 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
14970 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
14980 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  b) ){.    goto e
14990 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
149a0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
149b0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
149c0 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
149d0 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73  t code;.    cons
149e0 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
149f0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
14a00 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
14a10 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
14a20 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
14a30 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
14a40 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69 66  Arg2 = 0;.    if
14a50 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
14a60 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
14a70 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20  E_DELETE, zTab, 
14a80 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20  0, zDb)){.      
14a90 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
14aa0 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
14ab0 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20  if( isView ){.  
14ac0 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
14ad0 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
14ae0 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
14af0 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
14b00 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65  P_VIEW;.      }e
14b10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
14b20 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
14b30 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69  VIEW;.      }.#i
14b40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14b50 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
14b60 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56     }else if( IsV
14b70 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
14b80 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
14b90 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b  ITE_DROP_VTABLE;
14ba0 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20 73  .      zArg2 = s
14bb0 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28  qlite3GetVTable(
14bc0 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f 64 2d  db, pTab)->pMod-
14bd0 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20  >zName;.#endif. 
14be0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14bf0 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
14c00 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
14c10 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
14c20 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41  ITE_DROP_TEMP_TA
14c30 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
14c40 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
14c50 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42   SQLITE_DROP_TAB
14c60 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LE;.      }.    
14c70 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
14c80 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
14c90 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a  e, code, pTab->z
14ca0 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62  Name, zArg2, zDb
14cb0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
14cc0 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
14cd0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
14ce0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
14cf0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
14d00 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61  ELETE, pTab->zNa
14d10 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
14d20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
14d30 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
14d40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
14d50 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
14d60 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  p(pTab->zName, "
14d70 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20  sqlite_", 7)==0 
14d80 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53  .    && sqlite3S
14d90 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e  trNICmp(pTab->zN
14da0 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 74 61  ame, "sqlite_sta
14db0 74 22 2c 20 31 31 29 21 3d 30 20 29 7b 0a 20 20  t", 11)!=0 ){.  
14dc0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
14dd0 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
14de0 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64   %s may not be d
14df0 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a  ropped", pTab->z
14e00 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
14e10 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
14e20 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
14e30 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
14e40 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20   /* Ensure DROP 
14e50 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65  TABLE is not use
14e60 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64  d on a view, and
14e70 20 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f   DROP VIEW is no
14e80 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61  t used.  ** on a
14e90 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
14ea0 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61  f( isView && pTa
14eb0 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  b->pSelect==0 ){
14ec0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
14ed0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
14ee0 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20  e DROP TABLE to 
14ef0 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22  delete table %s"
14f00 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
14f10 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
14f20 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
14f30 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70  if( !isView && p
14f40 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
14f50 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14f60 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65  Msg(pParse, "use
14f70 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65   DROP VIEW to de
14f80 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20 70  lete view %s", p
14f90 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
14fa0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14fb0 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69  table;.  }.#endi
14fc0 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
14fd0 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
14fe0 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
14ff0 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a  he master table.
15000 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20    ** on disk..  
15010 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
15020 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
15030 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
15040 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
15050 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
15060 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 1, iDb);.    
15070 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74  sqlite3ClearStat
15080 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69  Tables(pParse, i
15090 44 62 2c 20 22 74 62 6c 22 2c 20 70 54 61 62 2d  Db, "tbl", pTab-
150a0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
150b0 69 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28  ite3FkDropTable(
150c0 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70  pParse, pName, p
150d0 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Tab);.    sqlite
150e0 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 70  3CodeDropTable(p
150f0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44 62  Parse, pTab, iDb
15100 2c 20 69 73 56 69 65 77 29 3b 0a 20 20 7d 0a 0a  , isView);.  }..
15110 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a  exit_drop_table:
15120 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
15130 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d  tDelete(db, pNam
15140 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  e);.}../*.** Thi
15150 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
15160 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
15170 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  new foreign key 
15180 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  on the table.** 
15190 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
151a0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70  construction.  p
151b0 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e  FromCol determin
151c0 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73  es which columns
151d0 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65  .** in the curre
151e0 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74  nt table point t
151f0 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  o the foreign ke
15200 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d  y.  If pFromCol=
15210 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65  =0 then.** conne
15220 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68  ct the key to th
15230 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e  e last column in
15240 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20  serted.  pTo is 
15250 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74  the name of.** t
15260 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65  he table referre
15270 64 20 74 6f 20 28 61 2e 6b 2e 61 20 74 68 65 20  d to (a.k.a the 
15280 22 70 61 72 65 6e 74 22 20 74 61 62 6c 65 29 2e  "parent" table).
15290 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69    pToCol is a li
152a0 73 74 0a 2a 2a 20 6f 66 20 74 61 62 6c 65 73 20  st.** of tables 
152b0 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 54  in the parent pT
152c0 6f 20 74 61 62 6c 65 2e 20 20 66 6c 61 67 73 20  o table.  flags 
152d0 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20  contains all.** 
152e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
152f0 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72  t the conflict r
15300 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
15310 74 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a  thms specified.*
15320 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45  * in the ON DELE
15330 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e  TE, ON UPDATE an
15340 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75  d ON INSERT clau
15350 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b  ses..**.** An FK
15360 65 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ey structure is 
15370 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65  created and adde
15380 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  d to the table c
15390 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65  urrently.** unde
153a0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69  r construction i
153b0 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e  n the pParse->pN
153c0 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a  ewTable field..*
153d0 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e  *.** The foreign
153e0 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20   key is set for 
153f0 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73  IMMEDIATE proces
15400 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75  sing.  A subsequ
15410 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73  ent call.** to s
15420 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
15430 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68  gnKey() might ch
15440 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46  ange this to DEF
15450 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ERRED..*/.void s
15460 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65  qlite3CreateFore
15470 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20  ignKey(.  Parse 
15480 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
15490 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
154a0 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
154b0 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43  *pFromCol,  /* C
154c0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74  olumns in this t
154d0 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20  able that point 
154e0 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  to other table *
154f0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20  /.  Token *pTo, 
15500 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
15510 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61   of the other ta
15520 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
15530 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a  t *pToCol,    /*
15540 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   Columns in the 
15550 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
15560 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
15570 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
15580 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
15590 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20  orithms. */.){. 
155a0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
155b0 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64  Parse->db;.#ifnd
155c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
155d0 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65  OREIGN_KEY.  FKe
155e0 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20  y *pFKey = 0;.  
155f0 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20  FKey *pNextTo;. 
15600 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72   Table *p = pPar
15610 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
15620 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e   int nByte;.  in
15630 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  t i;.  int nCol;
15640 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61  .  char *z;..  a
15650 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b  ssert( pTo!=0 );
15660 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49  .  if( p==0 || I
15670 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
15680 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
15690 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
156a0 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  ){.    int iCol 
156b0 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20  = p->nCol-1;.   
156c0 20 69 66 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c   if( NEVER(iCol<
156d0 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  0) ) goto fk_end
156e0 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c  ;.    if( pToCol
156f0 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
15700 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  r!=1 ){.      sq
15710 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15720 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b  arse, "foreign k
15730 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20  ey on %s".      
15740 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65     " should refe
15750 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63  rence only one c
15760 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25  olumn of table %
15770 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e  T",.         p->
15780 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
15790 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f  , pTo);.      go
157a0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d  to fk_end;.    }
157b0 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20  .    nCol = 1;. 
157c0 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f   }else if( pToCo
157d0 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
157e0 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  pr!=pFromCol->nE
157f0 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
15800 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15810 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62  e,.        "numb
15820 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
15830 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65   foreign key doe
15840 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
15850 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20  number of ".    
15860 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20      "columns in 
15870 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
15880 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f  able");.    goto
15890 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65   fk_end;.  }else
158a0 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72  {.    nCol = pFr
158b0 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20  omCol->nExpr;.  
158c0 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  }.  nByte = size
158d0 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43  of(*pFKey) + (nC
158e0 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b  ol-1)*sizeof(pFK
158f0 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70  ey->aCol[0]) + p
15900 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28  To->n + 1;.  if(
15910 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
15920 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c  or(i=0; i<pToCol
15930 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
15940 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71       nByte += sq
15950 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54  lite3Strlen30(pT
15960 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
15970 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) + 1;.    }.  }
15980 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74  .  pFKey = sqlit
15990 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
159a0 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  b, nByte );.  if
159b0 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  ( pFKey==0 ){.  
159c0 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
159d0 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f   }.  pFKey->pFro
159e0 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e  m = p;.  pFKey->
159f0 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70  pNextFrom = p->p
15a00 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61  FKey;.  z = (cha
15a10 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  r*)&pFKey->aCol[
15a20 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e  nCol];.  pFKey->
15a30 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70  zTo = z;.  memcp
15a40 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f  y(z, pTo->z, pTo
15a50 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e  ->n);.  z[pTo->n
15a60 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
15a70 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20  Dequote(z);.  z 
15a80 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70  += pTo->n+1;.  p
15a90 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  FKey->nCol = nCo
15aa0 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  l;.  if( pFromCo
15ab0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65  l==0 ){.    pFKe
15ac0 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d  y->aCol[0].iFrom
15ad0 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
15ae0 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
15af0 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
15b00 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  {.      int j;. 
15b10 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
15b20 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  p->nCol; j++){. 
15b30 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
15b40 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f  e3StrICmp(p->aCo
15b50 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f  l[j].zName, pFro
15b60 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
15b70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
15b80 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
15b90 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20  .iFrom = j;.    
15ba0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15bb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15bc0 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e       if( j>=p->n
15bd0 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Col ){.        s
15be0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15bf0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
15c00 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d    "unknown colum
15c10 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65  n \"%s\" in fore
15c20 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
15c30 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  on", .          
15c40 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
15c50 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
15c60 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
15c70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
15c80 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
15c90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
15ca0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
15cb0 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
15cc0 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61  rlen30(pToCol->a
15cd0 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
15ce0 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
15cf0 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20  .zCol = z;.     
15d00 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f   memcpy(z, pToCo
15d10 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e  l->a[i].zName, n
15d20 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20  );.      z[n] = 
15d30 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b  0;.      z += n+
15d40 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
15d50 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
15d60 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61   = 0;.  pFKey->a
15d70 41 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29  Action[0] = (u8)
15d80 28 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20  (flags & 0xff); 
15d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e             /* ON
15da0 20 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a   DELETE action *
15db0 2f 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69  /.  pFKey->aActi
15dc0 6f 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c  on[1] = (u8)((fl
15dd0 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66  ags >> 8 ) & 0xf
15de0 66 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44  f);    /* ON UPD
15df0 41 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20  ATE action */.. 
15e00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15e10 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
15e20 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d  db, 0, p->pSchem
15e30 61 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20  a) );.  pNextTo 
15e40 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65  = (FKey *)sqlite
15e50 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e  3HashInsert(&p->
15e60 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73  pSchema->fkeyHas
15e70 68 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  h, .      pFKey-
15e80 3e 7a 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70 46  >zTo, (void *)pF
15e90 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70  Key.  );.  if( p
15ea0 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b  NextTo==pFKey ){
15eb0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46  .    sqlite3OomF
15ec0 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 67 6f  ault(db);.    go
15ed0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20  to fk_end;.  }. 
15ee0 20 69 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a   if( pNextTo ){.
15ef0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 78      assert( pNex
15f00 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20  tTo->pPrevTo==0 
15f10 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e  );.    pFKey->pN
15f20 65 78 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b  extTo = pNextTo;
15f30 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50  .    pNextTo->pP
15f40 72 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20  revTo = pFKey;. 
15f50 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
15f60 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f  e foreign key to
15f70 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68   the table as th
15f80 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a  e last step..  *
15f90 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70  /.  p->pFKey = p
15fa0 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20  FKey;.  pFKey = 
15fb0 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71  0;..fk_end:.  sq
15fc0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
15fd0 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f  pFKey);.#endif /
15fe0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
15ff0 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
16000 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  EY) */.  sqlite3
16010 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
16020 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20  b, pFromCol);.  
16030 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
16040 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c  elete(db, pToCol
16050 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
16060 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
16070 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49  ed when an INITI
16080 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f  ALLY IMMEDIATE o
16090 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
160a0 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69  RRED.** clause i
160b0 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f  s seen as part o
160c0 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  f a foreign key 
160d0 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65  definition.  The
160e0 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70   isDeferred.** p
160f0 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f  arameter is 1 fo
16100 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
16110 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49  RRED and 0 for I
16120 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
16130 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76  TE..** The behav
16140 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ior of the most 
16150 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64  recently created
16160 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
16170 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f  adjusted.** acco
16180 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rdingly..*/.void
16190 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
161a0 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70  eignKey(Parse *p
161b0 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66  Parse, int isDef
161c0 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20  erred){.#ifndef 
161d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
161e0 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20  IGN_KEY.  Table 
161f0 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70  *pTab;.  FKey *p
16200 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61  FKey;.  if( (pTa
16210 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
16220 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46  Table)==0 || (pF
16230 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65  Key = pTab->pFKe
16240 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  y)==0 ) return;.
16250 20 20 61 73 73 65 72 74 28 20 69 73 44 65 66 65    assert( isDefe
16260 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66  rred==0 || isDef
16270 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45  erred==1 ); /* E
16280 56 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37  V: R-30323-21917
16290 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44   */.  pFKey->isD
162a0 65 66 65 72 72 65 64 20 3d 20 28 75 38 29 69 73  eferred = (u8)is
162b0 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66  Deferred;.#endif
162c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
162d0 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
162e0 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69  l erase and refi
162f0 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20  ll index *pIdx. 
16300 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64   This is.** used
16310 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   to initialize a
16320 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69   newly created i
16330 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d  ndex or to recom
16340 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  pute the.** cont
16350 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  ent of an index 
16360 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61  in response to a
16370 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
16380 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f  ..**.** if memRo
16390 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65  otPage is not ne
163a0 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73  gative, it means
163b0 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
163c0 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61  is newly.** crea
163d0 74 65 64 2e 20 20 54 68 65 20 72 65 67 69 73 74  ted.  The regist
163e0 65 72 20 73 70 65 63 69 66 69 65 64 20 62 79 20  er specified by 
163f0 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74  memRootPage cont
16400 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  ains the.** root
16410 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
16420 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d  the index.  If m
16430 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65  emRootPage is ne
16440 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20  gative, then.** 
16450 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
16460 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73  y exists and mus
16470 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66  t be cleared bef
16480 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c  ore being refill
16490 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f  ed and.** the ro
164a0 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
164b0 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74  f the index is t
164c0 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78  aken from pIndex
164d0 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  ->tnum..*/.stati
164e0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  c void sqlite3Re
164f0 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20  fillIndex(Parse 
16500 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
16510 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52  pIndex, int memR
16520 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c  ootPage){.  Tabl
16530 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
16540 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68  ->pTable;  /* Th
16550 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
16560 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
16570 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
16580 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
16590 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
165a0 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69   for pTab */.  i
165b0 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65  nt iIdx = pParse
165c0 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
165d0 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
165e0 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f  ed for pIndex */
165f0 0a 20 20 69 6e 74 20 69 53 6f 72 74 65 72 3b 20  .  int iSorter; 
16600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16610 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
16620 65 64 20 62 79 20 4f 70 65 6e 53 6f 72 74 65 72  ed by OpenSorter
16630 20 28 69 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a   (if in use) */.
16640 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
16650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16660 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
16670 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20  op of loop */.  
16680 69 6e 74 20 61 64 64 72 32 3b 20 20 20 20 20 20  int addr2;      
16690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
166a0 2a 20 41 64 64 72 65 73 73 20 74 6f 20 6a 75 6d  * Address to jum
166b0 70 20 74 6f 20 66 6f 72 20 6e 65 78 74 20 69 74  p to for next it
166c0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
166d0 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20   tnum;          
166e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
166f0 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65  oot page of inde
16700 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 74  x */.  int iPart
16710 49 64 78 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  IdxLabel;       
16720 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f        /* Jump to
16730 20 74 68 69 73 20 6c 61 62 65 6c 20 74 6f 20 73   this label to s
16740 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20 56  kip a row */.  V
16750 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
16760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16770 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
16780 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c  nto this virtual
16790 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65   machine */.  Ke
167a0 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20  yInfo *pKey;    
167b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
167c0 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65  KeyInfo for inde
167d0 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  x */.  int regRe
167e0 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20  cord;           
167f0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
16800 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62  r holding assemb
16810 6c 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  led index record
16820 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
16830 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
16840 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
16850 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
16860 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73  */.  int iDb = s
16870 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
16880 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e  dex(db, pIndex->
16890 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64  pSchema);..#ifnd
168a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
168b0 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69  UTHORIZATION.  i
168c0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
168d0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
168e0 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64  TE_REINDEX, pInd
168f0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20  ex->zName, 0,.  
16900 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
16910 2e 7a 44 62 53 4e 61 6d 65 20 29 20 29 7b 0a 20  .zDbSName ) ){. 
16920 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
16930 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75  endif..  /* Requ
16940 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
16950 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f   on the table to
16960 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70   perform this op
16970 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  eration */.  sql
16980 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
16990 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
169a0 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e  >tnum, 1, pTab->
169b0 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73  zName);..  v = s
169c0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
169d0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
169e0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
169f0 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30  ( memRootPage>=0
16a00 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d   ){.    tnum = m
16a10 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65  emRootPage;.  }e
16a20 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  lse{.    tnum = 
16a30 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20  pIndex->tnum;.  
16a40 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74  }.  pKey = sqlit
16a50 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78  e3KeyInfoOfIndex
16a60 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29  (pParse, pIndex)
16a70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
16a80 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
16a90 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
16aa0 65 2d 3e 6e 45 72 72 20 29 3b 0a 0a 20 20 2f 2a  e->nErr );..  /*
16ab0 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72   Open the sorter
16ac0 20 63 75 72 73 6f 72 20 69 66 20 77 65 20 61 72   cursor if we ar
16ad0 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f  e to use one. */
16ae0 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61  .  iSorter = pPa
16af0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
16b00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
16b10 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  (v, OP_SorterOpe
16b20 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70  n, iSorter, 0, p
16b30 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20  Index->nKeyCol, 
16b40 28 63 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20  (char*).        
16b50 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
16b60 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
16b70 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  ey), P4_KEYINFO)
16b80 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
16b90 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72   table. Loop thr
16ba0 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66  ough all rows of
16bb0 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65   the table, inse
16bc0 72 74 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a  rting index.  **
16bd0 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68   records into th
16be0 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73  e sorter. */.  s
16bf0 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
16c00 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44  pParse, iTab, iD
16c10 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
16c20 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d  Read);.  addr1 =
16c30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16c40 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
16c50 20 69 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43   iTab, 0); VdbeC
16c60 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65  overage(v);.  re
16c70 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
16c80 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16c90 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47  se);..  sqlite3G
16ca0 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
16cb0 70 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69 54  pParse,pIndex,iT
16cc0 61 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c 26  ab,regRecord,0,&
16cd0 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c  iPartIdxLabel,0,
16ce0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
16cf0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
16d00 72 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f 72  rterInsert, iSor
16d10 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  ter, regRecord);
16d20 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
16d30 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50  ePartIdxLabel(pP
16d40 61 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c 61  arse, iPartIdxLa
16d50 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  bel);.  sqlite3V
16d60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16d70 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
16d80 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  1+1); VdbeCovera
16d90 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
16da0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
16db0 61 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65  addr1);.  if( me
16dc0 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71  mRootPage<0 ) sq
16dd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16de0 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75  v, OP_Clear, tnu
16df0 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  m, iDb);.  sqlit
16e00 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
16e10 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49  OP_OpenWrite, iI
16e20 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a  dx, tnum, iDb, .
16e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e40 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79      (char *)pKey
16e50 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
16e60 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
16e70 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42  geP5(v, OPFLAG_B
16e80 55 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74  ULKCSR|((memRoot
16e90 50 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f  Page>=0)?OPFLAG_
16ea0 50 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20  P2ISREG:0));..  
16eb0 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
16ec0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16ed0 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f 72  SorterSort, iSor
16ee0 74 65 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  ter, 0); VdbeCov
16ef0 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20  erage(v);.  if( 
16f00 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
16f10 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69 6e 74  ndex) ){.    int
16f20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
16f30 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
16f40 2b 20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  + 3;.    sqlite3
16f50 56 64 62 65 47 6f 74 6f 28 76 2c 20 6a 32 29 3b  VdbeGoto(v, j2);
16f60 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
16f70 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
16f80 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
16f90 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
16fa0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d  (v, OP_SorterCom
16fb0 70 61 72 65 2c 20 69 53 6f 72 74 65 72 2c 20 6a  pare, iSorter, j
16fc0 32 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20  2, regRecord,.  
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fe0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e         pIndex->n
16ff0 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76  KeyCol); VdbeCov
17000 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
17010 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74  lite3UniqueConst
17020 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 4f 45  raint(pParse, OE
17030 5f 41 62 6f 72 74 2c 20 70 49 6e 64 65 78 29 3b  _Abort, pIndex);
17040 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64  .  }else{.    ad
17050 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
17060 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
17070 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
17080 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
17090 6f 72 74 65 72 44 61 74 61 2c 20 69 53 6f 72 74  orterData, iSort
170a0 65 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 69  er, regRecord, i
170b0 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Idx);.  sqlite3V
170c0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
170d0 4c 61 73 74 2c 20 69 49 64 78 2c 20 30 2c 20 2d  Last, iIdx, 0, -
170e0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
170f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
17100 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72  xInsert, iIdx, r
17110 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
17120 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
17130 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
17140 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c  EKRESULT);.  sql
17150 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
17160 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
17170 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
17180 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17190 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 53 6f  _SorterNext, iSo
171a0 72 74 65 72 2c 20 61 64 64 72 32 29 3b 20 56 64  rter, addr2); Vd
171b0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
171c0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
171d0 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
171e0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
171f0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
17200 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69 74  , iTab);.  sqlit
17210 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
17220 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b  OP_Close, iIdx);
17230 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17240 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
17250 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f  , iSorter);.}../
17260 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68 65  *.** Allocate he
17270 61 70 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64  ap space to hold
17280 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   an Index object
17290 20 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d   with nCol colum
172a0 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61  ns..**.** Increa
172b0 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  se the allocatio
172c0 6e 20 73 69 7a 65 20 74 6f 20 70 72 6f 76 69 64  n size to provid
172d0 65 20 61 6e 20 65 78 74 72 61 20 6e 45 78 74 72  e an extra nExtr
172e0 61 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38 2d  a bytes.** of 8-
172f0 62 79 74 65 20 61 6c 69 67 6e 65 64 20 73 70 61  byte aligned spa
17300 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64  ce after the Ind
17310 65 78 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65  ex object and re
17320 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65  turn a.** pointe
17330 72 20 74 6f 20 74 68 69 73 20 65 78 74 72 61 20  r to this extra 
17340 73 70 61 63 65 20 69 6e 20 2a 70 70 45 78 74 72  space in *ppExtr
17350 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c  a..*/.Index *sql
17360 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65  ite3AllocateInde
17370 78 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c 69 74  xObject(.  sqlit
17380 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
17390 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
173a0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36 20  ection */.  i16 
173b0 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
173c0 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
173d0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
173e0 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  he index */.  in
173f0 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
17400 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17410 62 79 74 65 73 20 6f 66 20 65 78 74 72 61 20 73  bytes of extra s
17420 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f  pace to alloc */
17430 0a 20 20 63 68 61 72 20 2a 2a 70 70 45 78 74 72  .  char **ppExtr
17440 61 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  a       /* Point
17450 65 72 20 74 6f 20 74 68 65 20 22 65 78 74 72 61  er to the "extra
17460 22 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20 20  " space */.){.  
17470 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20  Index *p;       
17480 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
17490 64 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  d index object *
174a0 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
174b0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
174c0 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 49  s of space for I
174d0 6e 64 65 78 20 6f 62 6a 65 63 74 20 2b 20 61 72  ndex object + ar
174e0 72 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74 65  rays */..  nByte
174f0 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
17500 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20 20  (Index)) +      
17510 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
17520 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20   structure  */. 
17530 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28           ROUND8(
17540 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43  sizeof(char*)*nC
17550 6f 6c 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a  ol) +         /*
17560 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20   Index.azColl   
17570 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52    */.          R
17580 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4c 6f 67  OUND8(sizeof(Log
17590 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20  Est)*(nCol+1) + 
175a0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52      /* Index.aiR
175b0 6f 77 4c 6f 67 45 73 74 20 20 20 2a 2f 0a 20 20  owLogEst   */.  
175c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
175d0 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 20  izeof(i16)*nCol 
175e0 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  +            /* 
175f0 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20  Index.aiColumn  
17600 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
17610 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a       sizeof(u8)*
17620 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20 20 20 20  nCol);          
17630 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72     /* Index.aSor
17640 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d 20  tOrder */.  p = 
17650 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
17660 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b 20  ero(db, nByte + 
17670 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70  nExtra);.  if( p
17680 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 45   ){.    char *pE
17690 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70  xtra = ((char*)p
176a0 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  )+ROUND8(sizeof(
176b0 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70 2d 3e  Index));.    p->
176c0 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20  azColl = (const 
176d0 63 68 61 72 2a 2a 29 70 45 78 74 72 61 3b 20 70  char**)pExtra; p
176e0 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38 28  Extra += ROUND8(
176f0 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43  sizeof(char*)*nC
17700 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52 6f  ol);.    p->aiRo
17710 77 4c 6f 67 45 73 74 20 3d 20 28 4c 6f 67 45 73  wLogEst = (LogEs
17720 74 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74 72  t*)pExtra; pExtr
17730 61 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45  a += sizeof(LogE
17740 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20  st)*(nCol+1);.  
17750 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20    p->aiColumn = 
17760 28 69 31 36 2a 29 70 45 78 74 72 61 3b 20 20 20  (i16*)pExtra;   
17770 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20 73 69      pExtra += si
17780 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a  zeof(i16)*nCol;.
17790 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65      p->aSortOrde
177a0 72 20 3d 20 28 75 38 2a 29 70 45 78 74 72 61 3b  r = (u8*)pExtra;
177b0 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  .    p->nColumn 
177c0 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e  = nCol;.    p->n
177d0 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20  KeyCol = nCol - 
177e0 31 3b 0a 20 20 20 20 2a 70 70 45 78 74 72 61 20  1;.    *ppExtra 
177f0 3d 20 28 28 63 68 61 72 2a 29 70 29 20 2b 20 6e  = ((char*)p) + n
17800 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Byte;.  }.  retu
17810 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn p;.}../*.** C
17820 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  reate a new inde
17830 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62  x for an SQL tab
17840 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d  le.  pName1.pNam
17850 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  e2 is the name o
17860 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  f the index .** 
17870 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20  and pTblList is 
17880 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
17890 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
178a0 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
178b0 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
178c0 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
178d0 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
178e0 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
178f0 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
17900 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
17910 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
17920 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
17930 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
17940 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
17950 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
17960 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
17970 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
17980 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
17990 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
179a0 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
179b0 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
179c0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
179d0 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
179e0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
179f0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
17a00 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
17a10 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
17a20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
17a30 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
17a40 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
17a50 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
17a60 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
17a70 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
17a80 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
17a90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17aa0 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
17ab0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
17ac0 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61    /* All informa
17ad0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
17ae0 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  parse */.  Token
17af0 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
17b00 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69   First part of i
17b10 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
17b20 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  e NULL */.  Toke
17b30 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
17b40 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
17b50 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
17b60 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72   be NULL */.  Sr
17b70 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c  cList *pTblName,
17b80 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64   /* Table to ind
17b90 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e  ex. Use pParse->
17ba0 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a  pNewTable if 0 *
17bb0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
17bc0 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74  ist,   /* A list
17bd0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
17be0 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
17bf0 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
17c00 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
17c10 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
17c20 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
17c30 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
17c40 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  art,     /* The 
17c50 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
17c60 74 20 62 65 67 69 6e 73 20 74 68 69 73 20 73 74  t begins this st
17c70 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  atement */.  Exp
17c80 72 20 2a 70 50 49 57 68 65 72 65 2c 20 20 20 20  r *pPIWhere,    
17c90 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
17ca0 66 6f 72 20 70 61 72 74 69 61 6c 20 69 6e 64 69  for partial indi
17cb0 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ces */.  int sor
17cc0 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53  tOrder,     /* S
17cd0 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69  ort order of pri
17ce0 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c  mary key when pL
17cf0 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69  ist==NULL */.  i
17d00 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 2c 20 20  nt ifNotExist,  
17d10 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20    /* Omit error 
17d20 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  if index already
17d30 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 75 38 20   exists */.  u8 
17d40 69 64 78 54 79 70 65 20 20 20 20 20 20 20 20 20  idxType         
17d50 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 79 70  /* The index typ
17d60 65 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  e */.){.  Table 
17d70 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f  *pTab = 0;     /
17d80 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  * Table to be in
17d90 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  dexed */.  Index
17da0 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20   *pIndex = 0;   
17db0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
17dc0 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  be created */.  
17dd0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
17de0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
17df0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  the index */.  i
17e00 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
17e10 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17e20 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a   characters in z
17e30 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  Name */.  int i,
17e40 20 6a 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46   j;.  DbFixer sF
17e50 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ix;        /* Fo
17e60 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61  r assigning data
17e70 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54  base names to pT
17e80 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  able */.  int so
17e90 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f  rtOrderMask;   /
17ea0 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53  * 1 to honor DES
17eb0 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74  C in index.  0 t
17ec0 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73  o ignore. */.  s
17ed0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
17ee0 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70  rse->db;.  Db *p
17ef0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
17f00 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20  /* The specific 
17f10 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
17f20 20 74 68 65 20 69 6e 64 65 78 65 64 20 64 61 74   the indexed dat
17f30 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
17f40 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
17f50 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
17f60 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
17f70 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a   being written *
17f80 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
17f90 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75   = 0;    /* Unqu
17fa0 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
17fb0 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65  the index to cre
17fc0 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ate */.  struct 
17fd0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
17fe0 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72  ListItem; /* For
17ff0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c   looping over pL
18000 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ist */.  int nEx
18010 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tra = 0;        
18020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
18030 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
18040 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20 69   zExtra[] */.  i
18050 6e 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20 20  nt nExtraCol;   
18060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18070 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
18080 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  ra columns neede
18090 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78  d */.  char *zEx
180a0 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tra = 0;        
180b0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
180c0 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65   space after the
180d0 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f   Index object */
180e0 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20  .  Index *pPk = 
180f0 30 3b 20 20 20 20 20 20 2f 2a 20 50 52 49 4d 41  0;      /* PRIMA
18100 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72  RY KEY index for
18110 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
18120 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 69 66 28 20  ables */..  if( 
18130 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18140 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
18150 3e 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  >0 ){.    goto e
18160 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18170 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e 5f 44  ;.  }.  if( IN_D
18180 45 43 4c 41 52 45 5f 56 54 41 42 20 26 26 20 69  ECLARE_VTAB && i
18190 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49  dxType!=SQLITE_I
181a0 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45  DXTYPE_PRIMARYKE
181b0 59 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  Y ){.    goto ex
181c0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
181d0 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54  .  }.  if( SQLIT
181e0 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
181f0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
18200 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
18210 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18220 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
18230 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  nd the table tha
18240 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
18250 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c  ed.  Return earl
18260 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  y if not found..
18270 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e    */.  if( pTblN
18280 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f  ame!=0 ){..    /
18290 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61  * Use the two-pa
182a0 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f  rt index name to
182b0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64   determine the d
182c0 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
182d0 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68  to search for th
182e0 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74  e table. 'Fix' t
182f0 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  he table name to
18300 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20   this db.    ** 
18310 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75  before looking u
18320 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  p the table..   
18330 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
18340 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32  pName1 && pName2
18350 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   );.    iDb = sq
18360 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
18370 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
18380 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
18390 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
183a0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
183b0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
183c0 73 65 72 74 28 20 70 4e 61 6d 65 20 26 26 20 70  sert( pName && p
183d0 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e  Name->z );..#ifn
183e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
183f0 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66  TEMPDB.    /* If
18400 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20   the index name 
18410 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
18420 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 61   check if the ta
18430 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  ble.    ** is a 
18440 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73  temp table. If s
18450 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  o, set the datab
18460 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74  ase to 1. Do not
18470 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   do this.    ** 
18480 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20  if initialising 
18490 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  a database schem
184a0 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  a..    */.    if
184b0 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
184c0 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   ){.      pTab =
184d0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
184e0 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54  ookup(pParse, pT
184f0 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  blName);.      i
18500 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20  f( pName2->n==0 
18510 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d  && pTab && pTab-
18520 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
18530 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
18540 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b          iDb = 1;
18550 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
18560 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74  endif..    sqlit
18570 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
18580 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69   pParse, iDb, "i
18590 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ndex", pName);. 
185a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
185b0 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20  xSrcList(&sFix, 
185c0 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20  pTblName) ){.   
185d0 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68     /* Because th
185e0 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75  e parser constru
185f0 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f  cts pTblName fro
18600 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74  m a single ident
18610 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20  ifier,.      ** 
18620 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
18630 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c  t can never fail
18640 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
18650 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(0);.    }.    
18660 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
18670 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
18680 61 72 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61  arse, 0, &pTblNa
18690 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61  me->a[0]);.    a
186a0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
186b0 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54  cFailed==0 || pT
186c0 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab==0 );.    if(
186d0 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   pTab==0 ) goto 
186e0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
186f0 78 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d  x;.    if( iDb==
18700 31 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 44 62  1 && db->aDb[iDb
18710 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54 61 62 2d  ].pSchema!=pTab-
18720 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
18730 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
18740 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
18750 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 72        "cannot cr
18760 65 61 74 65 20 61 20 54 45 4d 50 20 69 6e 64 65  eate a TEMP inde
18770 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61  x on non-TEMP ta
18780 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20  ble \"%s\"",.   
18790 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
187a0 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
187b0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
187c0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
187d0 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
187e0 29 20 29 20 70 50 6b 20 3d 20 73 71 6c 69 74 65  ) ) pPk = sqlite
187f0 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
18800 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pTab);.  }else{
18810 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
18820 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  me==0 );.    ass
18830 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20 29  ert( pStart==0 )
18840 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61  ;.    pTab = pPa
18850 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
18860 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20      if( !pTab ) 
18870 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
18880 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20  _index;.    iDb 
18890 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
188a0 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
188b0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20  >pSchema);.  }. 
188c0 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
188d0 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  iDb];..  assert(
188e0 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73   pTab!=0 );.  as
188f0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
18900 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  rr==0 );.  if( s
18910 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
18920 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
18930 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20  ite_", 7)==0 .  
18940 20 20 20 20 20 26 26 20 64 62 2d 3e 69 6e 69 74       && db->init
18950 2e 62 75 73 79 3d 3d 30 0a 23 69 66 20 53 51 4c  .busy==0.#if SQL
18960 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
18970 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 20 20 26  ICATION.       &
18980 26 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74  & sqlite3UserAut
18990 68 54 61 62 6c 65 28 70 54 61 62 2d 3e 7a 4e 61  hTable(pTab->zNa
189a0 6d 65 29 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20  me)==0.#endif.  
189b0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53       && sqlite3S
189c0 74 72 4e 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a  trNICmp(&pTab->z
189d0 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61  Name[7],"alterta
189e0 62 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20  b_",9)!=0 ){.   
189f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18a00 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
18a10 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  %s may not be in
18a20 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  dexed", pTab->zN
18a30 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
18a40 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18a50 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
18a60 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
18a70 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
18a80 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
18a90 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
18aa0 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74  , "views may not
18ab0 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
18ac0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18ad0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
18ae0 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
18af0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
18b00 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56  LTABLE.  if( IsV
18b10 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
18b20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
18b30 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 72  Msg(pParse, "vir
18b40 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20  tual tables may 
18b50 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
18b60 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
18b70 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18b80 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20  }.#endif..  /*. 
18b90 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d   ** Find the nam
18ba0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  e of the index. 
18bb0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
18bc0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
18bd0 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64  another.  ** ind
18be0 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68  ex or table with
18bf0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
18c00 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65   .  **.  ** Exce
18c10 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72  ption:  If we ar
18c20 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61  e reading the na
18c30 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74  mes of permanent
18c40 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68   indices from th
18c50 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  e.  ** sqlite_ma
18c60 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61  ster table (beca
18c70 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  use some other p
18c80 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74  rocess changed t
18c90 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20  he schema) and. 
18ca0 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   ** one of the i
18cb0 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69  ndex names colli
18cc0 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d  des with the nam
18cd0 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79  e of a temporary
18ce0 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69   table or.  ** i
18cf0 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69  ndex, then we wi
18d00 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70  ll continue to p
18d10 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65  rocess this inde
18d20 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  x..  **.  ** If 
18d30 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  pName==0 it mean
18d40 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20  s that we are.  
18d50 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  ** dealing with 
18d60 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
18d70 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
18d80 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  nt.  We have to 
18d90 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20  invent our.  ** 
18da0 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  own name..  */. 
18db0 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
18dc0 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
18dd0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
18de0 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b, pName);.    i
18df0 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
18e00 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18e10 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
18e20 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b  ( pName->z!=0 );
18e30 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
18e40 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
18e50 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
18e60 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
18e70 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18e80 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
18e90 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
18ea0 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
18eb0 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
18ec0 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
18ed0 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)!=0 ){.      
18ee0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
18ef0 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
18f00 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61   is already a ta
18f10 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  ble named %s", z
18f20 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
18f30 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18f40 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
18f50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
18f60 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
18f70 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 44  , zName, pDb->zD
18f80 62 53 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  bSName)!=0 ){.  
18f90 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78      if( !ifNotEx
18fa0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ist ){.        s
18fb0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
18fc0 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73  Parse, "index %s
18fd0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
18fe0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
18ff0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
19000 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
19010 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20 20  .busy );.       
19020 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
19030 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
19040 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
19050 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
19060 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
19070 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
19080 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78  int n;.    Index
19090 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72   *pLoop;.    for
190a0 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e  (pLoop=pTab->pIn
190b0 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b  dex, n=1; pLoop;
190c0 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e   pLoop=pLoop->pN
190d0 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  ext, n++){}.    
190e0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
190f0 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69  Printf(db, "sqli
19100 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f  te_autoindex_%s_
19110 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %d", pTab->zName
19120 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  , n);.    if( zN
19130 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
19140 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19150 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 0a 20  _index;.    }.. 
19160 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20     /* Automatic 
19170 69 6e 64 65 78 20 6e 61 6d 65 73 20 67 65 6e 65  index names gene
19180 72 61 74 65 64 20 66 72 6f 6d 20 77 69 74 68 69  rated from withi
19190 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72  n sqlite3_declar
191a0 65 5f 76 74 61 62 28 29 0a 20 20 20 20 2a 2a 20  e_vtab().    ** 
191b0 6d 75 73 74 20 68 61 76 65 20 6e 61 6d 65 73 20  must have names 
191c0 74 68 61 74 20 61 72 65 20 64 69 73 74 69 6e 63  that are distinc
191d0 74 20 66 72 6f 6d 20 6e 6f 72 6d 61 6c 20 61 75  t from normal au
191e0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6e 61  tomatic index na
191f0 6d 65 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  mes..    ** The 
19200 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d  following statem
19210 65 6e 74 20 63 6f 6e 76 65 72 74 73 20 22 73 71  ent converts "sq
19220 6c 69 74 65 33 5f 61 75 74 6f 69 6e 64 65 78 2e  lite3_autoindex.
19230 2e 2e 22 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20  .." into.    ** 
19240 22 73 71 6c 69 74 65 33 5f 62 75 74 6f 69 6e 64  "sqlite3_butoind
19250 65 78 2e 2e 2e 22 20 69 6e 20 6f 72 64 65 72 20  ex..." in order 
19260 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65  to make the name
19270 73 20 64 69 73 74 69 6e 63 74 2e 0a 20 20 20 20  s distinct..    
19280 2a 2a 20 54 68 65 20 22 76 74 61 62 5f 65 72 72  ** The "vtab_err
19290 2e 74 65 73 74 22 20 74 65 73 74 20 64 65 6d 6f  .test" test demo
192a0 6e 73 74 72 61 74 65 73 20 74 68 65 20 6e 65 65  nstrates the nee
192b0 64 20 6f 66 20 74 68 69 73 20 73 74 61 74 65 6d  d of this statem
192c0 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ent. */.    if( 
192d0 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
192e0 29 20 7a 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a 20 20  ) zName[7]++;.  
192f0 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
19300 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  r authorization 
19310 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  to create an ind
19320 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ex..  */.#ifndef
19330 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
19340 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
19350 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
19360 44 62 20 3d 20 70 44 62 2d 3e 7a 44 62 53 4e 61  Db = pDb->zDbSNa
19370 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
19380 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
19390 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
193a0 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
193b0 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29  (iDb), 0, zDb) )
193c0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
193d0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
193e0 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51      }.    i = SQ
193f0 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
19400 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  X;.    if( !OMIT
19410 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
19420 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43  1 ) i = SQLITE_C
19430 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
19440 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
19450 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
19460 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61  e, i, zName, pTa
19470 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
19480 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
19490 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
194a0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
194b0 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d  ..  /* If pList=
194c0 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69  =0, it means thi
194d0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
194e0 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70  lled to make a p
194f0 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20  rimary.  ** key 
19500 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20  out of the last 
19510 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20  column added to 
19520 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
19530 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20  construction..  
19540 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66  ** So create a f
19550 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75  ake list to simu
19560 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a  late this..  */.
19570 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
19580 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 70 72 65 76  {.    Token prev
19590 43 6f 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Col;.    sqlite3
195a0 54 6f 6b 65 6e 49 6e 69 74 28 26 70 72 65 76 43  TokenInit(&prevC
195b0 6f 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  ol, pTab->aCol[p
195c0 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61  Tab->nCol-1].zNa
195d0 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  me);.    pList =
195e0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
195f0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
19600 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19610 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
19620 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 70 72 65  (db, TK_ID, &pre
19630 76 43 6f 6c 2c 20 30 29 29 3b 0a 20 20 20 20 69  vCol, 0));.    i
19640 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f  f( pList==0 ) go
19650 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
19660 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
19670 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
19680 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 );.    sqlite3
19690 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f  ExprListSetSortO
196a0 72 64 65 72 28 70 4c 69 73 74 2c 20 73 6f 72 74  rder(pList, sort
196b0 4f 72 64 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Order);.  }else{
196c0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
196d0 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28  ListCheckLength(
196e0 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 22  pParse, pList, "
196f0 69 6e 64 65 78 22 29 3b 0a 20 20 7d 0a 0a 20 20  index");.  }..  
19700 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
19710 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  w many bytes of 
19720 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69 72  space are requir
19730 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c  ed to store expl
19740 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63  icitly.  ** spec
19750 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ified collation 
19760 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a  sequence names..
19770 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
19780 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
19790 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
197a0 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
197b0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61  [i].pExpr;.    a
197c0 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20  ssert( pExpr!=0 
197d0 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  );.    if( pExpr
197e0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
197f0 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   ){.      nExtra
19800 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33   += (1 + sqlite3
19810 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e  Strlen30(pExpr->
19820 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20  u.zToken));.    
19830 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a  }.  }..  /* .  *
19840 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  * Allocate the i
19850 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
19860 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20  .  */.  nName = 
19870 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
19880 7a 4e 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61  zName);.  nExtra
19890 43 6f 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d  Col = pPk ? pPk-
198a0 3e 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20  >nKeyCol : 1;.  
198b0 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
198c0 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a  AllocateIndexObj
198d0 65 63 74 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e  ect(db, pList->n
198e0 45 78 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c  Expr + nExtraCol
198f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19910 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20          nName + 
19920 6e 45 78 74 72 61 20 2b 20 31 2c 20 26 7a 45 78  nExtra + 1, &zEx
19930 74 72 61 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  tra);.  if( db->
19940 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
19950 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
19960 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
19970 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
19980 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
19990 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45  Index->aiRowLogE
199a0 73 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  st) );.  assert(
199b0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
199c0 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a  NMENT(pIndex->az
199d0 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65  Coll) );.  pInde
199e0 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72  x->zName = zExtr
199f0 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e  a;.  zExtra += n
19a00 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63  Name + 1;.  memc
19a10 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  py(pIndex->zName
19a20 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31  , zName, nName+1
19a30 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61  );.  pIndex->pTa
19a40 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49  ble = pTab;.  pI
19a50 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  ndex->onError = 
19a60 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70  (u8)onError;.  p
19a70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75  Index->uniqNotNu
19a80 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45  ll = onError!=OE
19a90 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d  _None;.  pIndex-
19aa0 3e 69 64 78 54 79 70 65 20 3d 20 69 64 78 54 79  >idxType = idxTy
19ab0 70 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53  pe;.  pIndex->pS
19ac0 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
19ad0 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
19ae0 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20  pIndex->nKeyCol 
19af0 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
19b00 20 20 69 66 28 20 70 50 49 57 68 65 72 65 20 29    if( pPIWhere )
19b10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
19b20 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63  olveSelfReferenc
19b30 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
19b40 4e 43 5f 50 61 72 74 49 64 78 2c 20 70 50 49 57  NC_PartIdx, pPIW
19b50 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 70 49  here, 0);.    pI
19b60 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78 57 68  ndex->pPartIdxWh
19b70 65 72 65 20 3d 20 70 50 49 57 68 65 72 65 3b 0a  ere = pPIWhere;.
19b80 20 20 20 20 70 50 49 57 68 65 72 65 20 3d 20 30      pPIWhere = 0
19b90 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
19ba0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
19bb0 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
19bc0 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  0) );..  /* Chec
19bd0 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 73  k to see if we s
19be0 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43  hould honor DESC
19bf0 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64   requests on ind
19c00 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ex columns.  */.
19c10 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
19c20 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  ma->file_format>
19c30 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72  =4 ){.    sortOr
19c40 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20  derMask = -1;   
19c50 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f  /* Honor DESC */
19c60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f  .  }else{.    so
19c70 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b  rtOrderMask = 0;
19c80 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45      /* Ignore DE
19c90 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  SC */.  }..  /* 
19ca0 41 6e 61 6c 79 7a 65 20 74 68 65 20 6c 69 73 74  Analyze the list
19cb0 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
19cc0 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 74 65  that form the te
19cd0 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
19ce0 20 61 6e 64 0a 20 20 2a 2a 20 72 65 70 6f 72 74   and.  ** report
19cf0 20 61 6e 79 20 65 72 72 6f 72 73 2e 20 20 49 6e   any errors.  In
19d00 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
19d10 20 77 68 65 72 65 20 74 68 65 20 65 78 70 72 65   where the expre
19d20 73 73 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79  ssion is exactly
19d30 0a 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 63 6f  .  ** a table co
19d40 6c 75 6d 6e 2c 20 73 74 6f 72 65 20 74 68 61 74  lumn, store that
19d50 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 69 43 6f 6c   column in aiCol
19d60 75 6d 6e 5b 5d 2e 20 20 46 6f 72 20 67 65 6e 65  umn[].  For gene
19d70 72 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ral expressions,
19d80 0a 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 20 70  .  ** populate p
19d90 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20  Index->aColExpr 
19da0 61 6e 64 20 73 74 6f 72 65 20 58 4e 5f 45 58 50  and store XN_EXP
19db0 52 20 28 2d 32 29 20 69 6e 20 61 69 43 6f 6c 75  R (-2) in aiColu
19dc0 6d 6e 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mn[]..  **.  ** 
19dd0 54 4f 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61  TODO: Issue a wa
19de0 72 6e 69 6e 67 20 69 66 20 74 77 6f 20 6f 72 20  rning if two or 
19df0 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  more columns of 
19e00 74 68 65 20 69 6e 64 65 78 20 61 72 65 20 69 64  the index are id
19e10 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 20 54 4f  entical..  ** TO
19e20 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e  DO: Issue a warn
19e30 69 6e 67 20 69 66 20 74 68 65 20 74 61 62 6c 65  ing if the table
19e40 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20   primary key is 
19e50 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
19e60 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6b  the.  ** index k
19e70 65 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ey..  */.  for(i
19e80 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c  =0, pListItem=pL
19e90 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
19ea0 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69  >nExpr; i++, pLi
19eb0 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45  stItem++){.    E
19ec0 78 70 72 20 2a 70 43 45 78 70 72 3b 20 20 20 20  xpr *pCExpr;    
19ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19ee0 20 54 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20   The i-th index 
19ef0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
19f00 20 20 69 6e 74 20 72 65 71 75 65 73 74 65 64 53    int requestedS
19f10 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 20 20 20  ortOrder;       
19f20 20 2f 2a 20 41 53 43 20 6f 72 20 44 45 53 43 20   /* ASC or DESC 
19f30 6f 6e 20 74 68 65 20 69 2d 74 68 20 65 78 70 72  on the i-th expr
19f40 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f  ession */.    co
19f50 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  nst char *zColl;
19f60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19f70 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  Collation sequen
19f80 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20  ce name */..    
19f90 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49  sqlite3StringToI
19fa0 64 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  d(pListItem->pEx
19fb0 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
19fc0 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72  ResolveSelfRefer
19fd0 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54 61  ence(pParse, pTa
19fe0 62 2c 20 4e 43 5f 49 64 78 45 78 70 72 2c 20 70  b, NC_IdxExpr, p
19ff0 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2c  ListItem->pExpr,
1a000 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61   0);.    if( pPa
1a010 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
1a020 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1a030 65 78 3b 0a 20 20 20 20 70 43 45 78 70 72 20 3d  ex;.    pCExpr =
1a040 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
1a050 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 49 74 65  Collate(pListIte
1a060 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  m->pExpr);.    i
1a070 66 28 20 70 43 45 78 70 72 2d 3e 6f 70 21 3d 54  f( pCExpr->op!=T
1a080 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
1a090 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72    if( pTab==pPar
1a0a0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b  se->pNewTable ){
1a0b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a0c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1a0d0 20 22 65 78 70 72 65 73 73 69 6f 6e 73 20 70 72   "expressions pr
1a0e0 6f 68 69 62 69 74 65 64 20 69 6e 20 50 52 49 4d  ohibited in PRIM
1a0f0 41 52 59 20 4b 45 59 20 61 6e 64 20 22 0a 20 20  ARY KEY and ".  
1a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55                "U
1a120 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
1a130 73 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  s");.        got
1a140 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1a150 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
1a160 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61     if( pIndex->a
1a170 43 6f 6c 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ColExpr==0 ){.  
1a180 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
1a190 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45  pCopy = sqlite3E
1a1a0 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
1a1b0 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  List, 0);.      
1a1c0 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78    pIndex->aColEx
1a1d0 70 72 20 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20  pr = pCopy;.    
1a1e0 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
1a1f0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1a200 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1a210 43 6f 70 79 21 3d 30 20 29 3b 0a 20 20 20 20 20  Copy!=0 );.     
1a220 20 20 20 20 20 70 4c 69 73 74 49 74 65 6d 20 3d       pListItem =
1a230 20 26 70 43 6f 70 79 2d 3e 61 5b 69 5d 3b 0a 20   &pCopy->a[i];. 
1a240 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1a250 0a 20 20 20 20 20 20 6a 20 3d 20 58 4e 5f 45 58  .      j = XN_EX
1a260 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  PR;.      pIndex
1a270 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
1a280 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70  XN_EXPR;.      p
1a290 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75  Index->uniqNotNu
1a2a0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ll = 0;.    }els
1a2b0 65 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 43 45  e{.      j = pCE
1a2c0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
1a2d0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 30      assert( j<=0
1a2e0 78 37 66 66 66 20 29 3b 0a 20 20 20 20 20 20 69  x7fff );.      i
1a2f0 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( j<0 ){.      
1a300 20 20 6a 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65    j = pTab->iPKe
1a310 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  y;.      }else i
1a320 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  f( pTab->aCol[j]
1a330 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  .notNull==0 ){. 
1a340 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75         pIndex->u
1a350 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a  niqNotNull = 0;.
1a360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
1a370 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
1a380 5d 20 3d 20 28 69 31 36 29 6a 3b 0a 20 20 20 20  ] = (i16)j;.    
1a390 7d 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b  }.    zColl = 0;
1a3a0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 49 74  .    if( pListIt
1a3b0 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  em->pExpr->op==T
1a3c0 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20  K_COLLATE ){.   
1a3d0 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20     int nColl;.  
1a3e0 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73      zColl = pLis
1a3f0 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e  tItem->pExpr->u.
1a400 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 43  zToken;.      nC
1a410 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72  oll = sqlite3Str
1a420 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31  len30(zColl) + 1
1a430 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1a440 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b  nExtra>=nColl );
1a450 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 45  .      memcpy(zE
1a460 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f  xtra, zColl, nCo
1a470 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  ll);.      zColl
1a480 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20   = zExtra;.     
1a490 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c   zExtra += nColl
1a4a0 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2d  ;.      nExtra -
1a4b0 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c  = nColl;.    }el
1a4c0 73 65 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20  se if( j>=0 ){. 
1a4d0 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61       zColl = pTa
1a4e0 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c  b->aCol[j].zColl
1a4f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1a500 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d  !zColl ) zColl =
1a510 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
1a520 59 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  Y;.    if( !db->
1a530 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73 71  init.busy && !sq
1a540 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
1a550 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  eq(pParse, zColl
1a560 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
1a570 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1a580 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
1a590 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
1a5a0 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75   zColl;.    requ
1a5b0 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d  estedSortOrder =
1a5c0 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74   pListItem->sort
1a5d0 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65  Order & sortOrde
1a5e0 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65  rMask;.    pInde
1a5f0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
1a600 20 3d 20 28 75 38 29 72 65 71 75 65 73 74 65 64   = (u8)requested
1a610 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a  SortOrder;.  }..
1a620 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
1a630 74 61 62 6c 65 20 6b 65 79 20 74 6f 20 74 68 65  table key to the
1a640 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
1a650 78 2e 20 20 46 6f 72 20 57 49 54 48 4f 55 54 20  x.  For WITHOUT 
1a660 52 4f 57 49 44 0a 20 20 2a 2a 20 74 61 62 6c 65  ROWID.  ** table
1a670 73 20 28 77 68 65 6e 20 70 50 6b 21 3d 30 29 20  s (when pPk!=0) 
1a680 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  this will be the
1a690 20 64 65 63 6c 61 72 65 64 20 50 52 49 4d 41 52   declared PRIMAR
1a6a0 59 20 4b 45 59 2e 20 20 46 6f 72 0a 20 20 2a 2a  Y KEY.  For.  **
1a6b0 20 6e 6f 72 6d 61 6c 20 74 61 62 6c 65 73 20 28   normal tables (
1a6c0 77 68 65 6e 20 70 50 6b 3d 3d 30 29 20 74 68 69  when pPk==0) thi
1a6d0 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 72 6f  s will be the ro
1a6e0 77 69 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  wid..  */.  if( 
1a6f0 70 50 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a  pPk ){.    for(j
1a700 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43  =0; j<pPk->nKeyC
1a710 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
1a720 69 6e 74 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43  int x = pPk->aiC
1a730 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20  olumn[j];.      
1a740 61 73 73 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a  assert( x>=0 );.
1a750 20 20 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c        if( hasCol
1a760 75 6d 6e 28 70 49 6e 64 65 78 2d 3e 61 69 43 6f  umn(pIndex->aiCo
1a770 6c 75 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b  lumn, pIndex->nK
1a780 65 79 43 6f 6c 2c 20 78 29 20 29 7b 0a 20 20 20  eyCol, x) ){.   
1a790 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f       pIndex->nCo
1a7a0 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20 20 7d  lumn--; .      }
1a7b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49  else{.        pI
1a7c0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
1a7d0 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70  ] = x;.        p
1a7e0 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
1a7f0 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a   = pPk->azColl[j
1a800 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ];.        pInde
1a810 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
1a820 20 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64   = pPk->aSortOrd
1a830 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  er[j];.        i
1a840 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1a850 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d  }.    assert( i=
1a860 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  =pIndex->nColumn
1a870 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
1a880 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
1a890 6e 5b 69 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b  n[i] = XN_ROWID;
1a8a0 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43  .    pIndex->azC
1a8b0 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  oll[i] = sqlite3
1a8c0 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 20  StrBINARY;.  }. 
1a8d0 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
1a8e0 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 20  owEst(pIndex);. 
1a8f0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65   if( pParse->pNe
1a900 77 54 61 62 6c 65 3d 3d 30 20 29 20 65 73 74 69  wTable==0 ) esti
1a910 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70  mateIndexWidth(p
1a920 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  Index);..  /* If
1a930 20 74 68 69 73 20 69 6e 64 65 78 20 63 6f 6e 74   this index cont
1a940 61 69 6e 73 20 65 76 65 72 79 20 63 6f 6c 75 6d  ains every colum
1a950 6e 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2c 20  n of its table, 
1a960 74 68 65 6e 20 6d 61 72 6b 0a 20 20 2a 2a 20 69  then mark.  ** i
1a970 74 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20  t as a covering 
1a980 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72  index */.  asser
1a990 74 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  t( HasRowid(pTab
1a9a0 29 20 0a 20 20 20 20 20 20 7c 7c 20 70 54 61 62  ) .      || pTab
1a9b0 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 73 71 6c  ->iPKey<0 || sql
1a9c0 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
1a9d0 78 28 70 49 6e 64 65 78 2c 20 70 54 61 62 2d 3e  x(pIndex, pTab->
1a9e0 69 50 4b 65 79 29 3e 3d 30 20 29 3b 0a 20 20 69  iPKey)>=0 );.  i
1a9f0 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 26  f( pTblName!=0 &
1aa00 26 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  & pIndex->nColum
1aa10 6e 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  n>=pTab->nCol ){
1aa20 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 69 73 43  .    pIndex->isC
1aa30 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20 20  overing = 1;.   
1aa40 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
1aa50 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
1aa60 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d      if( j==pTab-
1aa70 3e 69 50 4b 65 79 20 29 20 63 6f 6e 74 69 6e 75  >iPKey ) continu
1aa80 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  e;.      if( sql
1aa90 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
1aaa0 78 28 70 49 6e 64 65 78 2c 6a 29 3e 3d 30 20 29  x(pIndex,j)>=0 )
1aab0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1aac0 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72   pIndex->isCover
1aad0 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  ing = 0;.      b
1aae0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1aaf0 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61  .  if( pTab==pPa
1ab00 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29  rse->pNewTable )
1ab10 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f  {.    /* This ro
1ab20 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63  utine has been c
1ab30 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
1ab40 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
1ab50 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72  ex as a.    ** r
1ab60 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41  esult of a PRIMA
1ab70 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
1ab80 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c   clause on a col
1ab90 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20  umn definition, 
1aba0 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d  or.    ** a PRIM
1abb0 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
1abc0 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69  E clause followi
1abd0 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65  ng the column de
1abe0 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  finitions..    *
1abf0 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20  * i.e. one of:. 
1ac00 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45     **.    ** CRE
1ac10 41 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52  ATE TABLE t(x PR
1ac20 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20  IMARY KEY, y);. 
1ac30 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42     ** CREATE TAB
1ac40 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55  LE t(x, y, UNIQU
1ac50 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a  E(x, y));.    **
1ac60 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77  .    ** Either w
1ac70 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  ay, check to see
1ac80 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   if the table al
1ac90 72 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61  ready has such a
1aca0 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20  n index. If.    
1acb0 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74  ** so, don't bot
1acc0 68 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69  her creating thi
1acd0 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79  s one. This only
1ace0 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20   applies to.    
1acf0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
1ad00 20 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73   created indices
1ad10 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61  . Users can do a
1ad20 73 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68  s they wish with
1ad30 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74  .    ** explicit
1ad40 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a   indices..    **
1ad50 0a 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51  .    ** Two UNIQ
1ad60 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  UE or PRIMARY KE
1ad70 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  Y constraints ar
1ad80 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75  e considered equ
1ad90 69 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28  ivalent.    ** (
1ada0 61 6e 64 20 74 68 75 73 20 73 75 70 70 72 65 73  and thus suppres
1adb0 73 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20  sing the second 
1adc0 6f 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68 65  one) even if the
1add0 79 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74  y have different
1ade0 0a 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64  .    ** sort ord
1adf0 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ers..    **.    
1ae00 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
1ae10 64 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74  different collat
1ae20 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72  ing sequences or
1ae30 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   if the columns 
1ae40 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  of.    ** the co
1ae50 6e 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69  nstraint occur i
1ae60 6e 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65  n different orde
1ae70 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  rs, then the con
1ae80 73 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20  straints are.   
1ae90 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64   ** considered d
1aea0 69 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68  istinct and both
1aeb0 20 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72   result in separ
1aec0 61 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20  ate indices..   
1aed0 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
1aee0 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
1aef0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
1af00 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
1af10 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
1af20 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  nt k;.      asse
1af30 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65  rt( IsUniqueInde
1af40 78 28 70 49 64 78 29 20 29 3b 0a 20 20 20 20 20  x(pIdx) );.     
1af50 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69   assert( pIdx->i
1af60 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49  dxType!=SQLITE_I
1af70 44 58 54 59 50 45 5f 41 50 50 44 45 46 20 29 3b  DXTYPE_APPDEF );
1af80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49  .      assert( I
1af90 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e  sUniqueIndex(pIn
1afa0 64 65 78 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  dex) );..      i
1afb0 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  f( pIdx->nKeyCol
1afc0 21 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  !=pIndex->nKeyCo
1afd0 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
1afe0 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
1aff0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b  Idx->nKeyCol; k+
1b000 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
1b010 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20  t char *z1;.    
1b020 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1b030 7a 32 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  z2;.        asse
1b040 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  rt( pIdx->aiColu
1b050 6d 6e 5b 6b 5d 3e 3d 30 20 29 3b 0a 20 20 20 20  mn[k]>=0 );.    
1b060 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
1b070 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65  Column[k]!=pInde
1b080 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29  x->aiColumn[k] )
1b090 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1b0a0 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  z1 = pIdx->azCol
1b0b0 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32  l[k];.        z2
1b0c0 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
1b0d0 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[k];.        if
1b0e0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1b0f0 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b  (z1, z2) ) break
1b100 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b110 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65  if( k==pIdx->nKe
1b120 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  yCol ){.        
1b130 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
1b140 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  r!=pIndex->onErr
1b150 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
1b160 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69  /* This constrai
1b170 6e 74 20 63 72 65 61 74 65 73 20 74 68 65 20 73  nt creates the s
1b180 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20 70  ame index as a p
1b190 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
1b1a0 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
1b1b0 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68  specified somewh
1b1c0 65 72 65 20 69 6e 20 74 68 65 20 43 52 45 41 54  ere in the CREAT
1b1d0 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
1b1e0 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t..          ** 
1b1f0 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43  However the ON C
1b200 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
1b210 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49  are different. I
1b220 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20  f both this .   
1b230 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
1b240 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65  aint and the pre
1b250 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74  vious equivalent
1b260 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65   constraint have
1b270 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20   explicit.      
1b280 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49      ** ON CONFLI
1b290 43 54 20 63 6c 61 75 73 65 73 20 74 68 69 73 20  CT clauses this 
1b2a0 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68  is an error. Oth
1b2b0 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a  erwise, use the.
1b2c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
1b2d0 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65  licitly specifie
1b2e0 64 20 62 65 68 61 76 69 6f 72 20 66 6f 72 20 74  d behavior for t
1b2f0 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  he index..      
1b300 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1b310 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45   if( !(pIdx->onE
1b320 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
1b330 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72   || pIndex->onEr
1b340 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29  ror==OE_Default)
1b350 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1b360 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1b370 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
1b380 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69           "confli
1b390 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43  cting ON CONFLIC
1b3a0 54 20 63 6c 61 75 73 65 73 20 73 70 65 63 69 66  T clauses specif
1b3b0 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ied", 0);.      
1b3c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1b3d0 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
1b3e0 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b  r==OE_Default ){
1b3f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
1b400 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e  x->onError = pIn
1b410 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20  dex->onError;.  
1b420 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b430 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1b440 69 64 78 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  idxType==SQLITE_
1b450 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b  IDXTYPE_PRIMARYK
1b460 45 59 20 29 20 70 49 64 78 2d 3e 69 64 78 54 79  EY ) pIdx->idxTy
1b470 70 65 20 3d 20 69 64 78 54 79 70 65 3b 0a 20 20  pe = idxType;.  
1b480 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1b490 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1b4a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1b4b0 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e  .  /* Link the n
1b4c0 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  ew Index structu
1b4d0 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20  re to its table 
1b4e0 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72  and to the other
1b4f0 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  .  ** in-memory 
1b500 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
1b510 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73  res. .  */.  ass
1b520 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
1b530 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 62  r==0 );.  if( db
1b540 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
1b550 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
1b560 20 61 73 73 65 72 74 28 20 21 49 4e 5f 44 45 43   assert( !IN_DEC
1b570 4c 41 52 45 5f 56 54 41 42 20 29 3b 0a 20 20 20  LARE_VTAB );.   
1b580 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1b590 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
1b5a0 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70  db, 0, pIndex->p
1b5b0 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 70  Schema) );.    p
1b5c0 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
1b5d0 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53  sert(&pIndex->pS
1b5e0 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
1b5f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b600 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
1b610 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78  x->zName, pIndex
1b620 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
1b630 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
1b640 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d  =pIndex );  /* M
1b650 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
1b660 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
1b670 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
1b680 64 62 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  db);.      goto 
1b690 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1b6a0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  x;.    }.    db-
1b6b0 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
1b6c0 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
1b6d0 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
1b6e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  !=0 ){.      pIn
1b6f0 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e  dex->tnum = db->
1b700 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20  init.newTnum;.  
1b710 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1b720 20 74 68 69 73 20 69 73 20 74 68 65 20 69 6e 69   this is the ini
1b730 74 69 61 6c 20 43 52 45 41 54 45 20 49 4e 44 45  tial CREATE INDE
1b740 58 20 73 74 61 74 65 6d 65 6e 74 20 28 6f 72 20  X statement (or 
1b750 43 52 45 41 54 45 20 54 41 42 4c 45 20 69 66 20  CREATE TABLE if 
1b760 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69  the.  ** index i
1b770 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64  s an implied ind
1b780 65 78 20 66 6f 72 20 61 20 55 4e 49 51 55 45 20  ex for a UNIQUE 
1b790 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
1b7a0 6f 6e 73 74 72 61 69 6e 74 29 20 74 68 65 6e 0a  onstraint) then.
1b7b0 20 20 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20 74    ** emit code t
1b7c0 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  o allocate the i
1b7d0 6e 64 65 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e  ndex rootpage on
1b7e0 20 64 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61   disk and make a
1b7f0 6e 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  n entry for.  **
1b800 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 74 68   the index in th
1b810 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
1b820 74 61 62 6c 65 20 61 6e 64 20 70 6f 70 75 6c 61  table and popula
1b830 74 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 74  te the index wit
1b840 68 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20  h.  ** content. 
1b850 20 42 75 74 2c 20 64 6f 20 6e 6f 74 20 64 6f 20   But, do not do 
1b860 74 68 69 73 20 69 66 20 77 65 20 61 72 65 20 73  this if we are s
1b870 69 6d 70 6c 79 20 72 65 61 64 69 6e 67 20 74 68  imply reading th
1b880 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a  e sqlite_master.
1b890 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 70 61    ** table to pa
1b8a0 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2c 20  rse the schema, 
1b8b0 6f 72 20 69 66 20 74 68 69 73 20 69 6e 64 65 78  or if this index
1b8c0 20 69 73 20 74 68 65 20 50 52 49 4d 41 52 59 20   is the PRIMARY 
1b8d0 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2a 20 6f  KEY index.  ** o
1b8e0 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  f a WITHOUT ROWI
1b8f0 44 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  D table..  **.  
1b900 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d  ** If pTblName==
1b910 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
1b920 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74  index is generat
1b930 65 64 20 61 73 20 61 6e 20 69 6d 70 6c 69 65 64  ed as an implied
1b940 20 50 52 49 4d 41 52 59 20 4b 45 59 0a 20 20 2a   PRIMARY KEY.  *
1b950 2a 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65  * or UNIQUE inde
1b960 78 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  x in a CREATE TA
1b970 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
1b980 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a  Since the table.
1b990 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65    ** has just be
1b9a0 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63  en created, it c
1b9b0 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20  ontains no data 
1b9c0 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e  and the index in
1b9d0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a  itialization.  *
1b9e0 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b  * step can be sk
1b9f0 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
1ba00 73 65 20 69 66 28 20 48 61 73 52 6f 77 69 64 28  se if( HasRowid(
1ba10 70 54 61 62 29 20 7c 7c 20 70 54 62 6c 4e 61 6d  pTab) || pTblNam
1ba20 65 21 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65  e!=0 ){.    Vdbe
1ba30 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   *v;.    char *z
1ba40 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d  Stmt;.    int iM
1ba50 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
1ba60 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71  Mem;..    v = sq
1ba70 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1ba80 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
1ba90 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
1baa0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20  reate_index;..  
1bab0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
1bac0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
1bad0 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 20  rse, 1, iDb);.. 
1bae0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
1baf0 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68   rootpage for th
1bb00 65 20 69 6e 64 65 78 20 75 73 69 6e 67 20 43 72  e index using Cr
1bb10 65 61 74 65 49 6e 64 65 78 2e 20 42 75 74 20 62  eateIndex. But b
1bb20 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 64 6f 69  efore.    ** doi
1bb30 6e 67 20 73 6f 2c 20 63 6f 64 65 20 61 20 4e 6f  ng so, code a No
1bb40 6f 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  op instruction a
1bb50 6e 64 20 73 74 6f 72 65 20 69 74 73 20 61 64 64  nd store its add
1bb60 72 65 73 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20  ress in .    ** 
1bb70 49 6e 64 65 78 2e 74 6e 75 6d 2e 20 54 68 69 73  Index.tnum. This
1bb80 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
1bb90 63 61 73 65 20 74 68 69 73 20 69 6e 64 65 78 20  case this index 
1bba0 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 0a 20  is actually a . 
1bbb0 20 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45     ** PRIMARY KE
1bbc0 59 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  Y and the table 
1bbd0 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 57 49  is actually a WI
1bbe0 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
1bbf0 65 2e 20 49 6e 20 0a 20 20 20 20 2a 2a 20 74 68  e. In .    ** th
1bc00 61 74 20 63 61 73 65 20 74 68 65 20 63 6f 6e 76  at case the conv
1bc10 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69  ertToWithoutRowi
1bc20 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65  dTable() routine
1bc30 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20   will replace.  
1bc40 20 20 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69    ** the Noop wi
1bc50 74 68 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d  th a Goto to jum
1bc60 70 20 6f 76 65 72 20 74 68 65 20 56 44 42 45 20  p over the VDBE 
1bc70 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
1bc80 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 70 49 6e  elow. */.    pIn
1bc90 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69  dex->tnum = sqli
1bca0 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
1bcb0 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 73   OP_Noop);.    s
1bcc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1bcd0 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64  (v, OP_CreateInd
1bce0 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a  ex, iDb, iMem);.
1bcf0 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74  .    /* Gather t
1bd00 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
1bd10 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49   of the CREATE I
1bd20 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69  NDEX statement i
1bd30 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a  nto.    ** the z
1bd40 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20  Stmt variable.  
1bd50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74    */.    if( pSt
1bd60 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  art ){.      int
1bd70 20 6e 20 3d 20 28 69 6e 74 29 28 70 50 61 72 73   n = (int)(pPars
1bd80 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20  e->sLastToken.z 
1bd90 2d 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50  - pName->z) + pP
1bda0 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
1bdb0 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  .n;.      if( pN
1bdc0 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27  ame->z[n-1]==';'
1bdd0 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a   ) n--;.      /*
1bde0 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77   A named index w
1bdf0 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20  ith an explicit 
1be00 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
1be10 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  tement */.      
1be20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
1be30 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41  Printf(db, "CREA
1be40 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22  TE%s INDEX %.*s"
1be50 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f  ,.        onErro
1be60 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20  r==OE_None ? "" 
1be70 3a 20 22 20 55 4e 49 51 55 45 22 2c 20 6e 2c 20  : " UNIQUE", n, 
1be80 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d  pName->z);.    }
1be90 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
1bea0 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
1beb0 78 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50  x created by a P
1bec0 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
1bed0 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
1bee0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d  */.      /* zStm
1bef0 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
1bf00 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20  tf(""); */.     
1bf10 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   zStmt = 0;.    
1bf20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e  }..    /* Add an
1bf30 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65   entry in sqlite
1bf40 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73  _master for this
1bf50 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20   index.    */.  
1bf60 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
1bf70 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
1bf80 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
1bf90 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28  TO %Q.%s VALUES(
1bfa0 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25  'index',%Q,%Q,#%
1bfb0 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20  d,%Q);",.       
1bfc0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
1bfd0 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e  bSName, MASTER_N
1bfe0 41 4d 45 2c 0a 20 20 20 20 20 20 20 20 70 49 6e  AME,.        pIn
1bff0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  dex->zName,.    
1c000 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
1c010 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20  .        iMem,. 
1c020 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20         zStmt.   
1c030 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
1c040 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29  bFree(db, zStmt)
1c050 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74  ;..    /* Fill t
1c060 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61  he index with da
1c070 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74  ta and reparse t
1c080 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20  he schema. Code 
1c090 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20  an OP_Expire.   
1c0a0 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74   ** to invalidat
1c0b0 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c  e all pre-compil
1c0c0 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
1c0d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
1c0e0 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  blName ){.      
1c0f0 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
1c100 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
1c110 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  x, iMem);.      
1c120 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
1c130 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
1c140 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1c150 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d  dbeAddParseSchem
1c160 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20  aOp(v, iDb,.    
1c170 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
1c180 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25  ntf(db, "name='%
1c190 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64  q' AND type='ind
1c1a0 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  ex'", pIndex->zN
1c1b0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ame));.      sql
1c1c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
1c1d0 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20 20  , OP_Expire);.  
1c1e0 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
1c1f0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
1c200 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 29 3b 0a 20  pIndex->tnum);. 
1c210 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64   }..  /* When ad
1c220 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f  ding an index to
1c230 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64   the list of ind
1c240 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ices for a table
1c250 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  , make.  ** sure
1c260 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62   all indices lab
1c270 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20  eled OE_Replace 
1c280 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74  come after all t
1c290 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a  hose labeled.  *
1c2a0 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68  * OE_Ignore.  Th
1c2b0 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
1c2c0 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20  for the correct 
1c2d0 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b  constraint check
1c2e0 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  .  ** processing
1c2f0 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e 65   (in sqlite3Gene
1c300 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68  rateConstraintCh
1c310 65 63 6b 73 28 29 29 20 61 73 20 70 61 72 74 20  ecks()) as part 
1c320 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20 61  of.  ** UPDATE a
1c330 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  nd INSERT statem
1c340 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69  ents.  .  */.  i
1c350 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1c360 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20   || pTblName==0 
1c370 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72  ){.    if( onErr
1c380 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c  or!=OE_Replace |
1c390 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d  | pTab->pIndex==
1c3a0 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54  0.         || pT
1c3b0 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ab->pIndex->onEr
1c3c0 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29  ror==OE_Replace)
1c3d0 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
1c3e0 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49  pNext = pTab->pI
1c3f0 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62  ndex;.      pTab
1c400 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
1c410 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  x;.    }else{.  
1c420 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65      Index *pOthe
1c430 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  r = pTab->pIndex
1c440 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
1c450 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20  Other->pNext && 
1c460 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f  pOther->pNext->o
1c470 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
1c480 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  ce ){.        pO
1c490 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70  ther = pOther->p
1c4a0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
1c4b0 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
1c4c0 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  t = pOther->pNex
1c4d0 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d  t;.      pOther-
1c4e0 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b  >pNext = pIndex;
1c4f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
1c500 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  x = 0;.  }..  /*
1c510 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65   Clean up before
1c520 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74   exiting */.exit
1c530 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20  _create_index:. 
1c540 20 69 66 28 20 70 49 6e 64 65 78 20 29 20 66 72   if( pIndex ) fr
1c550 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  eeIndex(db, pInd
1c560 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ex);.  sqlite3Ex
1c570 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 50 49  prDelete(db, pPI
1c580 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
1c590 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
1c5a0 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71  db, pList);.  sq
1c5b0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1c5c0 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29  te(db, pTblName)
1c5d0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1c5e0 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a  e(db, zName);.}.
1c5f0 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20  ./*.** Fill the 
1c600 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d  Index.aiRowEst[]
1c610 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61   array with defa
1c620 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ult information 
1c630 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  - information.**
1c640 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e   to be used when
1c650 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e   we have not run
1c660 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d   the ANALYZE com
1c670 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f  mand..**.** aiRo
1c680 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f  wEst[0] is suppo
1c690 73 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  sed to contain t
1c6a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
1c6b0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64  ments in the ind
1c6c0 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20  ex..** Since we 
1c6d0 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65  do not know, gue
1c6e0 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61  ss 1 million.  a
1c6f0 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e  iRowEst[1] is an
1c700 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
1c710 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  .** number of ro
1c720 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
1c730 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70  that match any p
1c740 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20  articular value 
1c750 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  of the.** first 
1c760 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
1c770 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32  dex.  aiRowEst[2
1c780 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  ] is an estimate
1c790 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a   of the number.*
1c7a0 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d  * of rows that m
1c7b0 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
1c7c0 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  lar combination 
1c7d0 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63  of the first 2 c
1c7e0 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65  olumns.** of the
1c7f0 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20   index.  And so 
1c800 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20  forth.  It must 
1c810 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61  always be the ca
1c820 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20  se that.*.**    
1c830 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b         aiRowEst[
1c840 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31  N]<=aiRowEst[N-1
1c850 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  ].**           a
1c860 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a  iRowEst[N]>=1.**
1c870 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74  .** Apart from t
1c880 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74  hat, we have lit
1c890 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73  tle to go on bes
1c8a0 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61  ides intuition a
1c8b0 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f  s to.** how aiRo
1c8c0 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65  wEst[] should be
1c8d0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54   initialized.  T
1c8e0 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72  he numbers gener
1c8f0 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65  ated here.** are
1c900 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61   based on typica
1c910 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69  l values found i
1c920 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73  n actual indices
1c930 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c940 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49  3DefaultRowEst(I
1c950 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f  ndex *pIdx){.  /
1c960 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1c970 20 31 30 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c   10,  9,  8,  7,
1c980 20 20 36 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20    6 */.  LogEst 
1c990 61 56 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33  aVal[] = { 33, 3
1c9a0 32 2c 20 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b  2, 30, 28, 26 };
1c9b0 0a 20 20 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70  .  LogEst *a = p
1c9c0 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  Idx->aiRowLogEst
1c9d0 3b 0a 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20  ;.  int nCopy = 
1c9e0 4d 49 4e 28 41 72 72 61 79 53 69 7a 65 28 61 56  MIN(ArraySize(aV
1c9f0 61 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43  al), pIdx->nKeyC
1ca00 6f 6c 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  ol);.  int i;.. 
1ca10 20 2f 2a 20 49 6e 64 65 78 65 73 20 77 69 74 68   /* Indexes with
1ca20 20 64 65 66 61 75 6c 74 20 72 6f 77 20 65 73 74   default row est
1ca30 69 6d 61 74 65 73 20 73 68 6f 75 6c 64 20 6e 6f  imates should no
1ca40 74 20 68 61 76 65 20 73 74 61 74 31 20 64 61 74  t have stat1 dat
1ca50 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  a */.  assert( !
1ca60 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31 20 29  pIdx->hasStat1 )
1ca70 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
1ca80 66 69 72 73 74 20 65 6e 74 72 79 20 28 6e 75 6d  first entry (num
1ca90 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1caa0 68 65 20 69 6e 64 65 78 29 20 74 6f 20 74 68 65  he index) to the
1cab0 20 65 73 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a   estimated .  **
1cac0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1cad0 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 6f 72  in the table, or
1cae0 20 68 61 6c 66 20 74 68 65 20 6e 75 6d 62 65 72   half the number
1caf0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1cb00 74 61 62 6c 65 0a 20 20 2a 2a 20 66 6f 72 20 61  table.  ** for a
1cb10 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 20   partial index. 
1cb20 20 20 42 75 74 20 64 6f 20 6e 6f 74 20 6c 65 74    But do not let
1cb30 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 64 72   the estimate dr
1cb40 6f 70 20 62 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a  op below 10. */.
1cb50 20 20 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70    a[0] = pIdx->p
1cb60 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73  Table->nRowLogEs
1cb70 74 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 70  t;.  if( pIdx->p
1cb80 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 20  PartIdxWhere!=0 
1cb90 29 20 61 5b 30 5d 20 2d 3d 20 31 30 3b 20 20 61  ) a[0] -= 10;  a
1cba0 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74  ssert( 10==sqlit
1cbb0 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20  e3LogEst(2) );. 
1cbc0 20 69 66 28 20 61 5b 30 5d 3c 33 33 20 29 20 61   if( a[0]<33 ) a
1cbd0 5b 30 5d 20 3d 20 33 33 3b 20 20 20 20 20 20 20  [0] = 33;       
1cbe0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1cbf0 74 28 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 33==sqlite3Lo
1cc00 67 45 73 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f  gEst(10) );..  /
1cc10 2a 20 45 73 74 69 6d 61 74 65 20 74 68 61 74 20  * Estimate that 
1cc20 61 5b 31 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d  a[1] is 10, a[2]
1cc30 20 69 73 20 39 2c 20 61 5b 33 5d 20 69 73 20 38   is 9, a[3] is 8
1cc40 2c 20 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35  , a[4] is 7, a[5
1cc50 5d 20 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20  ] is.  ** 6 and 
1cc60 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20  each subsequent 
1cc70 76 61 6c 75 65 20 28 69 66 20 61 6e 79 29 20 69  value (if any) i
1cc80 73 20 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70  s 5.  */.  memcp
1cc90 79 28 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e  y(&a[1], aVal, n
1cca0 43 6f 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45  Copy*sizeof(LogE
1ccb0 73 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43  st));.  for(i=nC
1ccc0 6f 70 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e  opy+1; i<=pIdx->
1ccd0 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nKeyCol; i++){. 
1cce0 20 20 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20     a[i] = 23;   
1ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd00 20 61 73 73 65 72 74 28 20 32 33 3d 3d 73 71 6c   assert( 23==sql
1cd10 69 74 65 33 4c 6f 67 45 73 74 28 35 29 20 29 3b  ite3LogEst(5) );
1cd20 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1cd30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
1cd40 28 31 29 20 29 3b 0a 20 20 69 66 28 20 49 73 55  (1) );.  if( IsU
1cd50 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
1cd60 20 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43   ) a[pIdx->nKeyC
1cd70 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ol] = 0;.}../*.*
1cd80 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
1cd90 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73  ill drop an exis
1cda0 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78  ting named index
1cdb0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
1cdc0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** implements th
1cdd0 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61  e DROP INDEX sta
1cde0 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
1cdf0 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78  sqlite3DropIndex
1ce00 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1ce10 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
1ce20 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20  int ifExists){. 
1ce30 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
1ce40 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
1ce50 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1ce60 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
1ce70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1ce80 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20  rse->nErr==0 ); 
1ce90 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65    /* Never calle
1cea0 64 20 77 69 74 68 20 70 72 69 6f 72 20 65 72 72  d with prior err
1ceb0 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ors */.  if( db-
1cec0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1ced0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
1cee0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
1cef0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
1cf00 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nSrc==1 );.  if(
1cf10 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
1cf20 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
1cf30 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  arse) ){.    got
1cf40 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1cf50 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20  x;.  }.  pIndex 
1cf60 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
1cf70 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b  ex(db, pName->a[
1cf80 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  0].zName, pName-
1cf90 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
1cfa0 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d  ;.  if( pIndex==
1cfb0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66  0 ){.    if( !if
1cfc0 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  Exists ){.      
1cfd0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1cfe0 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1cff0 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61   index: %S", pNa
1d000 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  me, 0);.    }els
1d010 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1d020 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53  CodeVerifyNamedS
1d030 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e  chema(pParse, pN
1d040 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
1d050 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ase);.    }.    
1d060 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
1d070 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74  ema = 1;.    got
1d080 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1d090 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  x;.  }.  if( pIn
1d0a0 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51  dex->idxType!=SQ
1d0b0 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50  LITE_IDXTYPE_APP
1d0c0 44 45 46 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  DEF ){.    sqlit
1d0d0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1d0e0 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69  e, "index associ
1d0f0 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45  ated with UNIQUE
1d100 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49   ".      "or PRI
1d110 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
1d120 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72  int cannot be dr
1d130 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  opped", 0);.    
1d140 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1d150 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20  ndex;.  }.  iDb 
1d160 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
1d170 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  oIndex(db, pInde
1d180 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66  x->pSchema);.#if
1d190 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d1a0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
1d1b0 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20   {.    int code 
1d1c0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e  = SQLITE_DROP_IN
1d1d0 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  DEX;.    Table *
1d1e0 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
1d1f0 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  Table;.    const
1d200 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
1d210 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
1d220 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
1d230 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
1d240 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20  A_TABLE(iDb);.  
1d250 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1d260 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1d270 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54  QLITE_DELETE, zT
1d280 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  ab, 0, zDb) ){. 
1d290 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
1d2a0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
1d2b0 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
1d2c0 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20 63  EMPDB && iDb ) c
1d2d0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
1d2e0 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  P_TEMP_INDEX;.  
1d2f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1d300 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
1d310 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ode, pIndex->zNa
1d320 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
1d330 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
1d340 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1d350 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
1d360 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
1d370 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
1d380 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e  ove the index an
1d390 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  d from the maste
1d3a0 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d  r table */.  v =
1d3b0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1d3c0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
1d3d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
1d3e0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
1d3f0 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
1d400 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e  b);.    sqlite3N
1d410 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
1d420 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54  e,.       "DELET
1d430 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
1d440 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74  RE name=%Q AND t
1d450 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20  ype='index'",.  
1d460 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
1d470 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54  ].zDbSName, MAST
1d480 45 52 5f 4e 41 4d 45 2c 20 70 49 6e 64 65 78 2d  ER_NAME, pIndex-
1d490 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20  >zName.    );.  
1d4a0 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74    sqlite3ClearSt
1d4b0 61 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c  atTables(pParse,
1d4c0 20 69 44 62 2c 20 22 69 64 78 22 2c 20 70 49 6e   iDb, "idx", pIn
1d4d0 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  dex->zName);.   
1d4e0 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
1d4f0 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
1d500 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  );.    destroyRo
1d510 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
1d520 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  Index->tnum, iDb
1d530 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1d540 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44  beAddOp4(v, OP_D
1d550 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30  ropIndex, iDb, 0
1d560 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  , 0, pIndex->zNa
1d570 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69  me, 0);.  }..exi
1d580 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20  t_drop_index:.  
1d590 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
1d5a0 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b  lete(db, pName);
1d5b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79  .}../*.** pArray
1d5c0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1d5d0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a   an array of obj
1d5e0 65 63 74 73 2e 20 45 61 63 68 20 6f 62 6a 65 63  ects. Each objec
1d5f0 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61  t in the.** arra
1d600 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74  y is szEntry byt
1d610 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 69 73  es in size. This
1d620 20 72 6f 75 74 69 6e 65 20 75 73 65 73 20 73 71   routine uses sq
1d630 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 29  lite3DbRealloc()
1d640 0a 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20 74 68  .** to extend th
1d650 65 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20  e array so that 
1d660 74 68 65 72 65 20 69 73 20 73 70 61 63 65 20 66  there is space f
1d670 6f 72 20 61 20 6e 65 77 20 6f 62 6a 65 63 74 20  or a new object 
1d680 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a  at the end..**.*
1d690 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
1d6a0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
1d6b0 2a 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e  *pnEntry contain
1d6c0 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  s the current si
1d6d0 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72 72  ze of.** the arr
1d6e0 61 79 20 28 69 6e 20 65 6e 74 72 69 65 73 20 2d  ay (in entries -
1d6f0 20 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   so the allocati
1d700 6f 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74 72 79  on is ((*pnEntry
1d710 29 20 2a 20 73 7a 45 6e 74 72 79 29 20 62 79 74  ) * szEntry) byt
1d720 65 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29 2e  es.** in total).
1d730 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
1d740 61 6c 6c 6f 63 28 29 20 69 73 20 73 75 63 63 65  alloc() is succe
1d750 73 73 66 75 6c 20 28 69 2e 65 2e 20 69 66 20 6e  ssful (i.e. if n
1d760 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20  o OOM condition 
1d770 6f 63 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a 20  occurs), the.** 
1d780 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
1d790 66 6f 72 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  for the new obje
1d7a0 63 74 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a 70  ct is zeroed, *p
1d7b0 6e 45 6e 74 72 79 20 75 70 64 61 74 65 64 20 74  nEntry updated t
1d7c0 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 65  o.** reflect the
1d7d0 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65   new size of the
1d7e0 20 61 72 72 61 79 20 61 6e 64 20 61 20 70 6f 69   array and a poi
1d7f0 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20  nter to the new 
1d800 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72 65  allocation.** re
1d810 74 75 72 6e 65 64 2e 20 2a 70 49 64 78 20 69 73  turned. *pIdx is
1d820 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
1d830 78 20 6f 66 20 74 68 65 20 6e 65 77 20 61 72 72  x of the new arr
1d840 61 79 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73  ay entry in this
1d850 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   case..**.** Oth
1d860 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 72  erwise, if the r
1d870 65 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20  ealloc() fails, 
1d880 2a 70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20  *pIdx is set to 
1d890 2d 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65 6d  -1, *pnEntry rem
1d8a0 61 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  ains.** unchange
1d8b0 64 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20  d and a copy of 
1d8c0 70 41 72 72 61 79 20 72 65 74 75 72 6e 65 64 2e  pArray returned.
1d8d0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
1d8e0 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
1d8f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1d900 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1d910 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d  n to notify of m
1d920 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a  alloc failures *
1d930 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79  /.  void *pArray
1d940 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  ,     /* Array o
1d950 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68  f objects.  Migh
1d960 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64  t be reallocated
1d970 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72   */.  int szEntr
1d980 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  y,      /* Size 
1d990 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69  of each object i
1d9a0 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20  n the array */. 
1d9b0 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20   int *pnEntry,  
1d9c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d9d0 6f 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74 6c  objects currentl
1d9e0 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e  y in use */.  in
1d9f0 74 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  t *pIdx         
1da00 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e 64  /* Write the ind
1da10 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74  ex of a new slot
1da20 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68   here */.){.  ch
1da30 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d  ar *z;.  int n =
1da40 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28   *pnEntry;.  if(
1da50 20 28 6e 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20   (n & (n-1))==0 
1da60 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20  ){.    int sz = 
1da70 28 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e  (n==0) ? 1 : 2*n
1da80 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77  ;.    void *pNew
1da90 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
1daa0 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20  loc(db, pArray, 
1dab0 73 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20  sz*szEntry);.   
1dac0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1dad0 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31        *pIdx = -1
1dae0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
1daf0 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20  Array;.    }.   
1db00 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a   pArray = pNew;.
1db10 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a    }.  z = (char*
1db20 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65  )pArray;.  memse
1db30 74 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79  t(&z[n * szEntry
1db40 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a  ], 0, szEntry);.
1db50 20 20 2a 70 49 64 78 20 3d 20 6e 3b 0a 20 20 2b    *pIdx = n;.  +
1db60 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74  +*pnEntry;.  ret
1db70 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f  urn pArray;.}../
1db80 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
1db90 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
1dba0 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20   given IdList.  
1dbb0 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c  Create a new IdL
1dbc0 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
1dbd0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49  e..**.** A new I
1dbe0 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  dList is returne
1dbf0 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61  d, or NULL if ma
1dc00 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
1dc10 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
1dc20 49 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71 6c  IdListAppend(sql
1dc30 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74  ite3 *db, IdList
1dc40 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
1dc50 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69  pToken){.  int i
1dc60 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1dc70 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
1dc80 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
1dc90 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49  ero(db, sizeof(I
1dca0 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
1dcb0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1dcc0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69  urn 0;.  }.  pLi
1dcd0 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41  st->a = sqlite3A
1dce0 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
1dcf0 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c      db,.      pL
1dd00 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69  ist->a,.      si
1dd10 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
1dd20 29 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d  ),.      &pList-
1dd30 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 69 0a 20  >nId,.      &i. 
1dd40 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b   );.  if( i<0 ){
1dd50 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
1dd60 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
1dd70 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  st);.    return 
1dd80 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e  0;.  }.  pList->
1dd90 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[i].zName = sql
1dda0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1ddb0 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  n(db, pToken);. 
1ddc0 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
1ddd0 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
1dde0 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  n IdList..*/.voi
1ddf0 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  d sqlite3IdListD
1de00 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
1de10 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  b, IdList *pList
1de20 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1de30 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1de40 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
1de50 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
1de60 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
1de70 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d  bFree(db, pList-
1de80 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
1de90 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
1dea0 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b  e(db, pList->a);
1deb0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1dec0 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  NN(db, pList);.}
1ded0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1dee0 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
1def0 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
1df00 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
1df10 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
1df20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
1df30 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  t sqlite3IdListI
1df40 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69  ndex(IdList *pLi
1df50 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
1df60 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  zName){.  int i;
1df70 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1df80 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66  ) return -1;.  f
1df90 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1dfa0 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
1dfb0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1dfc0 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
1dfd0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
1dfe0 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
1dff0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
1e000 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65  /*.** Expand the
1e010 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
1e020 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
1e030 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79  rcList object by
1e040 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78  .** creating nEx
1e050 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65  tra new slots be
1e060 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72  ginning at iStar
1e070 74 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65  t.  iStart is ze
1e080 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77  ro based..** New
1e090 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65   slots are zeroe
1e0a0 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  d..**.** For exa
1e0b0 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20  mple, suppose a 
1e0c0 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c  SrcList initiall
1e0d0 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65  y contains two e
1e0e0 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20  ntries: A,B..** 
1e0f0 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20  To append 3 new 
1e100 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65  entries onto the
1e110 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a   end, do this:.*
1e120 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53  *.**    sqlite3S
1e130 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
1e140 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32  , pSrclist, 3, 2
1e150 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  );.**.** After t
1e160 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74  he call above it
1e170 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20   would contain: 
1e180 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c   A, B, nil, nil,
1e190 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20   nil..** If the 
1e1a0 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20  iStart argument 
1e1b0 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65  had been 1 inste
1e1c0 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68  ad of 2, then th
1e1d0 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c  e result.** woul
1e1e0 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c  d have been:  A,
1e1f0 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20   nil, nil, nil, 
1e200 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74  B.  To prepend t
1e210 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a  he new slots,.**
1e220 20 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75   the iStart valu
1e230 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54  e would be 0.  T
1e240 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77  he result then w
1e250 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c  ould.** be: nil,
1e260 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e   nil, nil, A, B.
1e270 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
1e280 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
1e290 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74 20  ils the SrcList 
1e2a0 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54  is unchanged.  T
1e2b0 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63  he.** db->malloc
1e2c0 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c  Failed flag will
1e2d0 20 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e   be set to true.
1e2e0 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
1e2f0 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
1e300 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ge(.  sqlite3 *d
1e310 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b,       /* Data
1e320 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1e330 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d  to notify of OOM
1e340 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63   errors */.  Src
1e350 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
1e360 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74  /* The SrcList t
1e370 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f  o be enlarged */
1e380 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
1e390 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1e3a0 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20  of new slots to 
1e3b0 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d  add to pSrc->a[]
1e3c0 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
1e3d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1e3e0 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f  x in pSrc->a[] o
1e3f0 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74  f first new slot
1e400 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
1e410 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
1e420 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67  cking on calling
1e430 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
1e440 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e   assert( iStart>
1e450 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1e460 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61  nExtra>=1 );.  a
1e470 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29  ssert( pSrc!=0 )
1e480 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
1e490 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29  rt<=pSrc->nSrc )
1e4a0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
1e4b0 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63   additional spac
1e4c0 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  e if needed */. 
1e4d0 20 69 66 28 20 28 75 33 32 29 70 53 72 63 2d 3e   if( (u32)pSrc->
1e4e0 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63  nSrc+nExtra>pSrc
1e4f0 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
1e500 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
1e510 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20     int nAlloc = 
1e520 70 53 72 63 2d 3e 6e 53 72 63 2a 32 2b 6e 45 78  pSrc->nSrc*2+nEx
1e530 74 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f  tra;.    int nGo
1e540 74 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  t;.    pNew = sq
1e550 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
1e560 62 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20  b, pSrc,.       
1e570 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
1e580 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d  pSrc) + (nAlloc-
1e590 31 29 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  1)*sizeof(pSrc->
1e5a0 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
1e5b0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
1e5c0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
1e5d0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1e5e0 20 20 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b      return pSrc;
1e5f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20  .    }.    pSrc 
1e600 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74  = pNew;.    nGot
1e610 20 3d 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c   = (sqlite3DbMal
1e620 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77  locSize(db, pNew
1e630 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63  ) - sizeof(*pSrc
1e640 29 29 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  ))/sizeof(pSrc->
1e650 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72  a[0])+1;.    pSr
1e660 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74  c->nAlloc = nGot
1e670 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65  ;.  }..  /* Move
1e680 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20   existing slots 
1e690 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20  that come after 
1e6a0 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74  the newly insert
1e6b0 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75  ed slots.  ** ou
1e6c0 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a  t of the way */.
1e6d0 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
1e6e0 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b  rc-1; i>=iStart;
1e6f0 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d   i--){.    pSrc-
1e700 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70  >a[i+nExtra] = p
1e710 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20  Src->a[i];.  }. 
1e720 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e   pSrc->nSrc += n
1e730 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72  Extra;..  /* Zer
1e740 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f  o the newly allo
1e750 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20  cated slots */. 
1e760 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61   memset(&pSrc->a
1e770 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  [iStart], 0, siz
1e780 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a  eof(pSrc->a[0])*
1e790 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69  nExtra);.  for(i
1e7a0 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72  =iStart; i<iStar
1e7b0 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a  t+nExtra; i++){.
1e7c0 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69      pSrc->a[i].i
1e7d0 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d  Cursor = -1;.  }
1e7e0 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20  ..  /* Return a 
1e7f0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65  pointer to the e
1e800 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73 74 20  nlarged SrcList 
1e810 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63  */.  return pSrc
1e820 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  ;.}.../*.** Appe
1e830 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e  nd a new table n
1e840 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ame to the given
1e850 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74   SrcList.  Creat
1e860 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  e a new SrcList 
1e870 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20  if.** need be.  
1e880 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63  A new entry is c
1e890 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72  reated in the Sr
1e8a0 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54  cList even if pT
1e8b0 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  able is NULL..**
1e8c0 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73  .** A SrcList is
1e8d0 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
1e8e0 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 61  LL if there is a
1e8f0 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68  n OOM error.  Th
1e900 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72  e returned.** Sr
1e910 63 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 74  cList might be t
1e920 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 53  he same as the S
1e930 72 63 4c 69 73 74 20 74 68 61 74 20 77 61 73 20  rcList that was 
1e940 69 6e 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68  input or it migh
1e950 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e  t be.** a new on
1e960 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  e.  If an OOM er
1e970 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c  ror does occurs,
1e980 20 74 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20   then the prior 
1e990 76 61 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a  value of pList.*
1e9a0 2a 20 74 68 61 74 20 69 73 20 69 6e 70 75 74 20  * that is input 
1e9b0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
1e9c0 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
1e9d0 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
1e9e0 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f   pDatabase is no
1e9f0 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73  t null, it means
1ea00 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
1ea10 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a  has an optional.
1ea20 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ** database name
1ea30 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74   prefix.  Like t
1ea40 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e  his:  "database.
1ea50 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61  table".  The pDa
1ea60 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73  tabase.** points
1ea70 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61   to the table na
1ea80 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c  me and the pTabl
1ea90 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
1eaa0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
1eab0 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b  * The SrcList.a[
1eac0 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73  ].zName field is
1ead0 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
1eae0 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63   table name whic
1eaf0 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20  h might.** come 
1eb00 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20  from pTable (if 
1eb10 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
1eb20 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61  L) or from pData
1eb30 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69  base.  .** SrcLi
1eb40 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65  st.a[].zDatabase
1eb50 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
1eb60 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1eb70 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a  e from pTable,.*
1eb80 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69  * or with NULL i
1eb90 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73  f no database is
1eba0 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
1ebb0 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
1ebc0 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74  , if call like t
1ebd0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
1ebe0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1ebf0 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29  tAppend(D,A,B,0)
1ec00 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69  ;.**.** Then B i
1ec10 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  s a table name a
1ec20 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
1ec30 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66  name is unspecif
1ec40 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a  ied.  If called.
1ec50 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ** like this:.**
1ec60 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
1ec70 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1ec80 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a  (D,A,B,C);.**.**
1ec90 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74   Then C is the t
1eca0 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20  able name and B 
1ecb0 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
1ecc0 6e 61 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64  name.  If C is d
1ecd0 65 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73  efined.** then s
1ece0 6f 20 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65  o is B.  In othe
1ecf0 72 20 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65  r words, we neve
1ed00 72 20 68 61 76 65 20 61 20 63 61 73 65 20 77 68  r have a case wh
1ed10 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ere:.**.**      
1ed20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1ed30 74 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29  tAppend(D,A,0,C)
1ed40 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61  ;.**.** Both pTa
1ed50 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73  ble and pDatabas
1ed60 65 20 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f  e are assumed to
1ed70 20 62 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65   be quoted.  The
1ed80 79 20 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a  y are dequoted.*
1ed90 2a 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61  * before being a
1eda0 64 64 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c  dded to the SrcL
1edb0 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ist..*/.SrcList 
1edc0 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
1edd0 70 70 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33  ppend(.  sqlite3
1ede0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
1edf0 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  Connection to no
1ee00 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66  tify of malloc f
1ee10 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63  ailures */.  Src
1ee20 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
1ee30 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68   /* Append to th
1ee40 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c  is SrcList. NULL
1ee50 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 53   creates a new S
1ee60 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65  rcList */.  Toke
1ee70 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20  n *pTable,      
1ee80 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65  /* Table to appe
1ee90 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nd */.  Token *p
1eea0 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44  Database    /* D
1eeb0 61 74 61 62 61 73 65 20 6f 66 20 74 68 65 20 74  atabase of the t
1eec0 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  able */.){.  str
1eed0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1eee0 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72   *pItem;.  asser
1eef0 74 28 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20  t( pDatabase==0 
1ef00 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20  || pTable!=0 ); 
1ef10 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20   /* Cannot have 
1ef20 43 20 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20  C without B */. 
1ef30 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
1ef40 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1ef50 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
1ef60 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1ef70 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
1ef80 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  SrcList) );.    
1ef90 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1efa0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69  eturn 0;.    pLi
1efb0 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a  st->nAlloc = 1;.
1efc0 20 20 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20      pList->nSrc 
1efd0 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  = 1;.    memset(
1efe0 26 70 4c 69 73 74 2d 3e 61 5b 30 5d 2c 20 30 2c  &pList->a[0], 0,
1eff0 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
1f000 5b 30 5d 29 29 3b 0a 20 20 20 20 70 4c 69 73 74  [0]));.    pList
1f010 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d  ->a[0].iCursor =
1f020 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   -1;.  }else{.  
1f030 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1f040 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
1f050 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c  db, pList, 1, pL
1f060 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 7d 0a  ist->nSrc);.  }.
1f070 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1f080 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
1f090 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1f0a0 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
1f0b0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1f0c0 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  .  pItem = &pLis
1f0d0 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
1f0e0 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61  -1];.  if( pData
1f0f0 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73  base && pDatabas
1f100 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70  e->z==0 ){.    p
1f110 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
1f120 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  }.  if( pDatabas
1f130 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a  e ){.    Token *
1f140 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73  pTemp = pDatabas
1f150 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  e;.    pDatabase
1f160 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70   = pTable;.    p
1f170 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20  Table = pTemp;. 
1f180 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   }.  pItem->zNam
1f190 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
1f1a0 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61  romToken(db, pTa
1f1b0 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a  ble);.  pItem->z
1f1c0 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
1f1d0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1f1e0 64 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a  db, pDatabase);.
1f1f0 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
1f200 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
1f210 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78  VdbeCursor index
1f220 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20   numbers to all 
1f230 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c  tables in a SrcL
1f240 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ist.*/.void sqli
1f250 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
1f260 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70  Cursors(Parse *p
1f270 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
1f280 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
1f290 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1f2a0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1f2b0 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c   assert(pList ||
1f2c0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1f2d0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
1f2e0 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
1f2f0 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
1f300 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
1f310 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
1f320 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  em++){.      if(
1f330 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e   pItem->iCursor>
1f340 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1f350 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
1f360 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
1f370 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  +;.      if( pIt
1f380 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
1f390 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1f3a0 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
1f3b0 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  rs(pParse, pItem
1f3c0 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29  ->pSelect->pSrc)
1f3d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f3e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
1f3f0 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
1f400 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
1f410 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
1f420 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
1f430 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1f440 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
1f450 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
1f460 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1f470 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1f480 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
1f490 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1f4a0 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
1f4b0 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
1f4c0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
1f4d0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
1f4e0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1f4f0 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
1f500 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
1f510 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
1f520 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
1f530 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1f540 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1f550 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
1f560 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 73 71  isIndexedBy ) sq
1f570 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1f580 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  pItem->u1.zIndex
1f590 65 64 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  edBy);.    if( p
1f5a0 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
1f5b0 6e 63 20 29 20 73 71 6c 69 74 65 33 45 78 70 72  nc ) sqlite3Expr
1f5c0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1f5d0 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
1f5e0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  g);.    sqlite3D
1f5f0 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
1f600 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
1f610 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1f620 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
1f630 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
1f640 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1f650 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b  db, pItem->pOn);
1f660 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
1f670 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  stDelete(db, pIt
1f680 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
1f690 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1f6a0 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  NN(db, pList);.}
1f6b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1f6c0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
1f6d0 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  y the parser to 
1f6e0 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74  add a new term t
1f6f0 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
1f700 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63  a growing FROM c
1f710 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70 22 20  lause.  The "p" 
1f720 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
1f730 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20   part of.** the 
1f740 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74  FROM clause that
1f750 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1f760 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20  n constructed.  
1f770 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69  "p" is NULL.** i
1f780 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1f790 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  rst term of the 
1f7a0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54  FROM clause.  pT
1f7b0 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61  able and pDataba
1f7c0 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61  se.** are the na
1f7d0 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
1f7e0 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d  and database nam
1f7f0 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ed in the FROM c
1f800 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70  lause term..** p
1f810 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c  Database is NULL
1f820 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1f830 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20   name qualifier 
1f840 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65  is missing - the
1f850 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20  .** usual case. 
1f860 20 49 66 20 74 68 65 20 74 65 72 6d 20 68 61 73   If the term has
1f870 20 61 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e 20   an alias, then 
1f880 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f  pAlias points to
1f890 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f   the.** alias to
1f8a0 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72  ken.  If the ter
1f8b0 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c  m is a subquery,
1f8c0 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79 20   then pSubquery 
1f8d0 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54  is the.** SELECT
1f8e0 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
1f8f0 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e 63  the subquery enc
1f900 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c  odes.  The pTabl
1f910 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61  e and.** pDataba
1f920 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  se parameters ar
1f930 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75  e NULL for subqu
1f940 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20  eries.  The pOn 
1f950 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61  and pUsing.** pa
1f960 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68 65  rameters are the
1f970 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
1f980 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
1f990 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  uses..**.** Retu
1f9a0 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  rn a new SrcList
1f9b0 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69   which encodes i
1f9c0 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20  s the FROM with 
1f9d0 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20  the new.** term 
1f9e0 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73  added..*/.SrcLis
1f9f0 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
1fa00 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
1fa10 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1fa20 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
1fa30 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1fa40 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20  .  SrcList *p,  
1fa50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1fa60 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74  e left part of t
1fa70 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61  he FROM clause a
1fa80 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20  lready seen */. 
1fa90 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
1faa0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1fab0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
1fac0 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d   add to the FROM
1fad0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b   clause */.  Tok
1fae0 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20  en *pDatabase,  
1faf0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1fb00 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
1fb10 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a  taining pTable *
1fb20 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61  /.  Token *pAlia
1fb30 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  s,          /* T
1fb40 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
1fb50 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75 62  de of the AS sub
1fb60 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1fb70 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72  Select *pSubquer
1fb80 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  y,      /* A sub
1fb90 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c  query used in pl
1fba0 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e  ace of a table n
1fbb0 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ame */.  Expr *p
1fbc0 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  On,             
1fbd0 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73   /* The ON claus
1fbe0 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20  e of a join */. 
1fbf0 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20   IdList *pUsing 
1fc00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1fc10 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
1fc20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73  a join */.){.  s
1fc30 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1fc40 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
1fc50 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1fc60 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20  e->db;.  if( !p 
1fc70 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e  && (pOn || pUsin
1fc80 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  g) ){.    sqlite
1fc90 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1fca0 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65  , "a JOIN clause
1fcb0 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
1fcc0 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20  ore %s", .      
1fcd0 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55  (pOn ? "ON" : "U
1fce0 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20  SING").    );.  
1fcf0 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72    goto append_fr
1fd00 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  om_error;.  }.  
1fd10 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  p = sqlite3SrcLi
1fd20 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20  stAppend(db, p, 
1fd30 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73  pTable, pDatabas
1fd40 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  e);.  if( p==0 |
1fd50 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 53 72 63 3d  | NEVER(p->nSrc=
1fd60 3d 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =0) ){.    goto 
1fd70 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f  append_from_erro
1fd80 72 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d  r;.  }.  pItem =
1fd90 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31   &p->a[p->nSrc-1
1fda0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c  ];.  assert( pAl
1fdb0 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ias!=0 );.  if( 
1fdc0 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20  pAlias->n ){.   
1fdd0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d   pItem->zAlias =
1fde0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1fdf0 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73  Token(db, pAlias
1fe00 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e  );.  }.  pItem->
1fe10 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75  pSelect = pSubqu
1fe20 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f  ery;.  pItem->pO
1fe30 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d  n = pOn;.  pItem
1fe40 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e  ->pUsing = pUsin
1fe50 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a  g;.  return p;..
1fe60 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72   append_from_err
1fe70 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d  or:.  assert( p=
1fe80 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  =0 );.  sqlite3E
1fe90 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f  xprDelete(db, pO
1fea0 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c  n);.  sqlite3IdL
1feb0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55  istDelete(db, pU
1fec0 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  sing);.  sqlite3
1fed0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
1fee0 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72   pSubquery);.  r
1fef0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1ff00 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44  * Add an INDEXED
1ff10 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58   BY or NOT INDEX
1ff20 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  ED clause to the
1ff30 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
1ff40 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74  dded .** element
1ff50 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c   of the source-l
1ff60 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ist passed as th
1ff70 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1ff80 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1ff90 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64  e3SrcListIndexed
1ffa0 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  By(Parse *pParse
1ffb0 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f  , SrcList *p, To
1ffc0 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29  ken *pIndexedBy)
1ffd0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 64  {.  assert( pInd
1ffe0 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69  exedBy!=0 );.  i
1fff0 66 28 20 70 20 26 26 20 41 4c 57 41 59 53 28 70  f( p && ALWAYS(p
20000 2d 3e 6e 53 72 63 3e 30 29 20 29 7b 0a 20 20 20  ->nSrc>0) ){.   
20010 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
20020 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
20030 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  ->a[p->nSrc-1];.
20040 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
20050 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64  m->fg.notIndexed
20060 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
20070 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49  t( pItem->fg.isI
20080 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20  ndexedBy==0 );. 
20090 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
200a0 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d  ->fg.isTabFunc==
200b0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
200c0 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26  dexedBy->n==1 &&
200d0 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20   !pIndexedBy->z 
200e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e  ){.      /* A "N
200f0 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75  OT INDEXED" clau
20100 73 65 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e  se was supplied.
20110 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20   See parse.y .  
20120 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74      ** construct
20130 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66   "indexed_opt" f
20140 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20  or details. */. 
20150 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6e       pItem->fg.n
20160 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20  otIndexed = 1;. 
20170 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20180 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  pItem->u1.zIndex
20190 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33 4e 61  edBy = sqlite3Na
201a0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
201b0 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65 64  se->db, pIndexed
201c0 42 79 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  By);.      pItem
201d0 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
201e0 20 3d 20 28 70 49 74 65 6d 2d 3e 75 31 2e 7a 49   = (pItem->u1.zI
201f0 6e 64 65 78 65 64 42 79 21 3d 30 29 3b 0a 20 20  ndexedBy!=0);.  
20200 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
20210 20 41 64 64 20 74 68 65 20 6c 69 73 74 20 6f 66   Add the list of
20220 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
20230 6e 74 73 20 74 6f 20 74 68 65 20 53 72 63 4c 69  nts to the SrcLi
20240 73 74 20 65 6e 74 72 79 20 66 6f 72 20 61 0a 2a  st entry for a.*
20250 2a 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d 66  * table-valued-f
20260 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
20270 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 46   sqlite3SrcListF
20280 75 6e 63 41 72 67 73 28 50 61 72 73 65 20 2a 70  uncArgs(Parse *p
20290 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
202a0 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  p, ExprList *pLi
202b0 73 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  st){.  if( p ){.
202c0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
202d0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
202e0 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31   &p->a[p->nSrc-1
202f0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
20300 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65  Item->fg.notInde
20310 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  xed==0 );.    as
20320 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e  sert( pItem->fg.
20330 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29  isIndexedBy==0 )
20340 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
20350 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
20360 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65  c==0 );.    pIte
20370 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d  m->u1.pFuncArg =
20380 20 70 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65   pList;.    pIte
20390 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20  m->fg.isTabFunc 
203a0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
203b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
203c0 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
203d0 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a  db, pList);.  }.
203e0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75  }../*.** When bu
203f0 69 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f 4d  ilding up a FROM
20400 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 70   clause in the p
20410 61 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20  arser, the join 
20420 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69  operator.** is i
20430 6e 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68 65  nitially attache
20440 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 70  d to the left op
20450 65 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65 20  erand.  But the 
20460 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a  code generator.*
20470 2a 20 65 78 70 65 63 74 73 20 74 68 65 20 6a 6f  * expects the jo
20480 69 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62  in operator to b
20490 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 6f  e on the right o
204a0 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f  perand.  This ro
204b0 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20  utine.** Shifts 
204c0 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  all join operato
204d0 72 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  rs from left to 
204e0 72 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e 74  right for an ent
204f0 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75  ire FROM.** clau
20500 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  se..**.** Exampl
20510 65 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20 6a  e: Suppose the j
20520 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69 73  oin is like this
20530 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
20540 20 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f 73    A natural cros
20550 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54  s join B.**.** T
20560 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20 22  he operator is "
20570 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f  natural cross jo
20580 69 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64 20  in".  The A and 
20590 42 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 73  B operands are s
205a0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61  tored.** in p->a
205b0 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c  [0] and p->a[1],
205c0 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20   respectively.  
205d0 54 68 65 20 70 61 72 73 65 72 20 69 6e 69 74 69  The parser initi
205e0 61 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65 0a  ally stores the.
205f0 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  ** operator with
20600 20 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   A.  This routin
20610 65 20 73 68 69 66 74 73 20 74 68 61 74 20 6f 70  e shifts that op
20620 65 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20 42  erator over to B
20630 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
20640 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69  3SrcListShiftJoi
20650 6e 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a 70  nType(SrcList *p
20660 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
20670 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
20680 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e  (i=p->nSrc-1; i>
20690 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70  0; i--){.      p
206a0 2d 3e 61 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79  ->a[i].fg.jointy
206b0 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66  pe = p->a[i-1].f
206c0 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  g.jointype;.    
206d0 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 66 67  }.    p->a[0].fg
206e0 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20  .jointype = 0;. 
206f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
20700 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66  rate VDBE code f
20710 6f 72 20 61 20 42 45 47 49 4e 20 73 74 61 74 65  or a BEGIN state
20720 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
20730 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61  lite3BeginTransa
20740 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
20750 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a  rse, int type){.
20760 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
20770 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
20780 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  i;..  assert( pP
20790 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20  arse!=0 );.  db 
207a0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
207b0 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
207c0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
207d0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
207e0 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
207f0 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  ON, "BEGIN", 0, 
20800 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
20810 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
20820 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
20830 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72  e);.  if( !v ) r
20840 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70  eturn;.  if( typ
20850 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29  e!=TK_DEFERRED )
20860 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
20870 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
20880 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20890 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72  eAddOp2(v, OP_Tr
208a0 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74  ansaction, i, (t
208b0 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56  ype==TK_EXCLUSIV
208c0 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  E)+1);.      sql
208d0 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
208e0 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  e(v, i);.    }. 
208f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
20900 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 41 75 74  AddOp0(v, OP_Aut
20910 6f 43 6f 6d 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a  oCommit);.}../*.
20920 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
20930 20 63 6f 64 65 20 66 6f 72 20 61 20 43 4f 4d 4d   code for a COMM
20940 49 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  IT statement..*/
20950 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
20960 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  mitTransaction(P
20970 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
20980 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73   Vdbe *v;..  ass
20990 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
209a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
209b0 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69  se->db!=0 );.  i
209c0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
209d0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
209e0 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
209f0 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20  "COMMIT", 0, 0) 
20a00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
20a10 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
20a20 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
20a30 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
20a40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20a50 31 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  1(v, OP_AutoComm
20a60 69 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  it, 1);.  }.}../
20a70 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
20a80 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20 52 4f  BE code for a RO
20a90 4c 4c 42 41 43 4b 20 73 74 61 74 65 6d 65 6e 74  LLBACK statement
20aa0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
20ab0 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63  3RollbackTransac
20ac0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
20ad0 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  se){.  Vdbe *v;.
20ae0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
20af0 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
20b00 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20  ( pParse->db!=0 
20b10 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
20b20 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
20b30 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
20b40 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  TION, "ROLLBACK"
20b50 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  , 0, 0) ){.    r
20b60 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d  eturn;.  }.  v =
20b70 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
20b80 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
20b90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
20ba0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20bb0 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31  AutoCommit, 1, 1
20bc0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
20bd0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
20be0 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
20bf0 61 72 73 65 72 20 77 68 65 6e 20 69 74 20 70 61  arser when it pa
20c00 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74  rses a command t
20c10 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c  o create,.** rel
20c20 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
20c30 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69 6e   an SQL savepoin
20c40 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  t. .*/.void sqli
20c50 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61 72  te3Savepoint(Par
20c60 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
20c70 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  op, Token *pName
20c80 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
20c90 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
20ca0 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
20cb0 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
20cc0 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56  ( zName ){.    V
20cd0 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
20ce0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
20cf0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20d00 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
20d10 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ON.    static co
20d20 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  nst char * const
20d30 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e   az[] = { "BEGIN
20d40 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22 52  ", "RELEASE", "R
20d50 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20  OLLBACK" };.    
20d60 61 73 73 65 72 74 28 20 21 53 41 56 45 50 4f 49  assert( !SAVEPOI
20d70 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56 45  NT_BEGIN && SAVE
20d80 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31  POINT_RELEASE==1
20d90 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   && SAVEPOINT_RO
20da0 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e  LLBACK==2 );.#en
20db0 64 69 66 0a 20 20 20 20 69 66 28 20 21 76 20 7c  dif.    if( !v |
20dc0 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  | sqlite3AuthChe
20dd0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
20de0 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b  E_SAVEPOINT, az[
20df0 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29  op], zName, 0) )
20e00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
20e10 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
20e20 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
20e30 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
20e40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20e50 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f  Op4(v, OP_Savepo
20e60 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a  int, op, 0, 0, z
20e70 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Name, P4_DYNAMIC
20e80 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
20e90 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54 45  Make sure the TE
20ea0 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  MP database is o
20eb0 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c  pen and availabl
20ec0 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75  e for use.  Retu
20ed0 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
20ee0 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61   of errors.  Lea
20ef0 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  ve any error mes
20f00 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50 61  sages in the pPa
20f10 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
20f20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65  /.int sqlite3Ope
20f30 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50 61  nTempDatabase(Pa
20f40 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
20f50 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
20f60 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
20f70 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d  db->aDb[1].pBt==
20f80 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78  0 && !pParse->ex
20f90 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74  plain ){.    int
20fa0 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65 20 2a   rc;.    Btree *
20fb0 70 42 74 3b 0a 20 20 20 20 73 74 61 74 69 63 20  pBt;.    static 
20fc0 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
20fd0 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  = .          SQL
20fe0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
20ff0 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  TE |.          S
21000 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
21010 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
21020 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
21030 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  IVE |.          
21040 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
21050 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20  TEONCLOSE |.    
21060 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
21070 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20  N_TEMP_DB;..    
21080 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
21090 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20  eOpen(db->pVfs, 
210a0 30 2c 20 64 62 2c 20 26 70 42 74 2c 20 30 2c 20  0, db, &pBt, 0, 
210b0 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  flags);.    if( 
210c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
210d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
210e0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
210f0 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61  unable to open a
21100 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
21110 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66  ase ".        "f
21120 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ile for storing 
21130 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
21140 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ");.      pParse
21150 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
21160 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
21170 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  .    db->aDb[1].
21180 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 61  pBt = pBt;.    a
21190 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31  ssert( db->aDb[1
211a0 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ].pSchema );.   
211b0 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   if( SQLITE_NOME
211c0 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53  M==sqlite3BtreeS
211d0 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20  etPageSize(pBt, 
211e0 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
211f0 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20 20  , -1, 0) ){.    
21200 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
21210 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74  t(db);.      ret
21220 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
21230 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
21240 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  /*.** Record the
21250 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 73   fact that the s
21260 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69 6c  chema cookie wil
21270 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 76 65 72  l need to be ver
21280 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61 74  ified.** for dat
21290 61 62 61 73 65 20 69 44 62 2e 20 20 54 68 65 20  abase iDb.  The 
212a0 63 6f 64 65 20 74 6f 20 61 63 74 75 61 6c 6c 79  code to actually
212b0 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
212c0 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c  ma cookie.** wil
212d0 6c 20 6f 63 63 75 72 20 61 74 20 74 68 65 20 65  l occur at the e
212e0 6e 64 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65  nd of the top-le
212f0 76 65 6c 20 56 44 42 45 20 61 6e 64 20 77 69 6c  vel VDBE and wil
21300 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  l be generated.*
21310 2a 20 6c 61 74 65 72 2c 20 62 79 20 73 71 6c 69  * later, by sqli
21320 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28  te3FinishCoding(
21330 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
21340 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
21350 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
21360 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61  , int iDb){.  Pa
21370 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
21380 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
21390 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a  level(pParse);..
213a0 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
213b0 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e   && iDb<pParse->
213c0 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
213d0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
213e0 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30  >aDb[iDb].pBt!=0
213f0 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20   || iDb==1 );.  
21400 61 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49  assert( iDb<SQLI
21410 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b  TE_MAX_ATTACHED+
21420 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  2 );.  assert( s
21430 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
21440 78 48 65 6c 64 28 70 50 61 72 73 65 2d 3e 64 62  xHeld(pParse->db
21450 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 69  , iDb, 0) );.  i
21460 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 54  f( DbMaskTest(pT
21470 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d  oplevel->cookieM
21480 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20 29 7b 0a  ask, iDb)==0 ){.
21490 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54      DbMaskSet(pT
214a0 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d  oplevel->cookieM
214b0 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 20 20 69  ask, iDb);.    i
214c0 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
214d0 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
214e0 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65     sqlite3OpenTe
214f0 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f 70 6c  mpDatabase(pTopl
21500 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  evel);.    }.  }
21510 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67  .}../*.** If arg
21520 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c  ument zDb is NUL
21530 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c  L, then call sql
21540 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
21550 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63 68 20  hema() for each 
21560 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
21570 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65  abase. Otherwise
21580 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20  , invoke it for 
21590 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
215a0 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ed zDb only..*/.
215b0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
215c0 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d  VerifyNamedSchem
215d0 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  a(Parse *pParse,
215e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
215f0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
21600 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
21610 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
21620 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
21630 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  +){.    Db *pDb 
21640 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
21650 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20     if( pDb->pBt 
21660 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73  && (!zDb || 0==s
21670 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
21680 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65  b, pDb->zDbSName
21690 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  )) ){.      sqli
216a0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
216b0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a  ema(pParse, i);.
216c0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
216d0 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
216e0 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61   code that prepa
216f0 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e  res for doing an
21700 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a   operation that.
21710 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
21720 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
21730 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
21740 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72   starts a new tr
21750 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20  ansaction if we 
21760 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
21770 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e  within.** a tran
21780 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20  saction.  If we 
21790 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68  are already with
217a0 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
217b0 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f  , then a checkpo
217c0 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66  int.** is set if
217d0 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e   the setStatemen
217e0 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
217f0 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69  rue.  A checkpoi
21800 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nt should.** be 
21810 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f  set for operatio
21820 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61  ns that might fa
21830 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e  il (due to a con
21840 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66  straint) part of
21850 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f  .** the way thro
21860 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69  ugh and which wi
21870 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20  ll need to undo 
21880 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68  some writes with
21890 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a  out having to.**
218a0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68   rollback the wh
218b0 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ole transaction.
218c0 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73    For operations
218d0 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74   where all const
218e0 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65  raints.** can be
218f0 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   checked before 
21900 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20  any changes are 
21910 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
21920 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65  base, it is neve
21930 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74  r.** necessary t
21940 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61  o undo a write a
21950 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  nd the checkpoin
21960 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
21970 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
21980 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
21990 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
219a0 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74  Parse, int setSt
219b0 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62  atement, int iDb
219c0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
219d0 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
219e0 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
219f0 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  rse);.  sqlite3C
21a00 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
21a10 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
21a20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65  DbMaskSet(pTople
21a30 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c 20  vel->writeMask, 
21a40 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  iDb);.  pTopleve
21a50 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  l->isMultiWrite 
21a60 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b  |= setStatement;
21a70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
21a80 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  te that the stat
21a90 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20  ement currently 
21aa0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
21ab0 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a 2a  on might write.*
21ac0 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * more than one 
21ad0 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a 20  entry (example: 
21ae0 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77  deleting one row
21af0 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20   then inserting 
21b00 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65  another,.** inse
21b10 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72  rting multiple r
21b20 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c 20  ows in a table, 
21b30 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72  or inserting a r
21b40 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74  ow and index ent
21b50 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20  ries.).** If an 
21b60 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66 74  abort occurs aft
21b70 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65  er some of these
21b80 20 77 72 69 74 65 73 20 68 61 76 65 20 63 6f 6d   writes have com
21b90 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74 20  pleted, then it 
21ba0 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73  will.** be neces
21bb0 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68 65  sary to undo the
21bc0 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74 65   completed write
21bd0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
21be0 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61 72  e3MultiWrite(Par
21bf0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50  se *pParse){.  P
21c00 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
21c10 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
21c20 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
21c30 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d    pToplevel->isM
21c40 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d  ultiWrite = 1;.}
21c50 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64  ../* .** The cod
21c60 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c  e generator call
21c70 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
21c80 66 20 69 73 20 64 69 73 63 6f 76 65 72 73 20 74  f is discovers t
21c90 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73  hat it is.** pos
21ca0 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20 61  sible to abort a
21cb0 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f 72   statement prior
21cc0 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20   to completion. 
21cd0 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a   In order to .**
21ce0 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61 62   perform this ab
21cf0 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72 72  ort without corr
21d00 75 70 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  upting the datab
21d10 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ase, we need to 
21d20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68 61  make.** sure tha
21d30 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
21d40 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20  is protected by 
21d50 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
21d60 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  saction..**.** T
21d70 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f  echnically, we o
21d80 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74 20  nly need to set 
21d90 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c 61  the mayAbort fla
21da0 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75  g if the.** isMu
21db0 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20 77 61  ltiWrite flag wa
21dc0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74  s previously set
21dd0 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 74 69  .  There is a ti
21de0 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
21df0 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 61   such that the a
21e00 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72 20  bort must occur 
21e10 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69 77  after the multiw
21e20 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b 65  rite.  This make
21e30 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d  s.** some statem
21e40 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74  ents involving t
21e50 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c  he REPLACE confl
21e60 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
21e70 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61  lgorithm.** go a
21e80 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e 20   little faster. 
21e90 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76 61   But taking adva
21ea0 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20 74 69  ntage of this ti
21eb0 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
21ec0 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64   makes it more d
21ed0 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f 76  ifficult to prov
21ee0 65 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  e that the code 
21ef0 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20 0a  is correct (in .
21f00 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69  ** particular, i
21f10 74 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72  t prevents us fr
21f20 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65 66  om writing an ef
21f30 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65  fective.** imple
21f40 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c  mentation of sql
21f50 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
21f60 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65 20  rt()) and so we 
21f70 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74  have chosen.** t
21f80 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66 65 20  o take the safe 
21f90 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20 74  route and skip t
21fa0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  he optimization.
21fb0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21fc0 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a  MayAbort(Parse *
21fd0 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65  pParse){.  Parse
21fe0 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
21ff0 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
22000 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54  el(pParse);.  pT
22010 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72  oplevel->mayAbor
22020 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 1;.}../*.** 
22030 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20  Code an OP_Halt 
22040 74 68 61 74 20 63 61 75 73 65 73 20 74 68 65 20  that causes the 
22050 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61  vdbe to return a
22060 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
22070 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68  INT.** error. Th
22080 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65  e onError parame
22090 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ter determines w
220a0 68 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66  hich (if any) of
220b0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
220c0 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74  * and/or current
220d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
220e0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
220f0 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74  void sqlite3Halt
22100 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61  Constraint(.  Pa
22110 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
22120 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
22130 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  xt */.  int errC
22140 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20 65 78 74  ode,      /* ext
22150 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64 65  ended error code
22160 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
22170 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74  r,      /* Const
22180 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20  raint type */.  
22190 63 68 61 72 20 2a 70 34 2c 20 20 20 20 20 20 20  char *p4,       
221a0 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61    /* Error messa
221b0 67 65 20 2a 2f 0a 20 20 69 38 20 70 34 74 79 70  ge */.  i8 p4typ
221c0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 34 5f  e,        /* P4_
221d0 53 54 41 54 49 43 20 6f 72 20 50 34 5f 54 52 41  STATIC or P4_TRA
221e0 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20 70  NSIENT */.  u8 p
221f0 35 45 72 72 6d 73 67 20 20 20 20 20 20 20 2f 2a  5Errmsg       /*
22200 20 50 35 5f 45 72 72 4d 73 67 20 74 79 70 65 20   P5_ErrMsg type 
22210 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
22220 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
22230 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
22240 72 74 28 20 28 65 72 72 43 6f 64 65 26 30 78 66  rt( (errCode&0xf
22250 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  f)==SQLITE_CONST
22260 52 41 49 4e 54 20 29 3b 0a 20 20 69 66 28 20 6f  RAINT );.  if( o
22270 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74  nError==OE_Abort
22280 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d   ){.    sqlite3M
22290 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
222a0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
222b0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48  beAddOp4(v, OP_H
222c0 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f 6e  alt, errCode, on
222d0 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34  Error, 0, p4, p4
222e0 74 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  type);.  sqlite3
222f0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
22300 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a  p5Errmsg);.}../*
22310 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48  .** Code an OP_H
22320 61 6c 74 20 64 75 65 20 74 6f 20 55 4e 49 51 55  alt due to UNIQU
22330 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
22340 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c   constraint viol
22350 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
22360 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73  qlite3UniqueCons
22370 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
22380 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
22390 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
223a0 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
223b0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61        /* Constra
223c0 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 49 6e  int type */.  In
223d0 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
223e0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68 61  /* The index tha
223f0 74 20 74 72 69 67 67 65 72 73 20 74 68 65 20 63  t triggers the c
22400 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a  onstraint */.){.
22410 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20    char *zErr;.  
22420 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63 63 75  int j;.  StrAccu
22430 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54 61 62 6c  m errMsg;.  Tabl
22440 65 20 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e  e *pTab = pIdx->
22450 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69 74  pTable;..  sqlit
22460 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
22470 65 72 72 4d 73 67 2c 20 70 50 61 72 73 65 2d 3e  errMsg, pParse->
22480 64 62 2c 20 30 2c 20 30 2c 20 32 30 30 29 3b 0a  db, 0, 0, 200);.
22490 20 20 69 66 28 20 70 49 64 78 2d 3e 61 43 6f 6c    if( pIdx->aCol
224a0 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Expr ){.    sqli
224b0 74 65 33 58 50 72 69 6e 74 66 28 26 65 72 72 4d  te3XPrintf(&errM
224c0 73 67 2c 20 22 69 6e 64 65 78 20 27 25 71 27 22  sg, "index '%q'"
224d0 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pIdx->zName);.
224e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
224f0 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b  (j=0; j<pIdx->nK
22500 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  eyCol; j++){.   
22510 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20     char *zCol;. 
22520 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
22530 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d  x->aiColumn[j]>=
22540 30 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 20  0 );.      zCol 
22550 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64  = pTab->aCol[pId
22560 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  x->aiColumn[j]].
22570 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28  zName;.      if(
22580 20 6a 20 29 20 73 71 6c 69 74 65 33 53 74 72 41   j ) sqlite3StrA
22590 63 63 75 6d 41 70 70 65 6e 64 28 26 65 72 72 4d  ccumAppend(&errM
225a0 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b 0a 20 20  sg, ", ", 2);.  
225b0 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
225c0 74 66 28 26 65 72 72 4d 73 67 2c 20 22 25 73 2e  tf(&errMsg, "%s.
225d0 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
225e0 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20  , zCol);.    }. 
225f0 20 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69   }.  zErr = sqli
22600 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
22610 68 28 26 65 72 72 4d 73 67 29 3b 0a 20 20 73 71  h(&errMsg);.  sq
22620 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
22630 69 6e 74 28 70 50 61 72 73 65 2c 20 0a 20 20 20  int(pParse, .   
22640 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64   IsPrimaryKeyInd
22650 65 78 28 70 49 64 78 29 20 3f 20 53 51 4c 49 54  ex(pIdx) ? SQLIT
22660 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49  E_CONSTRAINT_PRI
22670 4d 41 52 59 4b 45 59 20 0a 20 20 20 20 20 20 20  MARYKEY .       
22680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22690 20 20 20 20 20 3a 20 53 51 4c 49 54 45 5f 43 4f       : SQLITE_CO
226a0 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 2c  NSTRAINT_UNIQUE,
226b0 0a 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20 7a 45  .    onError, zE
226c0 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20  rr, P4_DYNAMIC, 
226d0 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69  P5_ConstraintUni
226e0 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  que);.}.../*.** 
226f0 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20  Code an OP_Halt 
22700 64 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69 71 75  due to non-uniqu
22710 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64  e rowid..*/.void
22720 20 73 71 6c 69 74 65 33 52 6f 77 69 64 43 6f 6e   sqlite3RowidCon
22730 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65  straint(.  Parse
22740 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
22750 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
22760 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
22770 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69  ,      /* Confli
22780 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
22790 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54 61 62  gorithm */.  Tab
227a0 6c 65 20 2a 70 54 61 62 20 20 20 20 20 20 20 2f  le *pTab       /
227b0 2a 20 54 68 65 20 74 61 62 6c 65 20 77 69 74 68  * The table with
227c0 20 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75 65 20   the non-unique 
227d0 72 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20 20 63  rowid */ .){.  c
227e0 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74  har *zMsg;.  int
227f0 20 72 63 3b 0a 20 20 69 66 28 20 70 54 61 62 2d   rc;.  if( pTab-
22800 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20  >iPKey>=0 ){.   
22810 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
22820 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
22830 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  b, "%s.%s", pTab
22840 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
22850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22860 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54     pTab->aCol[pT
22870 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65  ab->iPKey].zName
22880 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
22890 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52  TE_CONSTRAINT_PR
228a0 49 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65 6c 73  IMARYKEY;.  }els
228b0 65 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  e{.    zMsg = sq
228c0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
228d0 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72 6f 77  rse->db, "%s.row
228e0 69 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  id", pTab->zName
228f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
22900 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f  TE_CONSTRAINT_RO
22910 57 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  WID;.  }.  sqlit
22920 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
22930 28 70 50 61 72 73 65 2c 20 72 63 2c 20 6f 6e 45  (pParse, rc, onE
22940 72 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  rror, zMsg, P4_D
22950 59 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20 20 20  YNAMIC,.        
22960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22970 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69  P5_ConstraintUni
22980 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  que);.}../*.** C
22990 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
229a0 49 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63  Index uses the c
229b0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
229c0 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e  e pColl.  Return
229d0 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64  .** true if it d
229e0 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66  oes and false if
229f0 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f   it does not..*/
22a00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22a10 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
22a20 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f  tic int collatio
22a30 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61  nMatch(const cha
22a40 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20  r *zColl, Index 
22a50 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20  *pIndex){.  int 
22a60 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f  i;.  assert( zCo
22a70 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  ll!=0 );.  for(i
22a80 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43  =0; i<pIndex->nC
22a90 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
22aa0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
22ab0 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
22ac0 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
22ad0 7a 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e  z!=0 || pIndex->
22ae0 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b  aiColumn[i]<0 );
22af0 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d  .    if( pIndex-
22b00 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20  >aiColumn[i]>=0 
22b10 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
22b20 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29  ICmp(z, zColl) )
22b30 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
22b40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
22b50 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
22b60 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
22b70 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
22b80 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20 74   pTab that use t
22b90 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
22ba0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20  uence pColl..** 
22bb0 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e  If pColl==0 then
22bc0 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   recompute all i
22bd0 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a  ndices of pTab..
22be0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
22bf0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
22c00 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64  tatic void reind
22c10 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  exTable(Parse *p
22c20 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
22c30 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ab, char const *
22c40 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20  zColl){.  Index 
22c50 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
22c60 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
22c70 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
22c80 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72  h pTab */..  for
22c90 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49  (pIndex=pTab->pI
22ca0 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
22cb0 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65  ndex=pIndex->pNe
22cc0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f  xt){.    if( zCo
22cd0 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69  ll==0 || collati
22ce0 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70  onMatch(zColl, p
22cf0 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20  Index) ){.      
22d00 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
22d10 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
22d20 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
22d30 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
22d40 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
22d50 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
22d60 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
22d70 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
22d80 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
22d90 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  ndex, -1);.    }
22da0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
22db0 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61  *.** Recompute a
22dc0 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c  ll indices of al
22dd0 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20  l tables in all 
22de0 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65 20  databases where 
22df0 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75  the.** indices u
22e00 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  se the collating
22e10 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
22e20 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68    If pColl==0 th
22e30 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20  en recompute.** 
22e40 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72  all indices ever
22e50 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64  ywhere..*/.#ifnd
22e60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
22e70 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f  EINDEX.static vo
22e80 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62 61  id reindexDataba
22e90 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ses(Parse *pPars
22ea0 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  e, char const *z
22eb0 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62  Coll){.  Db *pDb
22ec0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22ed0 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
22ee0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
22ef0 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
22f00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
22f10 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  e database index
22f20 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c   number */.  sql
22f30 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
22f40 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20  e->db;   /* The 
22f50 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
22f60 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65  ion */.  HashEle
22f70 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20  m *k;           
22f80 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
22f90 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20  ing over tables 
22fa0 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c  in pDb */.  Tabl
22fb0 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
22fc0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
22fd0 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
22fe0 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  se */..  assert(
22ff0 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
23000 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29  dsAllMutexes(db)
23010 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65 64 20 66   );  /* Needed f
23020 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73 73  or schema access
23030 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c   */.  for(iDb=0,
23040 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44   pDb=db->aDb; iD
23050 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b  b<db->nDb; iDb++
23060 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73  , pDb++){.    as
23070 73 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b 0a  sert( pDb!=0 );.
23080 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65      for(k=sqlite
23090 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
230a0 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
230b0 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48  );  k; k=sqliteH
230c0 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20  ashNext(k)){.   
230d0 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65     pTab = (Table
230e0 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
230f0 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64  (k);.      reind
23100 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  exTable(pParse, 
23110 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  pTab, zColl);.  
23120 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
23130 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
23140 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45   code for the RE
23150 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  INDEX command..*
23160 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  *.**        REIN
23170 44 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20  DEX             
23180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
23190 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 1.**        RE
231a0 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f  INDEX  <collatio
231b0 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n>              
231c0 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20   -- 2.**        
231d0 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62  REINDEX  ?<datab
231e0 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65  ase>.?<tablename
231f0 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20  >  -- 3.**      
23200 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74    REINDEX  ?<dat
23210 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61  abase>.?<indexna
23220 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20  me>  -- 4.**.** 
23230 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c  Form 1 causes al
23240 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
23250 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
23260 73 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c  ses to be rebuil
23270 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62  t..** Form 2 reb
23280 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65  uilds all indice
23290 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
232a0 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  es that use the 
232b0 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69  named.** collati
232c0 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f  ng function.  Fo
232d0 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75  rms 3 and 4 rebu
232e0 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  ild the named in
232f0 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e  dex or all.** in
23300 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
23310 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20   with the named 
23320 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  table..*/.#ifnde
23330 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
23340 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74  INDEX.void sqlit
23350 65 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20  e3Reindex(Parse 
23360 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
23370 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70  pName1, Token *p
23380 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65  Name2){.  CollSe
23390 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
233a0 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
233b0 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62  ng sequence to b
233c0 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20  e reindexed, or 
233d0 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a  NULL */.  char *
233e0 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
233f0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
23400 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
23410 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  x */.  const cha
23420 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20  r *zDb;         
23430 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
23440 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
23450 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
23460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
23470 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
23480 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65  tabase */.  Inde
23490 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
234a0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
234b0 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
234c0 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e  ith pTab */.  in
234d0 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
234e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
234f0 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
23500 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69  number */.  sqli
23510 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
23520 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64  ->db;   /* The d
23530 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
23540 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  on */.  Token *p
23550 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  ObjName;        
23560 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
23570 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
23580 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  x to be reindexe
23590 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20  d */..  /* Read 
235a0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
235b0 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ema. If an error
235c0 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
235d0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
235e0 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e    ** and code in
235f0 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
23600 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66  rn NULL. */.  if
23610 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
23620 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
23630 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
23640 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
23650 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20   pName1==0 ){.  
23660 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73    reindexDatabas
23670 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20  es(pParse, 0);. 
23680 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c     return;.  }el
23690 73 65 20 69 66 28 20 4e 45 56 45 52 28 70 4e 61  se if( NEVER(pNa
236a0 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65  me2==0) || pName
236b0 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63  2->z==0 ){.    c
236c0 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20  har *zColl;.    
236d0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e  assert( pName1->
236e0 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d  z );.    zColl =
236f0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
23700 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
23710 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69  , pName1);.    i
23720 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75  f( !zColl ) retu
23730 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  rn;.    pColl = 
23740 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
23750 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
23760 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69  zColl, 0);.    i
23770 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
23780 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73    reindexDatabas
23790 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  es(pParse, zColl
237a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
237b0 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
237c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
237d0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
237e0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f  e3DbFree(db, zCo
237f0 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  ll);.  }.  iDb =
23800 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
23810 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
23820 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62  e1, pName2, &pOb
23830 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44  jName);.  if( iD
23840 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
23850 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  z = sqlite3NameF
23860 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62  romToken(db, pOb
23870 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d  jName);.  if( z=
23880 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  =0 ) return;.  z
23890 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
238a0 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 70 54  ].zDbSName;.  pT
238b0 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
238c0 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62  Table(db, z, zDb
238d0 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b  );.  if( pTab ){
238e0 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c  .    reindexTabl
238f0 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
23900 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  0);.    sqlite3D
23910 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
23920 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
23930 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
23940 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c  FindIndex(db, z,
23950 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   zDb);.  sqlite3
23960 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
23970 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
23980 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
23990 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
239a0 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
239b0 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
239c0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
239d0 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72  ndex, -1);.    r
239e0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
239f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
23a00 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
23a10 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a  identify the obj
23a20 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65  ect to be reinde
23a30 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  xed");.}.#endif.
23a40 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
23a50 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
23a60 65 20 74 68 61 74 20 69 73 20 61 70 70 72 6f 70  e that is approp
23a70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69  riate for the gi
23a80 76 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  ven Index..**.**
23a90 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   The caller shou
23aa0 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ld invoke sqlite
23ab0 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 29 20  3KeyInfoUnref() 
23ac0 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  on the returned 
23ad0 6f 62 6a 65 63 74 0a 2a 2a 20 77 68 65 6e 20 69  object.** when i
23ae0 74 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 75  t has finished u
23af0 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49  sing it..*/.KeyI
23b00 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49  nfo *sqlite3KeyI
23b10 6e 66 6f 4f 66 49 6e 64 65 78 28 50 61 72 73 65  nfoOfIndex(Parse
23b20 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
23b30 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b  *pIdx){.  int i;
23b40 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49  .  int nCol = pI
23b50 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69  dx->nColumn;.  i
23b60 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d 3e  nt nKey = pIdx->
23b70 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e  nKeyCol;.  KeyIn
23b80 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20  fo *pKey;.  if( 
23b90 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
23ba0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
23bb0 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  Idx->uniqNotNull
23bc0 20 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73   ){.    pKey = s
23bd0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
23be0 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  oc(pParse->db, n
23bf0 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b  Key, nCol-nKey);
23c00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b  .  }else{.    pK
23c10 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  ey = sqlite3KeyI
23c20 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  nfoAlloc(pParse-
23c30 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20  >db, nCol, 0);. 
23c40 20 7d 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b   }.  if( pKey ){
23c50 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
23c60 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
23c70 74 65 61 62 6c 65 28 70 4b 65 79 29 20 29 3b 0a  teable(pKey) );.
23c80 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
23c90 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
23ca0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
23cb0 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ll = pIdx->azCol
23cc0 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79  l[i];.      pKey
23cd0 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f  ->aColl[i] = zCo
23ce0 6c 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 42 49  ll==sqlite3StrBI
23cf0 4e 41 52 59 20 3f 20 30 20 3a 0a 20 20 20 20 20  NARY ? 0 :.     
23d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d10 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65     sqlite3Locate
23d20 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
23d30 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b  zColl);.      pK
23d40 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ey->aSortOrder[i
23d50 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ] = pIdx->aSortO
23d60 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  rder[i];.    }. 
23d70 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
23d80 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Err ){.      sql
23d90 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
23da0 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 70 4b  (pKey);.      pK
23db0 65 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ey = 0;.    }.  
23dc0 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b  }.  return pKey;
23dd0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
23de0 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a  TE_OMIT_CTE./* .
23df0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
23e00 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
23e10 70 65 72 20 43 54 45 20 62 79 20 74 68 65 20 70  per CTE by the p
23e20 61 72 73 65 72 20 77 68 69 6c 65 20 70 61 72 73  arser while pars
23e30 69 6e 67 20 61 20 0a 2a 2a 20 57 49 54 48 20 63  ing a .** WITH c
23e40 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68 20  lause. .*/.With 
23e50 2a 73 71 6c 69 74 65 33 57 69 74 68 41 64 64 28  *sqlite3WithAdd(
23e60 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
23e70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
23e80 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
23e90 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20  .  With *pWith, 
23ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
23eb0 69 73 74 69 6e 67 20 57 49 54 48 20 63 6c 61 75  isting WITH clau
23ec0 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  se, or NULL */. 
23ed0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20   Token *pName,  
23ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
23ef0 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74   of the common-t
23f00 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
23f10 73 74 20 2a 70 41 72 67 6c 69 73 74 2c 20 20 20  st *pArglist,   
23f20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63 6f    /* Optional co
23f30 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20 66  lumn name list f
23f40 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  or the table */.
23f50 20 20 53 65 6c 65 63 74 20 2a 70 51 75 65 72 79    Select *pQuery
23f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65            /* Que
23f70 72 79 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69  ry used to initi
23f80 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c 65 20  alize the table 
23f90 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
23fa0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
23fb0 3b 0a 20 20 57 69 74 68 20 2a 70 4e 65 77 3b 0a  ;.  With *pNew;.
23fc0 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a    char *zName;..
23fd0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
23fe0 74 68 65 20 43 54 45 20 6e 61 6d 65 20 69 73 20  the CTE name is 
23ff0 75 6e 69 71 75 65 20 77 69 74 68 69 6e 20 74 68  unique within th
24000 69 73 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20  is WITH clause. 
24010 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f  If.  ** not, sto
24020 72 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74  re an error in t
24030 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74 75  he Parse structu
24040 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d  re. */.  zName =
24050 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
24060 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
24070 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
24080 7a 4e 61 6d 65 20 26 26 20 70 57 69 74 68 20 29  zName && pWith )
24090 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
240a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74   for(i=0; i<pWit
240b0 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  h->nCte; i++){. 
240c0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
240d0 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70  StrICmp(zName, p
240e0 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  With->a[i].zName
240f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
24100 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
24110 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61  pParse, "duplica
24120 74 65 20 57 49 54 48 20 74 61 62 6c 65 20 6e 61  te WITH table na
24130 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  me: %s", zName);
24140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
24150 20 7d 0a 0a 20 20 69 66 28 20 70 57 69 74 68 20   }..  if( pWith 
24160 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  ){.    int nByte
24170 20 3d 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68   = sizeof(*pWith
24180 29 20 2b 20 28 73 69 7a 65 6f 66 28 70 57 69 74  ) + (sizeof(pWit
24190 68 2d 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74 68  h->a[1]) * pWith
241a0 2d 3e 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e 65  ->nCte);.    pNe
241b0 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
241c0 6c 6c 6f 63 28 64 62 2c 20 70 57 69 74 68 2c 20  lloc(db, pWith, 
241d0 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  nByte);.  }else{
241e0 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
241f0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
24200 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69 74  db, sizeof(*pWit
24210 68 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  h));.  }.  asser
24220 74 28 20 28 70 4e 65 77 21 3d 30 20 26 26 20 7a  t( (pNew!=0 && z
24230 4e 61 6d 65 21 3d 30 29 20 7c 7c 20 64 62 2d 3e  Name!=0) || db->
24240 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
24250 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
24260 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
24270 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
24280 6c 65 74 65 28 64 62 2c 20 70 41 72 67 6c 69 73  lete(db, pArglis
24290 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  t);.    sqlite3S
242a0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
242b0 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c  pQuery);.    sql
242c0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
242d0 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 20  Name);.    pNew 
242e0 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65  = pWith;.  }else
242f0 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e  {.    pNew->a[pN
24300 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63  ew->nCte].pSelec
24310 74 20 3d 20 70 51 75 65 72 79 3b 0a 20 20 20 20  t = pQuery;.    
24320 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43  pNew->a[pNew->nC
24330 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67  te].pCols = pArg
24340 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  list;.    pNew->
24350 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e  a[pNew->nCte].zN
24360 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
24370 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
24380 43 74 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20 30  Cte].zCteErr = 0
24390 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65  ;.    pNew->nCte
243a0 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ++;.  }..  retur
243b0 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
243c0 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e   Free the conten
243d0 74 73 20 6f 66 20 74 68 65 20 57 69 74 68 20 6f  ts of the With o
243e0 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
243f0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
24400 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
24410 69 74 65 33 57 69 74 68 44 65 6c 65 74 65 28 73  ite3WithDelete(s
24420 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68  qlite3 *db, With
24430 20 2a 70 57 69 74 68 29 7b 0a 20 20 69 66 28 20   *pWith){.  if( 
24440 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74  pWith ){.    int
24450 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
24460 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20   i<pWith->nCte; 
24470 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
24480 63 74 20 43 74 65 20 2a 70 43 74 65 20 3d 20 26  ct Cte *pCte = &
24490 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20  pWith->a[i];.   
244a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
244b0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74  stDelete(db, pCt
244c0 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20  e->pCols);.     
244d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
244e0 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70  lete(db, pCte->p
244f0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73  Select);.      s
24500 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
24510 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
24520 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
24530 44 62 46 72 65 65 28 64 62 2c 20 70 57 69 74 68  DbFree(db, pWith
24540 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
24550 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
24560 54 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a  TE_OMIT_CTE) */.