/ Hex Artifact Content
Login

Artifact 4026a9c554b233e50c5e9ad46963e676cf54dd2306d952aa1eaa07a1bc9ce14f:


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 20 20 70  nTabRef = 1;.  p
78c0: 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73  Table->nRowLogEs
78d0: 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
78e0: 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
78f0: 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
7900: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
7910: 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29  ->pNewTable==0 )
7920: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  ;.  pParse->pNew
7930: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
7940: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
7950: 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74   the magic sqlit
7960: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
7970: 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63   used by autoinc
7980: 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65  rement,.  ** the
7990: 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74  n record a point
79a0: 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  er to this table
79b0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
79c0: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a  abase structure.
79d0: 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53    ** so that INS
79e0: 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65  ERT can find the
79f0: 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20   table easily.. 
7a00: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
7a10: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
7a20: 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61  EMENT.  if( !pPa
7a30: 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73  rse->nested && s
7a40: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  trcmp(zName, "sq
7a50: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d  lite_sequence")=
7a60: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
7a70: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
7a80: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
7a90: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 54 61 62  , 0) );.    pTab
7aa0: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  le->pSchema->pSe
7ab0: 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20  qTab = pTable;. 
7ac0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
7ad0: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
7ae0: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77   the code that w
7af0: 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74  ill insert the t
7b00: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  able record into
7b10: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  .  ** the SQLITE
7b20: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
7b30: 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c  Note in particul
7b40: 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20  ar that we must 
7b50: 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e  go ahead.  ** an
7b60: 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  d allocate the r
7b70: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
7b80: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
7b90: 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e   now.  Before an
7ba0: 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  y.  ** PRIMARY K
7bb0: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79  EY or UNIQUE key
7bc0: 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64  words are parsed
7bd0: 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64  .  Those keyword
7be0: 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a  s will cause.  *
7bf0: 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20  * indices to be 
7c00: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
7c10: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73  table record mus
7c20: 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68  t come before th
7c30: 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  e .  ** indices.
7c40: 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63    Hence, the rec
7c50: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
7c60: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
7c70: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
7c80: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
7c90: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
7ca0: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
7cb0: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
7cc0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  0 ){.    int add
7cd0: 72 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65  r1;.    int file
7ce0: 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20  Format;.    int 
7cf0: 72 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67 33  reg1, reg2, reg3
7d00: 3b 0a 20 20 20 20 2f 2a 20 6e 75 6c 6c 52 6f 77  ;.    /* nullRow
7d10: 5b 5d 20 69 73 20 61 6e 20 4f 50 5f 52 65 63 6f  [] is an OP_Reco
7d20: 72 64 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61  rd encoding of a
7d30: 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
7d40: 35 20 4e 55 4c 4c 73 20 2a 2f 0a 20 20 20 20 73  5 NULLs */.    s
7d50: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
7d60: 20 6e 75 6c 6c 52 6f 77 5b 5d 20 3d 20 7b 20 36   nullRow[] = { 6
7d70: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20  , 0, 0, 0, 0, 0 
7d80: 7d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  };.    sqlite3Be
7d90: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
7da0: 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
7db0: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
7dc0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7dd0: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56  ABLE.    if( isV
7de0: 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20  irtual ){.      
7df0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7e00: 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b  0(v, OP_VBegin);
7e10: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
7e20: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
7e30: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63  e format and enc
7e40: 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74  oding in the dat
7e50: 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62  abase have not b
7e60: 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a  een set, .    **
7e70: 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20   set them now.. 
7e80: 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d     */.    reg1 =
7e90: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
7ea0: 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
7eb0: 65 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70  em;.    reg2 = p
7ec0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d  Parse->regRoot =
7ed0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
7ee0: 0a 20 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50  .    reg3 = ++pP
7ef0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
7f00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7f10: 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b  3(v, OP_ReadCook
7f20: 69 65 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 42  ie, iDb, reg3, B
7f30: 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  TREE_FILE_FORMAT
7f40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7f50: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
7f60: 44 62 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d  Db);.    addr1 =
7f70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7f80: 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p1(v, OP_If, reg
7f90: 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  3); VdbeCoverage
7fa0: 28 76 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72  (v);.    fileFor
7fb0: 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mat = (db->flags
7fc0: 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79   & SQLITE_Legacy
7fd0: 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20  FileFmt)!=0 ?.  
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ff0: 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  1 : SQLITE_MAX_F
8000: 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20  ILE_FORMAT;.    
8010: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8020: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
8030: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49  e, iDb, BTREE_FI
8040: 4c 45 5f 46 4f 52 4d 41 54 2c 20 66 69 6c 65 46  LE_FORMAT, fileF
8050: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69  ormat);.    sqli
8060: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8070: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
8080: 44 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f 45  Db, BTREE_TEXT_E
8090: 4e 43 4f 44 49 4e 47 2c 20 45 4e 43 28 64 62 29  NCODING, ENC(db)
80a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
80b0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
80c0: 64 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  dr1);..    /* Th
80d0: 69 73 20 6a 75 73 74 20 63 72 65 61 74 65 73 20  is just creates 
80e0: 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72  a place-holder r
80f0: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c  ecord in the sql
8100: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
8110: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  ..    ** The rec
8120: 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f 65 73  ord created does
8130: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79   not contain any
8140: 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77  thing yet.  It w
8150: 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a  ill be replaced.
8160: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65      ** by the re
8170: 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65  al entry in code
8180: 20 67 65 6e 65 72 61 74 65 64 20 61 74 20 73 71   generated at sq
8190: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e  lite3EndTable().
81a0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
81b0: 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
81c0: 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65   new entry is le
81d0: 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 70  ft in register p
81e0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 2e  Parse->regRowid.
81f0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f 74  .    ** The root
8200: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
8210: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 69 73  the new table is
8220: 20 6c 65 66 74 20 69 6e 20 72 65 67 20 70 50 61   left in reg pPa
8230: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20  rse->regRoot..  
8240: 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 61    ** The rowid a
8250: 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  nd root page num
8260: 62 65 72 20 76 61 6c 75 65 73 20 61 72 65 20 6e  ber values are n
8270: 65 65 64 65 64 20 62 79 20 74 68 65 20 63 6f 64  eeded by the cod
8280: 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 73 71  e that.    ** sq
8290: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69  lite3EndTable wi
82a0: 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20  ll generate..   
82b0: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
82c0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
82d0: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
82e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
82f0: 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28  ALTABLE).    if(
8300: 20 69 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72   isView || isVir
8310: 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  tual ){.      sq
8320: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8330: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
8340: 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c  , reg2);.    }el
8350: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
8360: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 64        pParse->ad
8370: 64 72 43 72 54 61 62 20 3d 20 73 71 6c 69 74 65  drCrTab = sqlite
8380: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8390: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 69  P_CreateTable, i
83a0: 44 62 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d  Db, reg2);.    }
83b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
83c0: 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61 72  MasterTable(pPar
83d0: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  se, iDb);.    sq
83e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
83f0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
8400: 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71  0, reg1);.    sq
8410: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
8420: 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c 20 72  v, OP_Blob, 6, r
8430: 65 67 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f 77 2c  eg3, 0, nullRow,
8440: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
8450: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8460: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
8470: 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b   0, reg3, reg1);
8480: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8490: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
84a0: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
84b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
84c0: 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a  0(v, OP_Close);.
84d0: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
84e0: 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74   (non-error) ret
84f0: 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  urn. */.  return
8500: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
8510: 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a  ror occurs, we j
8520: 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69  ump here */.begi
8530: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20  n_table_error:. 
8540: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8550: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
8560: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74 20 70  urn;.}../* Set p
8570: 72 6f 70 65 72 74 69 65 73 20 6f 66 20 61 20 74  roperties of a t
8580: 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 62 61 73 65  able column base
8590: 64 20 6f 6e 20 74 68 65 20 28 6d 61 67 69 63 61  d on the (magica
85a0: 6c 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68  l).** name of th
85b0: 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23 69 66  e column..*/.#if
85c0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 48   SQLITE_ENABLE_H
85d0: 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a 76 6f  IDDEN_COLUMNS.vo
85e0: 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  id sqlite3Column
85f0: 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61  PropertiesFromNa
8600: 6d 65 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  me(Table *pTab, 
8610: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 20  Column *pCol){. 
8620: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
8630: 6e 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  nicmp(pCol->zNam
8640: 65 2c 20 22 5f 5f 68 69 64 64 65 6e 5f 5f 22 2c  e, "__hidden__",
8650: 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70   10)==0 ){.    p
8660: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col->colFlags |=
8670: 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 3b   COLFLAG_HIDDEN;
8680: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61  .  }else if( pTa
8690: 62 20 26 26 20 70 43 6f 6c 21 3d 70 54 61 62 2d  b && pCol!=pTab-
86a0: 3e 61 43 6f 6c 20 26 26 20 28 70 43 6f 6c 5b 2d  >aCol && (pCol[-
86b0: 31 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f  1].colFlags & CO
86c0: 4c 46 4c 41 47 5f 48 49 44 44 45 4e 29 20 29 7b  LFLAG_HIDDEN) ){
86d0: 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
86e0: 61 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48 69 64  ags |= TF_OOOHid
86f0: 64 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  den;.  }.}.#endi
8700: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  f.../*.** Add a 
8710: 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68  new column to th
8720: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
8730: 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
8740: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
8750: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
8760: 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f   routine once fo
8770: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65  r each column de
8780: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  claration.** in 
8790: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
87a0: 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74  tatement.  sqlit
87b0: 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20 67  e3StartTable() g
87c0: 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69  ets called.** fi
87d0: 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67  rst to get thing
87e0: 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74  s going.  Then t
87f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
8800: 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a  alled for each.*
8810: 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69  * column..*/.voi
8820: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
8830: 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mn(Parse *pParse
8840: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20  , Token *pName, 
8850: 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20  Token *pType){. 
8860: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
8870: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   i;.  char *z;. 
8880: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20   char *zType;.  
8890: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
88a0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
88b0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
88c0: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
88d0: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
88e0: 75 72 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  urn;.#if SQLITE_
88f0: 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28  MAX_COLUMN.  if(
8900: 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61   p->nCol+1>db->a
8910: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
8920: 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
8930: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8940: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
8950: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25  any columns on %
8960: 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  s", p->zName);. 
8970: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
8980: 65 6e 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c 69  endif.  z = sqli
8990: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
89a0: 62 2c 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 70 54  b, pName->n + pT
89b0: 79 70 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20 20 69  ype->n + 2);.  i
89c0: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
89d0: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e  ;.  memcpy(z, pN
89e0: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
89f0: 29 3b 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d  );.  z[pName->n]
8a00: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
8a10: 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72  equote(z);.  for
8a20: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
8a30: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
8a40: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
8a50: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  , p->aCol[i].zNa
8a60: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
8a70: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8a80: 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61  pParse, "duplica
8a90: 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  te column name: 
8aa0: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73  %s", z);.      s
8ab0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8ac0: 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   z);.      retur
8ad0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  n;.    }.  }.  i
8ae0: 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78  f( (p->nCol & 0x
8af0: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c  7)==0 ){.    Col
8b00: 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61  umn *aNew;.    a
8b10: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
8b20: 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f  ealloc(db,p->aCo
8b30: 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69  l,(p->nCol+8)*si
8b40: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
8b50: 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d  );.    if( aNew=
8b60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
8b70: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
8b80: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
8b90: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f      }.    p->aCo
8ba0: 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20  l = aNew;.  }.  
8bb0: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
8bc0: 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73  p->nCol];.  mems
8bd0: 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65  et(pCol, 0, size
8be0: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
8bf0: 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d  .  pCol->zName =
8c00: 20 7a 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c   z;.  sqlite3Col
8c10: 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f  umnPropertiesFro
8c20: 6d 4e 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a  mName(p, pCol);.
8c30: 20 0a 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e   .  if( pType->n
8c40: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
8c50: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70   there is no typ
8c60: 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c  e specified, col
8c70: 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64 65  umns have the de
8c80: 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20  fault affinity. 
8c90: 20 20 20 2a 2a 20 27 42 4c 4f 42 27 2e 20 2a 2f     ** 'BLOB'. */
8ca0: 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
8cb0: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
8cc0: 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 2d  _BLOB;.    pCol-
8cd0: 3e 73 7a 45 73 74 20 3d 20 31 3b 0a 20 20 7d 65  >szEst = 1;.  }e
8ce0: 6c 73 65 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  lse{.    zType =
8cf0: 20 7a 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c   z + sqlite3Strl
8d00: 65 6e 33 30 28 7a 29 20 2b 20 31 3b 0a 20 20 20  en30(z) + 1;.   
8d10: 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c 20 70   memcpy(zType, p
8d20: 54 79 70 65 2d 3e 7a 2c 20 70 54 79 70 65 2d 3e  Type->z, pType->
8d30: 6e 29 3b 0a 20 20 20 20 7a 54 79 70 65 5b 70 54  n);.    zType[pT
8d40: 79 70 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20  ype->n] = 0;.   
8d50: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
8d60: 7a 54 79 70 65 29 3b 0a 20 20 20 20 70 43 6f 6c  zType);.    pCol
8d70: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
8d80: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
8d90: 28 7a 54 79 70 65 2c 20 26 70 43 6f 6c 2d 3e 73  (zType, &pCol->s
8da0: 7a 45 73 74 29 3b 0a 20 20 20 20 70 43 6f 6c 2d  zEst);.    pCol-
8db0: 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  >colFlags |= COL
8dc0: 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20 20  FLAG_HASTYPE;.  
8dd0: 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 20  }.  p->nCol++;. 
8de0: 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61   pParse->constra
8df0: 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b 0a 7d  intName.n = 0;.}
8e00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8e10: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
8e20: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
8e30: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
8e40: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
8e50: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
8e60: 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54  atement.  A "NOT
8e70: 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e   NULL" constrain
8e80: 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65  t has.** been se
8e90: 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20  en on a column. 
8ea0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
8eb0: 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66  ts the notNull f
8ec0: 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f  lag on.** the co
8ed0: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
8ee0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
8ef0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
8f00: 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72  e3AddNotNull(Par
8f10: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
8f20: 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c  onError){.  Tabl
8f30: 65 20 2a 70 3b 0a 20 20 70 20 3d 20 70 50 61 72  e *p;.  p = pPar
8f40: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
8f50: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56   if( p==0 || NEV
8f60: 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20  ER(p->nCol<1) ) 
8f70: 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 61 43 6f  return;.  p->aCo
8f80: 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74  l[p->nCol-1].not
8f90: 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72  Null = (u8)onErr
8fa0: 6f 72 3b 0a 20 20 70 2d 3e 74 61 62 46 6c 61 67  or;.  p->tabFlag
8fb0: 73 20 7c 3d 20 54 46 5f 48 61 73 4e 6f 74 4e 75  s |= TF_HasNotNu
8fc0: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61  ll;.}../*.** Sca
8fd0: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  n the column typ
8fe0: 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65  e name zType (le
8ff0: 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20  ngth nType) and 
9000: 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73  return the.** as
9010: 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69 74  sociated affinit
9020: 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  y type..**.** Th
9030: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
9040: 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65  a case-independe
9050: 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79  nt search of zTy
9060: 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73  pe for the .** s
9070: 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65  ubstrings in the
9080: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
9090: 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  . If one of the 
90a0: 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a  substrings is.**
90b0: 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72   found, the corr
90c0: 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69  esponding affini
90d0: 74 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ty is returned. 
90e0: 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e  If zType contain
90f0: 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s.** more than o
9100: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
9110: 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f  ings, entries to
9120: 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20  ward the top of 
9130: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61  .** the table ta
9140: 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72  ke priority. For
9150: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79   example, if zTy
9160: 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c  pe is 'BLOBINT',
9170: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f   .** SQLITE_AFF_
9180: 49 4e 54 45 47 45 52 20 69 73 20 72 65 74 75 72  INTEGER is retur
9190: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74  ned..**.** Subst
91a0: 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e  ring     | Affin
91b0: 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ity.** ---------
91c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91d0: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27  -------.** 'INT'
91e0: 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
91f0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a  E_AFF_INTEGER.**
9200: 20 27 43 48 41 52 27 20 20 20 20 20 20 20 20 7c   'CHAR'        |
9210: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
9220: 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20  .** 'CLOB'      
9230: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
9240: 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20  EXT.** 'TEXT'   
9250: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
9260: 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27  F_TEXT.** 'BLOB'
9270: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
9280: 5f 41 46 46 5f 42 4c 4f 42 0a 2a 2a 20 27 52 45  _AFF_BLOB.** 'RE
9290: 41 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  AL'        | SQL
92a0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20  ITE_AFF_REAL.** 
92b0: 27 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20  'FLOA'        | 
92c0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
92d0: 2a 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20 20  ** 'DOUB'       
92e0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
92f0: 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65  AL.**.** If none
9300: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
9310: 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  gs in the above 
9320: 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c  table are found,
9330: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  .** SQLITE_AFF_N
9340: 55 4d 45 52 49 43 20 69 73 20 72 65 74 75 72 6e  UMERIC is return
9350: 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  ed..*/.char sqli
9360: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
9370: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c  const char *zIn,
9380: 20 75 38 20 2a 70 73 7a 45 73 74 29 7b 0a 20 20   u8 *pszEst){.  
9390: 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61  u32 h = 0;.  cha
93a0: 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41  r aff = SQLITE_A
93b0: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f  FF_NUMERIC;.  co
93c0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72 20  nst char *zChar 
93d0: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
93e0: 7a 49 6e 21 3d 30 20 29 3b 0a 20 20 77 68 69 6c  zIn!=0 );.  whil
93f0: 65 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20  e( zIn[0] ){.   
9400: 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71   h = (h<<8) + sq
9410: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
9420: 72 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a  r[(*zIn)&0xff];.
9430: 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69      zIn++;.    i
9440: 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29  f( h==(('c'<<24)
9450: 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c  +('h'<<16)+('a'<
9460: 3c 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20  <8)+'r') ){     
9470: 20 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20          /* CHAR 
9480: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
9490: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
94a0: 20 20 20 20 20 20 7a 43 68 61 72 20 3d 20 7a 49        zChar = zI
94b0: 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  n;.    }else if(
94c0: 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28   h==(('c'<<24)+(
94d0: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
94e0: 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20  )+'b') ){       
94f0: 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20  /* CLOB */.     
9500: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9510: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
9520: 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c  e if( h==(('t'<<
9530: 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27  24)+('e'<<16)+('
9540: 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20  x'<<8)+'t') ){  
9550: 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a       /* TEXT */.
9560: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9570: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
9580: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
9590: 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'b'<<24)+('l'<<1
95a0: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29  6)+('o'<<8)+'b')
95b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f            /* BLO
95c0: 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  B */.        && 
95d0: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
95e0: 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d  _NUMERIC || aff=
95f0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
9600: 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  ) ){.      aff =
9610: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
9620: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 5b  ;.      if( zIn[
9630: 30 5d 3d 3d 27 28 27 20 29 20 7a 43 68 61 72 20  0]=='(' ) zChar 
9640: 3d 20 7a 49 6e 3b 0a 23 69 66 6e 64 65 66 20 53  = zIn;.#ifndef S
9650: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
9660: 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65  ING_POINT.    }e
9670: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27  lse if( h==(('r'
9680: 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b  <<24)+('e'<<16)+
9690: 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20  ('a'<<8)+'l')   
96a0: 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a         /* REAL *
96b0: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
96c0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
96d0: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
96e0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
96f0: 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EAL;.    }else i
9700: 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29  f( h==(('f'<<24)
9710: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
9720: 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20  <8)+'a')        
9730: 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20    /* FLOA */.   
9740: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
9750: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9760: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
9770: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
9780: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9790: 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27  =(('d'<<24)+('o'
97a0: 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27  <<16)+('u'<<8)+'
97b0: 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b')          /* 
97c0: 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20  DOUB */.        
97d0: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
97e0: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
97f0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9800: 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69  _AFF_REAL;.#endi
9810: 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  f.    }else if( 
9820: 28 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d  (h&0x00FFFFFF)==
9830: 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c  (('i'<<16)+('n'<
9840: 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f  <8)+'t') ){    /
9850: 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61  * INT */.      a
9860: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9870: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62  INTEGER;.      b
9880: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
9890: 0a 20 20 2f 2a 20 49 66 20 70 73 7a 45 73 74 20  .  /* If pszEst 
98a0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f  is not NULL, sto
98b0: 72 65 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  re an estimate o
98c0: 66 20 74 68 65 20 66 69 65 6c 64 20 73 69 7a 65  f the field size
98d0: 2e 20 20 54 68 65 0a 20 20 2a 2a 20 65 73 74 69  .  The.  ** esti
98e0: 6d 61 74 65 20 69 73 20 73 63 61 6c 65 64 20 73  mate is scaled s
98f0: 6f 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  o that the size 
9900: 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 69 73  of an integer is
9910: 20 31 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 73   1.  */.  if( ps
9920: 7a 45 73 74 20 29 7b 0a 20 20 20 20 2a 70 73 7a  zEst ){.    *psz
9930: 45 73 74 20 3d 20 31 3b 20 20 20 2f 2a 20 64 65  Est = 1;   /* de
9940: 66 61 75 6c 74 20 73 69 7a 65 20 69 73 20 61 70  fault size is ap
9950: 70 72 6f 78 20 34 20 62 79 74 65 73 20 2a 2f 0a  prox 4 bytes */.
9960: 20 20 20 20 69 66 28 20 61 66 66 3c 53 51 4c 49      if( aff<SQLI
9970: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
9980: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 68 61  {.      if( zCha
9990: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  r ){.        whi
99a0: 6c 65 28 20 7a 43 68 61 72 5b 30 5d 20 29 7b 0a  le( zChar[0] ){.
99b0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
99c0: 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 43 68  lite3Isdigit(zCh
99d0: 61 72 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  ar[0]) ){.      
99e0: 20 20 20 20 20 20 69 6e 74 20 76 20 3d 20 30 3b        int v = 0;
99f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
9a00: 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 43 68  ite3GetInt32(zCh
9a10: 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20  ar, &v);.       
9a20: 20 20 20 20 20 76 20 3d 20 76 2f 34 20 2b 20 31       v = v/4 + 1
9a30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
9a40: 28 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32 35  ( v>255 ) v = 25
9a50: 35 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  5;.            *
9a60: 70 73 7a 45 73 74 20 3d 20 76 3b 20 2f 2a 20 42  pszEst = v; /* B
9a70: 4c 4f 42 28 6b 29 2c 20 56 41 52 43 48 41 52 28  LOB(k), VARCHAR(
9a80: 6b 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20 72  k), CHAR(k) -> r
9a90: 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20  =(k/4+1) */.    
9aa0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9ab0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9ac0: 20 20 20 20 20 7a 43 68 61 72 2b 2b 3b 0a 20 20       zChar++;.  
9ad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
9ae0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 73  lse{.        *ps
9af0: 7a 45 73 74 20 3d 20 35 3b 20 20 20 2f 2a 20 42  zEst = 5;   /* B
9b00: 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f 42 20  LOB, TEXT, CLOB 
9b10: 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f 78 20  -> r=5  (approx 
9b20: 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20 20 20  20 bytes)*/.    
9b30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9b40: 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f  return aff;.}../
9b50: 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73  *.** The express
9b60: 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ion is the defau
9b70: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
9b80: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
9b90: 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f  dded column.** o
9ba0: 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  f the table curr
9bb0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
9bc0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
9bd0: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78  Default value ex
9be0: 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62  pressions must b
9bf0: 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69  e constant.  Rai
9c00: 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  se an exception 
9c10: 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f  if this.** is no
9c20: 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a  t the case..**.*
9c30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9c40: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
9c50: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
9c60: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
9c70: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
9c80: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
9c90: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
9ca0: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
9cb0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
9cc0: 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e   ExprSpan *pSpan
9cd0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
9ce0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
9cf0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9d00: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d  Parse->db;.  p =
9d10: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9d20: 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29  le;.  if( p!=0 )
9d30: 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70  {.    pCol = &(p
9d40: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
9d50: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c  ]);.    if( !sql
9d60: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
9d70: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 53 70  ntOrFunction(pSp
9d80: 61 6e 2d 3e 70 45 78 70 72 2c 20 64 62 2d 3e 69  an->pExpr, db->i
9d90: 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20  nit.busy) ){.   
9da0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9db0: 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61  sg(pParse, "defa
9dc0: 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c  ult value of col
9dd0: 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20  umn [%s] is not 
9de0: 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20  constant",.     
9df0: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65       pCol->zName
9e00: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9e10: 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
9e20: 20 70 45 78 70 72 20 69 73 20 75 73 65 64 20 69   pExpr is used i
9e30: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 6f 72  nstead of the or
9e40: 69 67 69 6e 61 6c 2c 20 61 73 20 70 45 78 70 72  iginal, as pExpr
9e50: 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
9e60: 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 70  ** tokens that p
9e70: 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c 65  oint to volatile
9e80: 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27 73 70   memory. The 'sp
9e90: 61 6e 27 20 6f 66 20 74 68 65 20 65 78 70 72 65  an' of the expre
9ea0: 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ssion.      ** i
9eb0: 73 20 72 65 71 75 69 72 65 64 20 62 79 20 70 72  s required by pr
9ec0: 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66 6f 2e  agma table_info.
9ed0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9ee0: 45 78 70 72 20 78 3b 0a 20 20 20 20 20 20 73 71  Expr x;.      sq
9ef0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
9f00: 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29  db, pCol->pDflt)
9f10: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
9f20: 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29  x, 0, sizeof(x))
9f30: 3b 0a 20 20 20 20 20 20 78 2e 6f 70 20 3d 20 54  ;.      x.op = T
9f40: 4b 5f 53 50 41 4e 3b 0a 20 20 20 20 20 20 78 2e  K_SPAN;.      x.
9f50: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74  u.zToken = sqlit
9f60: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
9f70: 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53  (char*)pSpan->zS
9f80: 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20  tart,.          
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fa0: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
9fb0: 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53  pSpan->zEnd - pS
9fc0: 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20  pan->zStart));. 
9fd0: 20 20 20 20 20 78 2e 70 4c 65 66 74 20 3d 20 70       x.pLeft = p
9fe0: 53 70 61 6e 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Span->pExpr;.   
9ff0: 20 20 20 78 2e 66 6c 61 67 73 20 3d 20 45 50 5f     x.flags = EP_
a000: 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 43 6f 6c  Skip;.      pCol
a010: 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65  ->pDflt = sqlite
a020: 33 45 78 70 72 44 75 70 28 64 62 2c 20 26 78 2c  3ExprDup(db, &x,
a030: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
a040: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
a050: 62 46 72 65 65 28 64 62 2c 20 78 2e 75 2e 7a 54  bFree(db, x.u.zT
a060: 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  oken);.    }.  }
a070: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
a080: 6c 65 74 65 28 64 62 2c 20 70 53 70 61 6e 2d 3e  lete(db, pSpan->
a090: 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
a0a0: 20 42 61 63 6b 77 61 72 64 73 20 43 6f 6d 70 61   Backwards Compa
a0b0: 74 69 62 69 6c 69 74 79 20 48 61 63 6b 3a 0a 2a  tibility Hack:.*
a0c0: 2a 20 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c  * .** Historical
a0d0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
a0e0: 69 74 65 20 61 63 63 65 70 74 65 64 20 73 74 72  ite accepted str
a0f0: 69 6e 67 73 20 61 73 20 63 6f 6c 75 6d 6e 20 6e  ings as column n
a100: 61 6d 65 73 20 69 6e 0a 2a 2a 20 69 6e 64 65 78  ames in.** index
a110: 65 73 20 61 6e 64 20 50 52 49 4d 41 52 59 20 4b  es and PRIMARY K
a120: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  EY constraints a
a130: 6e 64 20 69 6e 20 55 4e 49 51 55 45 20 63 6f 6e  nd in UNIQUE con
a140: 73 74 72 61 69 6e 74 73 2e 20 20 45 78 61 6d 70  straints.  Examp
a150: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52  le:.**.**     CR
a160: 45 41 54 45 20 54 41 42 4c 45 20 78 79 7a 28 61  EATE TABLE xyz(a
a170: 2c 62 2c 63 2c 64 2c 65 2c 50 52 49 4d 41 52 59  ,b,c,d,e,PRIMARY
a180: 20 4b 45 59 28 27 61 27 29 2c 55 4e 49 51 55 45   KEY('a'),UNIQUE
a190: 28 27 62 27 2c 27 63 27 20 43 4f 4c 4c 41 54 45  ('b','c' COLLATE
a1a0: 20 74 72 69 6d 29 0a 2a 2a 20 20 20 20 20 43 52   trim).**     CR
a1b0: 45 41 54 45 20 49 4e 44 45 58 20 61 62 63 20 4f  EATE INDEX abc O
a1c0: 4e 20 78 79 7a 28 27 63 27 2c 27 64 27 20 44 45  N xyz('c','d' DE
a1d0: 53 43 2c 27 65 27 20 43 4f 4c 4c 41 54 45 20 6e  SC,'e' COLLATE n
a1e0: 6f 63 61 73 65 20 44 45 53 43 29 3b 0a 2a 2a 0a  ocase DESC);.**.
a1f0: 2a 2a 20 54 68 69 73 20 69 73 20 67 6f 6f 66 79  ** This is goofy
a200: 2e 20 20 42 75 74 20 74 6f 20 70 72 65 73 65 72  .  But to preser
a210: 76 65 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  ve backwards com
a220: 70 61 74 69 62 69 6c 69 74 79 20 77 65 20 63 6f  patibility we co
a230: 6e 74 69 6e 75 65 20 74 6f 0a 2a 2a 20 61 63 63  ntinue to.** acc
a240: 65 70 74 20 69 74 2e 20 20 54 68 69 73 20 72 6f  ept it.  This ro
a250: 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 6e  utine does the n
a260: 65 63 65 73 73 61 72 79 20 63 6f 6e 76 65 72 73  ecessary convers
a270: 69 6f 6e 2e 20 20 49 74 20 63 6f 6e 76 65 72 74  ion.  It convert
a280: 73 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73  s.** the express
a290: 69 6f 6e 20 67 69 76 65 6e 20 69 6e 20 69 74 73  ion given in its
a2a0: 20 61 72 67 75 6d 65 6e 74 20 66 72 6f 6d 20 61   argument from a
a2b0: 20 54 4b 5f 53 54 52 49 4e 47 20 69 6e 74 6f 20   TK_STRING into 
a2c0: 61 20 54 4b 5f 49 44 0a 2a 2a 20 69 66 20 74 68  a TK_ID.** if th
a2d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
a2e0: 6a 75 73 74 20 61 20 54 4b 5f 53 54 52 49 4e 47  just a TK_STRING
a2f0: 20 77 69 74 68 20 61 6e 20 6f 70 74 69 6f 6e 61   with an optiona
a300: 6c 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65  l COLLATE clause
a310: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 70 78 72  ..** If the epxr
a320: 65 73 73 69 6f 6e 20 69 73 20 61 6e 79 74 68 69  ession is anythi
a330: 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 54 4b  ng other than TK
a340: 5f 53 54 52 49 4e 47 2c 20 74 68 65 20 65 78 70  _STRING, the exp
a350: 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 75 6e  ression is.** un
a360: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74  changed..*/.stat
a370: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
a380: 74 72 69 6e 67 54 6f 49 64 28 45 78 70 72 20 2a  tringToId(Expr *
a390: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d  p){.  if( p->op=
a3a0: 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20  =TK_STRING ){.  
a3b0: 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b    p->op = TK_ID;
a3c0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
a3d0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26  op==TK_COLLATE &
a3e0: 26 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  & p->pLeft->op==
a3f0: 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20  TK_STRING ){.   
a400: 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20 3d 20   p->pLeft->op = 
a410: 54 4b 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TK_ID;.  }.}../*
a420: 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68  .** Designate th
a430: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f  e PRIMARY KEY fo
a440: 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c  r the table.  pL
a450: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
a460: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f   names .** of co
a470: 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  lumns that form 
a480: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
a490: 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55    If pList is NU
a4a0: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  LL, then the.** 
a4b0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
a4c0: 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ded column of th
a4d0: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70  e table is the p
a4e0: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a  rimary key..**.*
a4f0: 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61  * A table can ha
a500: 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70  ve at most one p
a510: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
a520: 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
a530: 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61  y has.** a prima
a540: 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73  ry key (and this
a550: 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   is the second p
a560: 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e  rimary key) then
a570: 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72   create an.** er
a580: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
a590: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
a5a0: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   on a single col
a5b0: 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79  umn whose dataty
a5c0: 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a  pe is INTEGER,.*
a5d0: 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74  * then we will t
a5e0: 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ry to use that c
a5f0: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77  olumn as the row
a600: 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61 62  id.  Set the Tab
a610: 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c  le.iPKey.** fiel
a620: 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75  d of the table u
a630: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
a640: 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65  n to be the inde
a650: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45  x of the.** INTE
a660: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
a670: 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69  column.  Table.i
a680: 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d  PKey is set to -
a690: 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  1 if there is.**
a6a0: 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d   no INTEGER PRIM
a6b0: 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49  ARY KEY..**.** I
a6c0: 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74  f the key is not
a6d0: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
a6e0: 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72  ARY KEY, then cr
a6f0: 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a  eate a unique.**
a700: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b   index for the k
a710: 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73  ey.  No index is
a720: 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54   created for INT
a730: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
a740: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
a750: 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  e3AddPrimaryKey(
a760: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a770: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
a780: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
a790: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f  rList *pList,  /
a7a0: 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20  * List of field 
a7b0: 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65  names to be inde
a7c0: 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
a7d0: 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68  rror,      /* Wh
a7e0: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20  at to do with a 
a7f0: 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c  uniqueness confl
a800: 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74  ict */.  int aut
a810: 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72  oInc,      /* Tr
a820: 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e  ue if the AUTOIN
a830: 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20  CREMENT keyword 
a840: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
a850: 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20  int sortOrder   
a860: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41    /* SQLITE_SO_A
a870: 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f  SC or SQLITE_SO_
a880: 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  DESC */.){.  Tab
a890: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
a8a0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
a8b0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30  Column *pCol = 0
a8c0: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d  ;.  int iCol = -
a8d0: 31 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65 72  1, i;.  int nTer
a8e0: 6d 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  m;.  if( pTab==0
a8f0: 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f   ) goto primary_
a900: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20  key_exit;.  if( 
a910: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
a920: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
a930: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
a940: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a950: 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c   .      "table \
a960: 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74  "%s\" has more t
a970: 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  han one primary 
a980: 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  key", pTab->zNam
a990: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69  e);.    goto pri
a9a0: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
a9b0: 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c   }.  pTab->tabFl
a9c0: 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 50 72 69  ags |= TF_HasPri
a9d0: 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66 28 20 70  maryKey;.  if( p
a9e0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  List==0 ){.    i
a9f0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  Col = pTab->nCol
aa00: 20 2d 20 31 3b 0a 20 20 20 20 70 43 6f 6c 20 3d   - 1;.    pCol =
aa10: 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
aa20: 6c 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f  l];.    pCol->co
aa30: 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
aa40: 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 6e  G_PRIMKEY;.    n
aa50: 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  Term = 1;.  }els
aa60: 65 7b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 70  e{.    nTerm = p
aa70: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
aa80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72   for(i=0; i<nTer
aa90: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  m; i++){.      E
aaa0: 78 70 72 20 2a 70 43 45 78 70 72 20 3d 20 73 71  xpr *pCExpr = sq
aab0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
aac0: 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  late(pList->a[i]
aad0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 61  .pExpr);.      a
aae0: 73 73 65 72 74 28 20 70 43 45 78 70 72 21 3d 30  ssert( pCExpr!=0
aaf0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
ab00: 33 53 74 72 69 6e 67 54 6f 49 64 28 70 43 45 78  3StringToId(pCEx
ab10: 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
ab20: 43 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  CExpr->op==TK_ID
ab30: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
ab40: 74 20 63 68 61 72 20 2a 7a 43 4e 61 6d 65 20 3d  t char *zCName =
ab50: 20 70 43 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65   pCExpr->u.zToke
ab60: 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  n;.        for(i
ab70: 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62  Col=0; iCol<pTab
ab80: 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  ->nCol; iCol++){
ab90: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
aba0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43  qlite3StrICmp(zC
abb0: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
abc0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  [iCol].zName)==0
abd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
abe0: 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
abf0: 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  ol[iCol];.      
ac00: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46        pCol->colF
ac10: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
ac20: 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20  PRIMKEY;.       
ac30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ac40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ac50: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
ac60: 20 20 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d 3d    }.  if( nTerm=
ac70: 3d 31 0a 20 20 20 26 26 20 70 43 6f 6c 0a 20 20  =1.   && pCol.  
ac80: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
ac90: 6d 70 28 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  mp(sqlite3Column
aca0: 54 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c 20 22  Type(pCol,""), "
acb0: 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20  INTEGER")==0.   
acc0: 26 26 20 73 6f 72 74 4f 72 64 65 72 21 3d 53 51  && sortOrder!=SQ
acd0: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 0a 20 20 29  LITE_SO_DESC.  )
ace0: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  {.    pTab->iPKe
acf0: 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54  y = iCol;.    pT
ad00: 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75  ab->keyConf = (u
ad10: 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61  8)onError;.    a
ad20: 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d  ssert( autoInc==
ad30: 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20  0 || autoInc==1 
ad40: 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  );.    pTab->tab
ad50: 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63  Flags |= autoInc
ad60: 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e  *TF_Autoincremen
ad70: 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  t;.    if( pList
ad80: 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f   ) pParse->iPkSo
ad90: 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 2d  rtOrder = pList-
ada0: 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[0].sortOrder;
adb0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74  .  }else if( aut
adc0: 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20  oInc ){.#ifndef 
add0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
ade0: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71  INCREMENT.    sq
adf0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ae00: 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45  arse, "AUTOINCRE
ae10: 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c  MENT is only all
ae20: 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20  owed on an ".   
ae30: 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49      "INTEGER PRI
ae40: 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64  MARY KEY");.#end
ae50: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
ae60: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
ae70: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
ae80: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
ae90: 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  or, 0,.         
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aeb0: 20 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20    0, sortOrder, 
aec0: 30 2c 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50  0, SQLITE_IDXTYP
aed0: 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20  E_PRIMARYKEY);. 
aee0: 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20     pList = 0;.  
aef0: 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  }..primary_key_e
af00: 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  xit:.  sqlite3Ex
af10: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
af20: 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b  rse->db, pList);
af30: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
af40: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43 48  .** Add a new CH
af50: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  ECK constraint t
af60: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
af70: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
af80: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
af90: 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65 63  d sqlite3AddChec
afa0: 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  kConstraint(.  P
afb0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
afc0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
afd0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
afe0: 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54 68  CheckExpr  /* Th
aff0: 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73 69  e check expressi
b000: 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  on */.){.#ifndef
b010: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
b020: 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  CK.  Table *pTab
b030: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
b040: 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  able;.  sqlite3 
b050: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
b060: 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26 20  ;.  if( pTab && 
b070: 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42  !IN_DECLARE_VTAB
b080: 0a 20 20 20 26 26 20 21 73 71 6c 69 74 65 33 42  .   && !sqlite3B
b090: 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 64  treeIsReadonly(d
b0a0: 62 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e 69 74 2e  b->aDb[db->init.
b0b0: 69 44 62 5d 2e 70 42 74 29 0a 20 20 29 7b 0a 20  iDb].pBt).  ){. 
b0c0: 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20     pTab->pCheck 
b0d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
b0e0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
b0f0: 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43  pTab->pCheck, pC
b100: 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20 20 69  heckExpr);.    i
b110: 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74  f( pParse->const
b120: 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20  raintName.n ){. 
b130: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b140: 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72  ListSetName(pPar
b150: 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  se, pTab->pCheck
b160: 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74  , &pParse->const
b170: 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20  raintName, 1);. 
b180: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e     }.  }else.#en
b190: 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  dif.  {.    sqli
b1a0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
b1b0: 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b  arse->db, pCheck
b1c0: 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Expr);.  }.}../*
b1d0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c  .** Set the coll
b1e0: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f  ation function o
b1f0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
b200: 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c 65  tly parsed table
b210: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68   column.** to th
b220: 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e  e CollSeq given.
b230: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b240: 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50  AddCollateType(P
b250: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
b260: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
b270: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
b280: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  i;.  char *zColl
b290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b2a0: 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20  * Dequoted name 
b2b0: 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  of collation seq
b2c0: 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74  uence */.  sqlit
b2d0: 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28  e3 *db;..  if( (
b2e0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
b2f0: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
b300: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
b310: 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  l-1;.  db = pPar
b320: 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20  se->db;.  zColl 
b330: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
b340: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65  mToken(db, pToke
b350: 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c  n);.  if( !zColl
b360: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
b370: 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  ( sqlite3LocateC
b380: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
b390: 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64  Coll) ){.    Ind
b3a0: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 73 71  ex *pIdx;.    sq
b3b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
b3c0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c  p->aCol[i].zColl
b3d0: 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69  );.    p->aCol[i
b3e0: 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b  ].zColl = zColl;
b3f0: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
b400: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c  e column is decl
b410: 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20  ared as "<name> 
b420: 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c  PRIMARY KEY COLL
b430: 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20  ATE <type>",.   
b440: 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65   ** then an inde
b450: 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  x may have been 
b460: 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20  created on this 
b470: 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68  column before th
b480: 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  e.    ** collati
b490: 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 65  on type was adde
b4a0: 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 20  d. Correct this 
b4b0: 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61 73  if it is the cas
b4c0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
b4d0: 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78  r(pIdx=p->pIndex
b4e0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
b4f0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
b500: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
b510: 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20  KeyCol==1 );.   
b520: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
b530: 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20  olumn[0]==i ){. 
b540: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
b550: 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c  oll[0] = p->aCol
b560: 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [i].zColl;.     
b570: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
b580: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
b590: 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
b5a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
b5b0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
b5c0: 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ns the collation
b5d0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61   sequence for da
b5e0: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74 65  tabase native te
b5f0: 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69  xt.** encoding i
b600: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
b610: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c   string zName, l
b620: 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a  ength nName..**.
b630: 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
b640: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ted collation se
b650: 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76  quence is not av
b660: 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20  ailable, or not 
b670: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20  available.** in 
b680: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 74  the database nat
b690: 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ive encoding, th
b6a0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
b6b0: 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ory is invoked t
b6c0: 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e  o.** request it.
b6d0: 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   If the collatio
b6e0: 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e  n factory does n
b6f0: 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20 61  ot supply such a
b700: 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e   sequence,.** an
b710: 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 69  d the sequence i
b720: 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61  s available in a
b730: 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f  nother text enco
b740: 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20  ding, then that 
b750: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69  is.** returned i
b760: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
b770: 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   no versions of 
b780: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
b790: 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63  llations sequenc
b7a0: 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c  e are available,
b7b0: 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65   or.** another e
b7c0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
b7d0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
b7e0: 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
b7f0: 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  ge written into.
b800: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a  ** pParse..**.**
b810: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
b820: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
b830: 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  d sqlite3FindCol
b840: 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72 6f  lSeq().  This ro
b850: 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73  utine.** invokes
b860: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
b870: 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e 61  actory if the na
b880: 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61  med collation ca
b890: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a  nnot be found.**
b8a0: 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20 61   and generates a
b8b0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  n error message.
b8c0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
b8d0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
b8e0: 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47 65  Seq(), sqlite3Ge
b8f0: 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f  tCollSeq().*/.Co
b900: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f  llSeq *sqlite3Lo
b910: 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73  cateCollSeq(Pars
b920: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
b930: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
b940: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b950: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20  Parse->db;.  u8 
b960: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
b970: 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64   u8 initbusy = d
b980: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20  b->init.busy;.  
b990: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
b9a0: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
b9b0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
b9c0: 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e  , enc, zName, in
b9d0: 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21  itbusy);.  if( !
b9e0: 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70 43  initbusy && (!pC
b9f0: 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78  oll || !pColl->x
ba00: 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c  Cmp) ){.    pCol
ba10: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f  l = sqlite3GetCo
ba20: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 65 6e  llSeq(pParse, en
ba30: 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29  c, pColl, zName)
ba40: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
ba50: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pColl;.}.../*.**
ba60: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
ba70: 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65  hat will increme
ba80: 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  nt the schema co
ba90: 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  okie..**.** The 
baa0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
bab0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
bac0: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
bad0: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
bae0: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
baf0: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
bb00: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
bb10: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
bb20: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
bb30: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
bb40: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
bb50: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
bb60: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
bb70: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
bb80: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
bb90: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
bba0: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
bbb0: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
bbc0: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
bbd0: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
bbe0: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
bbf0: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
bc00: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
bc10: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
bc20: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
bc30: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
bc40: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
bc50: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
bc60: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
bc70: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
bc80: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
bc90: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
bca0: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
bcb0: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
bcc0: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
bcd0: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
bce0: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
bcf0: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
bd00: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
bd10: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
bd20: 20 65 6e 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 49   enough..**.** I
bd30: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
bd40: 3a 20 52 2d 33 34 32 33 30 2d 35 36 30 34 39 20  : R-34230-56049 
bd50: 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74 69 63  SQLite automatic
bd60: 61 6c 6c 79 20 69 6e 63 72 65 6d 65 6e 74 73 0a  ally increments.
bd70: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65  ** the schema-ve
bd80: 72 73 69 6f 6e 20 77 68 65 6e 65 76 65 72 20 74  rsion whenever t
bd90: 68 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  he schema change
bda0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
bdb0: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50  e3ChangeCookie(P
bdc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
bdd0: 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65  t iDb){.  sqlite
bde0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
bdf0: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  db;.  Vdbe *v = 
be00: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
be10: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
be20: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
be30: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
be40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
be50: 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
be60: 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 53  ie, iDb, BTREE_S
be70: 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 0a  CHEMA_VERSION, .
be80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be90: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
bea0: 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
beb0: 5f 63 6f 6f 6b 69 65 2b 31 29 3b 0a 7d 0a 0a 2f  _cookie+1);.}../
bec0: 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65  *.** Measure the
bed0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
bee0: 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20  cters needed to 
bef0: 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  output the given
bf00: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20  .** identifier. 
bf10: 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   The number retu
bf20: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e  rned includes an
bf30: 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a  y quotes used.**
bf40: 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e   but does not in
bf50: 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74  clude the null t
bf60: 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  erminator..**.**
bf70: 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73   The estimate is
bf80: 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20   conservative.  
bf90: 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  It might be larg
bfa0: 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a  er that what is.
bfb0: 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64  ** really needed
bfc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bfd0: 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73  identLength(cons
bfe0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
bff0: 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20  t n;.  for(n=0; 
c000: 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20  *z; n++, z++){. 
c010: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29     if( *z=='"' )
c020: 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72  { n++; }.  }.  r
c030: 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a  eturn n + 2;.}..
c040: 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
c050: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
c060: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74  ointer to an out
c070: 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 65 20  put buffer. The 
c080: 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d  second .** param
c090: 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
c0a0: 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  r to an integer 
c0b0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
c0c0: 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77  e offset at.** w
c0d0: 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e  hich to write in
c0e0: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
c0f0: 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  ffer. This funct
c100: 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a  ion copies the.*
c110: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * nul-terminated
c120: 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20   string pointed 
c130: 74 6f 20 62 79 20 74 68 65 20 74 68 69 72 64 20  to by the third 
c140: 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e  parameter, zSign
c150: 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74  edIdent,.** to t
c160: 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 66 66  he specified off
c170: 73 65 74 20 69 6e 20 74 68 65 20 62 75 66 66 65  set in the buffe
c180: 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70  r and updates *p
c190: 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20  Idx to refer.** 
c1a0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
c1b0: 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  e after the last
c1c0: 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 62 65   byte written be
c1d0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
c1e0: 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74  ** .** If the st
c1f0: 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e  ring zSignedIden
c200: 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  t consists entir
c210: 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d  ely of alpha-num
c220: 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65  eric.** characte
c230: 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  rs, does not beg
c240: 69 6e 20 77 69 74 68 20 61 20 64 69 67 69 74 20  in with a digit 
c250: 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51  and is not an SQ
c260: 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68  L keyword,.** th
c270: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
c280: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
c290: 66 66 65 72 20 65 78 61 63 74 6c 79 20 61 73 20  ffer exactly as 
c2a0: 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65  it is. Otherwise
c2b0: 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65  ,.** it is quote
c2c0: 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71  d using double-q
c2d0: 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  uotes..*/.static
c2e0: 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63   void identPut(c
c2f0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64  har *z, int *pId
c300: 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64  x, char *zSigned
c310: 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e  Ident){.  unsign
c320: 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20  ed char *zIdent 
c330: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
c340: 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a  *)zSignedIdent;.
c350: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64    int i, j, need
c360: 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49  Quote;.  i = *pI
c370: 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  dx;..  for(j=0; 
c380: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
c390: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
c3a0: 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b  3Isalnum(zIdent[
c3b0: 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d  j]) && zIdent[j]
c3c0: 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20  !='_' ) break;. 
c3d0: 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d   }.  needQuote =
c3e0: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
c3f0: 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20  zIdent[0]).     
c400: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
c410: 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64  3KeywordCode(zId
c420: 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20  ent, j)!=TK_ID. 
c430: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 7a 49             || zI
c440: 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20  dent[j]!=0.     
c450: 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a         || j==0;.
c460: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
c470: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
c480: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
c490: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
c4a0: 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74   z[i++] = zIdent
c4b0: 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64  [j];.    if( zId
c4c0: 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b  ent[j]=='"' ) z[
c4d0: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a  i++] = '"';.  }.
c4e0: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
c4f0: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
c500: 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70    z[i] = 0;.  *p
c510: 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  Idx = i;.}../*.*
c520: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45  * Generate a CRE
c530: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
c540: 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20  ent appropriate 
c550: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
c560: 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20   table.  Memory 
c570: 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74  to hold the text
c580: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
c590: 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  t is obtained.**
c5a0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
c5b0: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
c5c0: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
c5d0: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
c5e0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
c5f0: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
c600: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
c610: 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c  le *p){.  int i,
c620: 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a   k, n;.  char *z
c630: 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53  Stmt;.  char *zS
c640: 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e  ep, *zSep2, *zEn
c650: 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  d;.  Column *pCo
c660: 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f  l;.  n = 0;.  fo
c670: 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c  r(pCol = p->aCol
c680: 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  , i=0; i<p->nCol
c690: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
c6a0: 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65      n += identLe
c6b0: 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ngth(pCol->zName
c6c0: 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b  ) + 5;.  }.  n +
c6d0: 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d  = identLength(p-
c6e0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e  >zName);.  if( n
c6f0: 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70  <50 ){ .    zSep
c700: 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32   = "";.    zSep2
c710: 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64   = ",";.    zEnd
c720: 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b   = ")";.  }else{
c730: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20  .    zSep = "\n 
c740: 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20   ";.    zSep2 = 
c750: 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e  ",\n  ";.    zEn
c760: 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20  d = "\n)";.  }. 
c770: 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e   n += 35 + 6*p->
c780: 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20  nCol;.  zStmt = 
c790: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
c7a0: 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20  aw(0, n);.  if( 
c7b0: 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  zStmt==0 ){.    
c7c0: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
c7d0: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
c7e0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
c7f0: 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74  _snprintf(n, zSt
c800: 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c  mt, "CREATE TABL
c810: 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69  E ");.  k = sqli
c820: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d  te3Strlen30(zStm
c830: 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a  t);.  identPut(z
c840: 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61  Stmt, &k, p->zNa
c850: 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b  me);.  zStmt[k++
c860: 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70  ] = '(';.  for(p
c870: 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  Col=p->aCol, i=0
c880: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
c890: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73  , pCol++){.    s
c8a0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c8b0: 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b   * const azType[
c8c0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ] = {.        /*
c8d0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
c8e0: 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20      */ "",.     
c8f0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
c900: 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20 54 45  _TEXT    */ " TE
c910: 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  XT",.        /* 
c920: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
c930: 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20  IC */ " NUM",.  
c940: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
c950: 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22  AFF_INTEGER */ "
c960: 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f   INT",.        /
c970: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  * SQLITE_AFF_REA
c980: 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a  L    */ " REAL".
c990: 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c      };.    int l
c9a0: 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  en;.    const ch
c9b0: 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20  ar *zType;..    
c9c0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
c9d0: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
c9e0: 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d   zSep);.    k +=
c9f0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
ca00: 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20  (&zStmt[k]);.   
ca10: 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20   zSep = zSep2;. 
ca20: 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d     identPut(zStm
ca30: 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  t, &k, pCol->zNa
ca40: 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  me);.    assert(
ca50: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
ca60: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
ca70: 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65  >= 0 );.    asse
ca80: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
ca90: 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  ty-SQLITE_AFF_BL
caa0: 4f 42 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61  OB < ArraySize(a
cab0: 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74 65  zType) );.    te
cac0: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
cad0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
cae0: 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 74  FF_BLOB );.    t
caf0: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
cb00: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
cb10: 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20  AFF_TEXT );.    
cb20: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
cb30: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
cb40: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a  _AFF_NUMERIC );.
cb50: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
cb60: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
cb70: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
cb80: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
cb90: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
cba0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
cbb0: 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54  L );.    .    zT
cbc0: 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f  ype = azType[pCo
cbd0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51  l->affinity - SQ
cbe0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b 0a  LITE_AFF_BLOB];.
cbf0: 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65      len = sqlite
cc00: 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29  3Strlen30(zType)
cc10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
cc20: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
cc30: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a 20  LITE_AFF_BLOB . 
cc40: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43             || pC
cc50: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71  ol->affinity==sq
cc60: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
cc70: 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a 20  e(zType, 0) );. 
cc80: 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74     memcpy(&zStmt
cc90: 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29  [k], zType, len)
cca0: 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a  ;.    k += len;.
ccb0: 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e      assert( k<=n
ccc0: 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
ccd0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20  3_snprintf(n-k, 
cce0: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c  &zStmt[k], "%s",
ccf0: 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e   zEnd);.  return
cd00: 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zStmt;.}../*.**
cd10: 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65 78   Resize an Index
cd20: 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20   object to hold 
cd30: 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e  N columns total.
cd40: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
cd50: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
cd60: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   and SQLITE_NOME
cd70: 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  M on an OOM erro
cd80: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
cd90: 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65   resizeIndexObje
cda0: 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ct(sqlite3 *db, 
cdb0: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74  Index *pIdx, int
cdc0: 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78   N){.  char *zEx
cdd0: 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  tra;.  int nByte
cde0: 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43  ;.  if( pIdx->nC
cdf0: 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72  olumn>=N ) retur
ce00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  n SQLITE_OK;.  a
ce10: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73 52  ssert( pIdx->isR
ce20: 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e  esized==0 );.  n
ce30: 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28 63  Byte = (sizeof(c
ce40: 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69  har*) + sizeof(i
ce50: 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45  16) + 1)*N;.  zE
ce60: 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44 62  xtra = sqlite3Db
ce70: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
ce80: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45 78  Byte);.  if( zEx
ce90: 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tra==0 ) return 
cea0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
ceb0: 54 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74  T;.  memcpy(zExt
cec0: 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  ra, pIdx->azColl
ced0: 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  , sizeof(char*)*
cee0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a  pIdx->nColumn);.
cef0: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d    pIdx->azColl =
cf00: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 7a   (const char**)z
cf10: 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20  Extra;.  zExtra 
cf20: 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  += sizeof(char*)
cf30: 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78  *N;.  memcpy(zEx
cf40: 74 72 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c  tra, pIdx->aiCol
cf50: 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36 29  umn, sizeof(i16)
cf60: 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b  *pIdx->nColumn);
cf70: 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  .  pIdx->aiColum
cf80: 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78 74 72 61  n = (i16*)zExtra
cf90: 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69  ;.  zExtra += si
cfa0: 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20 6d  zeof(i16)*N;.  m
cfb0: 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49  emcpy(zExtra, pI
cfc0: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20  dx->aSortOrder, 
cfd0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a  pIdx->nColumn);.
cfe0: 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64    pIdx->aSortOrd
cff0: 65 72 20 3d 20 28 75 38 2a 29 7a 45 78 74 72 61  er = (u8*)zExtra
d000: 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ;.  pIdx->nColum
d010: 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e 69  n = N;.  pIdx->i
d020: 73 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20 20  sResized = 1;.  
d030: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d040: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  ;.}../*.** Estim
d050: 61 74 65 20 74 68 65 20 74 6f 74 61 6c 20 72 6f  ate the total ro
d060: 77 20 77 69 64 74 68 20 66 6f 72 20 61 20 74 61  w width for a ta
d070: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
d080: 6f 69 64 20 65 73 74 69 6d 61 74 65 54 61 62 6c  oid estimateTabl
d090: 65 57 69 64 74 68 28 54 61 62 6c 65 20 2a 70 54  eWidth(Table *pT
d0a0: 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ab){.  unsigned 
d0b0: 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63 6f  wTable = 0;.  co
d0c0: 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62  nst Column *pTab
d0d0: 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Col;.  int i;.  
d0e0: 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c  for(i=pTab->nCol
d0f0: 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e  , pTabCol=pTab->
d100: 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  aCol; i>0; i--, 
d110: 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  pTabCol++){.    
d120: 77 54 61 62 6c 65 20 2b 3d 20 70 54 61 62 43 6f  wTable += pTabCo
d130: 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20  l->szEst;.  }.  
d140: 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c  if( pTab->iPKey<
d150: 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 20  0 ) wTable++;.  
d160: 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d  pTab->szTabRow =
d170: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77   sqlite3LogEst(w
d180: 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a  Table*4);.}../*.
d190: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
d1a0: 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20  average size of 
d1b0: 61 20 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e 64  a row for an ind
d1c0: 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
d1d0: 69 64 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78  id estimateIndex
d1e0: 57 69 64 74 68 28 49 6e 64 65 78 20 2a 70 49 64  Width(Index *pId
d1f0: 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77  x){.  unsigned w
d200: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e 74  Index = 0;.  int
d210: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75   i;.  const Colu
d220: 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d  mn *aCol = pIdx-
d230: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20  >pTable->aCol;. 
d240: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
d250: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
d260: 0a 20 20 20 20 69 31 36 20 78 20 3d 20 70 49 64  .    i16 x = pId
d270: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  x->aiColumn[i];.
d280: 20 20 20 20 61 73 73 65 72 74 28 20 78 3c 70 49      assert( x<pI
d290: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  dx->pTable->nCol
d2a0: 20 29 3b 0a 20 20 20 20 77 49 6e 64 65 78 20 2b   );.    wIndex +
d2b0: 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f 6c  = x<0 ? 1 : aCol
d2c0: 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  [pIdx->aiColumn[
d2d0: 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20  i]].szEst;.  }. 
d2e0: 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 20   pIdx->szIdxRow 
d2f0: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
d300: 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a  wIndex*4);.}../*
d310: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
d320: 76 61 6c 75 65 20 78 20 69 73 20 66 6f 75 6e 64  value x is found
d330: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69 72 73   any of the firs
d340: 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f  t nCol entries o
d350: 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61  f aiCol[].*/.sta
d360: 74 69 63 20 69 6e 74 20 68 61 73 43 6f 6c 75 6d  tic int hasColum
d370: 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a 61 69 43  n(const i16 *aiC
d380: 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e  ol, int nCol, in
d390: 74 20 78 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e  t x){.  while( n
d3a0: 43 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28 20  Col-- > 0 ) if( 
d3b0: 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 20  x==*(aiCol++) ) 
d3c0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
d3d0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
d3e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
d3f0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 70   at the end of p
d400: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
d410: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
d420: 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 20 57 49  that.** has a WI
d430: 54 48 4f 55 54 20 52 4f 57 49 44 20 63 6c 61 75  THOUT ROWID clau
d440: 73 65 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20  se.  The job of 
d450: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
d460: 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f 74 68 0a  to convert both.
d470: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  ** internal sche
d480: 6d 61 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ma data structur
d490: 65 73 20 61 6e 64 20 74 68 65 20 67 65 6e 65 72  es and the gener
d4a0: 61 74 65 64 20 56 44 42 45 20 63 6f 64 65 20 73  ated VDBE code s
d4b0: 6f 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 61  o that they.** a
d4c0: 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  re appropriate f
d4d0: 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  or a WITHOUT ROW
d4e0: 49 44 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64  ID table instead
d4f0: 20 6f 66 20 61 20 72 6f 77 69 64 20 74 61 62 6c   of a rowid tabl
d500: 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e  e..** Changes in
d510: 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  clude:.**.**    
d520: 20 28 31 29 20 20 53 65 74 20 61 6c 6c 20 63 6f   (1)  Set all co
d530: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49  lumns of the PRI
d540: 4d 41 52 59 20 4b 45 59 20 73 63 68 65 6d 61 20  MARY KEY schema 
d550: 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 4e 4f 54  object to be NOT
d560: 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20 20 28 32   NULL..**     (2
d570: 29 20 20 43 6f 6e 76 65 72 74 20 74 68 65 20 4f  )  Convert the O
d580: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 69 6e  P_CreateTable in
d590: 74 6f 20 61 6e 20 4f 50 5f 43 72 65 61 74 65 49  to an OP_CreateI
d5a0: 6e 64 65 78 2e 20 20 54 68 65 72 65 20 69 73 0a  ndex.  There is.
d5b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 6e 6f 20 72  **          no r
d5c0: 6f 77 69 64 20 62 74 72 65 65 20 66 6f 72 20 61  owid btree for a
d5d0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 20   WITHOUT ROWID. 
d5e0: 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 63 61   Instead, the ca
d5f0: 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 20 20 20 20 20  nonical.**      
d600: 20 20 20 20 64 61 74 61 20 73 74 6f 72 61 67 65      data storage
d610: 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69   is a covering i
d620: 6e 64 65 78 20 62 74 72 65 65 2e 0a 2a 2a 20 20  ndex btree..**  
d630: 20 20 20 28 33 29 20 20 42 79 70 61 73 73 20 74     (3)  Bypass t
d640: 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74  he creation of t
d650: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
d660: 20 74 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20   table entry.** 
d670: 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 68 65           for the
d680: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 73 20   PRIMARY KEY as 
d690: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
d6a0: 69 6e 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a 20  index is now.** 
d6b0: 20 20 20 20 20 20 20 20 20 69 64 65 6e 74 69 66           identif
d6c0: 69 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74  ied by the sqlit
d6d0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65  e_master table e
d6e0: 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c  ntry of the tabl
d6f0: 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20 20  e itself..**    
d700: 20 28 34 29 20 20 53 65 74 20 74 68 65 20 49 6e   (4)  Set the In
d710: 64 65 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65 20  dex.tnum of the 
d720: 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65  PRIMARY KEY Inde
d730: 78 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a  x object in the.
d740: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 68 65  **          sche
d750: 6d 61 20 74 6f 20 74 68 65 20 72 6f 6f 74 70 61  ma to the rootpa
d760: 67 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ge from the main
d770: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 28   table..**     (
d780: 35 29 20 20 41 64 64 20 61 6c 6c 20 74 61 62 6c  5)  Add all tabl
d790: 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65  e columns to the
d7a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64   PRIMARY KEY Ind
d7b0: 65 78 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20  ex object.**    
d7c0: 20 20 20 20 20 20 73 6f 20 74 68 61 74 20 74 68        so that th
d7d0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
d7e0: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
d7f0: 78 2e 20 20 54 68 65 20 73 75 72 70 6c 75 73 0a  x.  The surplus.
d800: 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75  **          colu
d810: 6d 6e 73 20 61 72 65 20 70 61 72 74 20 6f 66 20  mns are part of 
d820: 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64 20  KeyInfo.nXField 
d830: 61 6e 64 20 61 72 65 20 6e 6f 74 20 75 73 65 64  and are not used
d840: 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20   for.**         
d850: 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b   sorting or look
d860: 75 70 20 6f 72 20 75 6e 69 71 75 65 6e 65 73 73  up or uniqueness
d870: 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20 20   checks..**     
d880: 28 36 29 20 20 52 65 70 6c 61 63 65 20 74 68 65  (6)  Replace the
d890: 20 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20 61   rowid tail on a
d8a0: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
d8b0: 20 67 65 6e 65 72 61 74 65 64 20 55 4e 49 51 55   generated UNIQU
d8c0: 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e  E.**          in
d8d0: 64 69 63 65 73 20 77 69 74 68 20 74 68 65 20 50  dices with the P
d8e0: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
d8f0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 76 69  ns..**.** For vi
d900: 72 74 75 61 6c 20 74 61 62 6c 65 73 2c 20 6f 6e  rtual tables, on
d910: 6c 79 20 28 31 29 20 69 73 20 70 65 72 66 6f 72  ly (1) is perfor
d920: 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  med..*/.static v
d930: 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f 57 69 74  oid convertToWit
d940: 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 50  houtRowidTable(P
d950: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
d960: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e  ble *pTab){.  In
d970: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e 64  dex *pIdx;.  Ind
d980: 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20 6e  ex *pPk;.  int n
d990: 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  Pk;.  int i, j;.
d9a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d9b0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
d9c0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
d9d0: 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 4d 61 72  pVdbe;..  /* Mar
d9e0: 6b 20 65 76 65 72 79 20 50 52 49 4d 41 52 59 20  k every PRIMARY 
d9f0: 4b 45 59 20 63 6f 6c 75 6d 6e 20 61 73 20 4e 4f  KEY column as NO
da00: 54 20 4e 55 4c 4c 20 28 65 78 63 65 70 74 20 66  T NULL (except f
da10: 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  or imposter tabl
da20: 65 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es).  */.  if( !
da30: 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65  db->init.imposte
da40: 72 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 6f  rTable ){.    fo
da50: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
da60: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
da70: 20 69 66 28 20 28 70 54 61 62 2d 3e 61 43 6f 6c   if( (pTab->aCol
da80: 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43  [i].colFlags & C
da90: 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21  OLFLAG_PRIMKEY)!
daa0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  =0 ){.        pT
dab0: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e  ab->aCol[i].notN
dac0: 75 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ull = OE_Abort;.
dad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
dae0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 6d 61  }..  /* The rema
daf0: 69 6e 69 6e 67 20 74 72 61 6e 73 66 6f 72 6d 61  ining transforma
db00: 74 69 6f 6e 73 20 6f 6e 6c 79 20 61 70 70 6c 79  tions only apply
db10: 20 74 6f 20 62 2d 74 72 65 65 20 74 61 62 6c 65   to b-tree table
db20: 73 2c 20 6e 6f 74 20 74 6f 0a 20 20 2a 2a 20 76  s, not to.  ** v
db30: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f  irtual tables */
db40: 0a 20 20 69 66 28 20 49 4e 5f 44 45 43 4c 41 52  .  if( IN_DECLAR
db50: 45 5f 56 54 41 42 20 29 20 72 65 74 75 72 6e 3b  E_VTAB ) return;
db60: 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74  ..  /* Convert t
db70: 68 65 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  he OP_CreateTabl
db80: 65 20 6f 70 63 6f 64 65 20 74 68 61 74 20 77 6f  e opcode that wo
db90: 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 63 72 65  uld normally cre
dba0: 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6f  ate the.  ** roo
dbb0: 74 2d 70 61 67 65 20 66 6f 72 20 74 68 65 20 74  t-page for the t
dbc0: 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f  able into an OP_
dbd0: 43 72 65 61 74 65 49 6e 64 65 78 20 6f 70 63 6f  CreateIndex opco
dbe0: 64 65 2e 20 20 54 68 65 20 69 6e 64 65 78 0a 20  de.  The index. 
dbf0: 20 2a 2a 20 63 72 65 61 74 65 64 20 77 69 6c 6c   ** created will
dc00: 20 62 65 63 6f 6d 65 20 74 68 65 20 50 52 49 4d   become the PRIM
dc10: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 0a 20  ARY KEY index.. 
dc20: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
dc30: 2d 3e 61 64 64 72 43 72 54 61 62 20 29 7b 0a 20  ->addrCrTab ){. 
dc40: 20 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a     assert( v );.
dc50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
dc60: 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 70  hangeOpcode(v, p
dc70: 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62  Parse->addrCrTab
dc80: 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  , OP_CreateIndex
dc90: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  );.  }..  /* Loc
dca0: 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ate the PRIMARY 
dcb0: 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20  KEY index.  Or, 
dcc0: 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 77 61  if this table wa
dcd0: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  s originally.  *
dce0: 2a 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  * an INTEGER PRI
dcf0: 4d 41 52 59 20 4b 45 59 20 74 61 62 6c 65 2c 20  MARY KEY table, 
dd00: 63 72 65 61 74 65 20 61 20 6e 65 77 20 50 52 49  create a new PRI
dd10: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20  MARY KEY index. 
dd20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
dd30: 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20  ->iPKey>=0 ){.  
dd40: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
dd50: 74 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 69 70 6b  t;.    Token ipk
dd60: 54 6f 6b 65 6e 3b 0a 20 20 20 20 73 71 6c 69 74  Token;.    sqlit
dd70: 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 69 70 6b  e3TokenInit(&ipk
dd80: 54 6f 6b 65 6e 2c 20 70 54 61 62 2d 3e 61 43 6f  Token, pTab->aCo
dd90: 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a  l[pTab->iPKey].z
dda0: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74  Name);.    pList
ddb0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
ddc0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
ddd0: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
dde0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
ddf0: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49  prAlloc(db, TK_I
de00: 44 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c 20 30 29  D, &ipkToken, 0)
de10: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
de20: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
de30: 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f    pList->a[0].so
de40: 72 74 4f 72 64 65 72 20 3d 20 70 50 61 72 73 65  rtOrder = pParse
de50: 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a  ->iPkSortOrder;.
de60: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
de70: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70  se->pNewTable==p
de80: 54 61 62 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  Tab );.    sqlit
de90: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  e3CreateIndex(pP
dea0: 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70  arse, 0, 0, 0, p
deb0: 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43  List, pTab->keyC
dec0: 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  onf, 0, 0, 0, 0,
ded0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dee0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
def0: 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45  DXTYPE_PRIMARYKE
df00: 59 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  Y);.    if( db->
df10: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
df20: 65 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b 20 3d  eturn;.    pPk =
df30: 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
df40: 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
df50: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
df60: 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   -1;.  }else{.  
df70: 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50    pPk = sqlite3P
df80: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
df90: 54 61 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 79  Tab);..    /* By
dfa0: 70 61 73 73 20 74 68 65 20 63 72 65 61 74 69 6f  pass the creatio
dfb0: 6e 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  n of the PRIMARY
dfc0: 20 4b 45 59 20 62 74 72 65 65 20 61 6e 64 20 74   KEY btree and t
dfd0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
dfe0: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 65 6e  .    ** table en
dff0: 74 72 79 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c  try. This is onl
e000: 79 20 72 65 71 75 69 72 65 64 20 69 66 20 63 75  y required if cu
e010: 72 72 65 6e 74 6c 79 20 67 65 6e 65 72 61 74 69  rrently generati
e020: 6e 67 20 56 44 42 45 0a 20 20 20 20 2a 2a 20 63  ng VDBE.    ** c
e030: 6f 64 65 20 66 6f 72 20 61 20 43 52 45 41 54 45  ode for a CREATE
e040: 20 54 41 42 4c 45 20 28 6e 6f 74 20 77 68 65 6e   TABLE (not when
e050: 20 70 61 72 73 69 6e 67 20 6f 6e 65 20 61 73 20   parsing one as 
e060: 70 61 72 74 20 6f 66 20 72 65 61 64 69 6e 67 0a  part of reading.
e070: 20 20 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73      ** a databas
e080: 65 20 73 63 68 65 6d 61 29 2e 20 20 2a 2f 0a 20  e schema).  */. 
e090: 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20     if( v ){.    
e0a0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e    assert( db->in
e0b0: 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20  it.busy==0 );.  
e0c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
e0d0: 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 70  hangeOpcode(v, p
e0e0: 50 6b 2d 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74  Pk->tnum, OP_Got
e0f0: 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  o);.    }..    /
e100: 2a 0a 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20  *.    ** Remove 
e110: 61 6c 6c 20 72 65 64 75 6e 64 61 6e 74 20 63 6f  all redundant co
e120: 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 50  lumns from the P
e130: 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72  RIMARY KEY.  For
e140: 20 65 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67 65   example, change
e150: 0a 20 20 20 20 2a 2a 20 22 50 52 49 4d 41 52 59  .    ** "PRIMARY
e160: 20 4b 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c 62   KEY(a,b,a,b,c,b
e170: 2c 63 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73 74  ,c,d)" into just
e180: 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c   "PRIMARY KEY(a,
e190: 62 2c 63 2c 64 29 22 2e 20 20 4c 61 74 65 72 0a  b,c,d)".  Later.
e1a0: 20 20 20 20 2a 2a 20 63 6f 64 65 20 61 73 73 75      ** code assu
e1b0: 6d 65 73 20 74 68 65 20 50 52 49 4d 41 52 59 20  mes the PRIMARY 
e1c0: 4b 45 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  KEY contains no 
e1d0: 72 65 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e 73  repeated columns
e1e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
e1f0: 28 69 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e  (i=j=1; i<pPk->n
e200: 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  KeyCol; i++){.  
e210: 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d      if( hasColum
e220: 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  n(pPk->aiColumn,
e230: 20 6a 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d   j, pPk->aiColum
e240: 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  n[i]) ){.       
e250: 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b   pPk->nColumn--;
e260: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e270: 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c        pPk->aiCol
e280: 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e  umn[j++] = pPk->
e290: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
e2a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
e2b0: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b  Pk->nKeyCol = j;
e2c0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
e2d0: 50 6b 21 3d 30 20 29 3b 0a 20 20 70 50 6b 2d 3e  Pk!=0 );.  pPk->
e2e0: 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a  isCovering = 1;.
e2f0: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
e300: 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29 20  imposterTable ) 
e310: 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  pPk->uniqNotNull
e320: 20 3d 20 31 3b 0a 20 20 6e 50 6b 20 3d 20 70 50   = 1;.  nPk = pP
e330: 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f  k->nKeyCol;..  /
e340: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
e350: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
e360: 45 59 20 69 73 20 74 68 65 20 74 61 62 6c 65 20  EY is the table 
e370: 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20 70  root page */.  p
e380: 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62 2d  Pk->tnum = pTab-
e390: 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64  >tnum;..  /* Upd
e3a0: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
e3b0: 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
e3c0: 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45 20 69   of all UNIQUE i
e3d0: 6e 64 69 63 65 73 20 62 79 20 63 6f 6e 76 65 72  ndices by conver
e3e0: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 69  ting.  ** the fi
e3f0: 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e  nal rowid column
e400: 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72   into one or mor
e410: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
e420: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20   PRIMARY KEY..  
e430: 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54  */.  for(pIdx=pT
e440: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
e450: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
e460: 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  xt){.    int n;.
e470: 20 20 20 20 69 66 28 20 49 73 50 72 69 6d 61 72      if( IsPrimar
e480: 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20  yKeyIndex(pIdx) 
e490: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
e4a0: 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b  for(i=n=0; i<nPk
e4b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
e4c0: 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64  ( !hasColumn(pId
e4d0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64  x->aiColumn, pId
e4e0: 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d  x->nKeyCol, pPk-
e4f0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20  >aiColumn[i]) ) 
e500: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n++;.    }.    i
e510: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
e520: 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69   /* This index i
e530: 73 20 61 20 73 75 70 65 72 73 65 74 20 6f 66 20  s a superset of 
e540: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
e550: 2a 2f 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 6e  */.      pIdx->n
e560: 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e  Column = pIdx->n
e570: 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f  KeyCol;.      co
e580: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
e590: 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65    if( resizeInde
e5a0: 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 49 64 78  xObject(db, pIdx
e5b0: 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b  , pIdx->nKeyCol+
e5c0: 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  n) ) return;.   
e5d0: 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64 78   for(i=0, j=pIdx
e5e0: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b  ->nKeyCol; i<nPk
e5f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
e600: 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64  ( !hasColumn(pId
e610: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64  x->aiColumn, pId
e620: 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d  x->nKeyCol, pPk-
e630: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b  >aiColumn[i]) ){
e640: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
e650: 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b  iColumn[j] = pPk
e660: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
e670: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
e680: 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a  oll[j] = pPk->az
e690: 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Coll[i];.       
e6a0: 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   j++;.      }.  
e6b0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
e6c0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70  pIdx->nColumn>=p
e6d0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29  Idx->nKeyCol+n )
e6e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
e6f0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  dx->nColumn>=j )
e700: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
e710: 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  all table column
e720: 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59  s to the PRIMARY
e730: 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f 0a   KEY index.  */.
e740: 20 20 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d 3e    if( nPk<pTab->
e750: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  nCol ){.    if( 
e760: 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63  resizeIndexObjec
e770: 74 28 64 62 2c 20 70 50 6b 2c 20 70 54 61 62 2d  t(db, pPk, pTab-
e780: 3e 6e 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 3b  >nCol) ) return;
e790: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d  .    for(i=0, j=
e7a0: 6e 50 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  nPk; i<pTab->nCo
e7b0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
e7c0: 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 50  f( !hasColumn(pP
e7d0: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20  k->aiColumn, j, 
e7e0: 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  i) ){.        as
e7f0: 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f  sert( j<pPk->nCo
e800: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
e810: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  pPk->aiColumn[j]
e820: 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 50   = i;.        pP
e830: 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 73  k->azColl[j] = s
e840: 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b  qlite3StrBINARY;
e850: 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  .        j++;.  
e860: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e870: 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e 43 6f  assert( pPk->nCo
e880: 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20 20 61  lumn==j );.    a
e890: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
e8a0: 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  l==j );.  }else{
e8b0: 0a 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d  .    pPk->nColum
e8c0: 6e 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a  n = pTab->nCol;.
e8d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
e8e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
e8f0: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
e900: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
e910: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
e920: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
e930: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
e940: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
e950: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
e960: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
e970: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
e980: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
e990: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
e9a0: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
e9b0: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
e9c0: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
e9d0: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
e9e0: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
e9f0: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
ea00: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
ea10: 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20   unless.** this 
ea20: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
ea30: 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74  able or db->init
ea40: 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20  .busy==1.  When 
ea50: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
ea60: 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20  .** it means we 
ea70: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
ea80: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
ea90: 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a  ble because we j
eaa0: 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  ust.** connected
eab0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
eac0: 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
ead0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
eae0: 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e  ble has.** recen
eaf0: 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20  tly changed, so 
eb00: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
eb10: 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  is table already
eb20: 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68   exists in.** th
eb30: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
eb40: 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f  table.  We do no
eb50: 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65  t want to create
eb60: 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a   it again..**.**
eb70: 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20   If the pSelect 
eb80: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
eb90: 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74  NULL, it means t
eba0: 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
ebb0: 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74  .** was called t
ebc0: 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65  o create a table
ebd0: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
ebe0: 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41  a .** "CREATE TA
ebf0: 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  BLE ... AS SELEC
ec00: 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74  T ..." statement
ec10: 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  .  The column na
ec20: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  mes of.** the ne
ec30: 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74  w table will mat
ec40: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ch the result se
ec50: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  t of the SELECT.
ec60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ec70: 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73  EndTable(.  Pars
ec80: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
ec90: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
eca0: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
ecb0: 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20  *pCons,         
ecc0: 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b    /* The ',' tok
ecd0: 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  en after the las
ece0: 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a  t column defn. *
ecf0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  /.  Token *pEnd,
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ed10: 68 65 20 27 29 27 20 62 65 66 6f 72 65 20 6f 70  he ')' before op
ed20: 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 43 52 45  tions in the CRE
ed30: 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75  ATE TABLE */.  u
ed40: 38 20 74 61 62 4f 70 74 73 2c 20 20 20 20 20 20  8 tabOpts,      
ed50: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
ed60: 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20 55  table options. U
ed70: 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20 53  sually 0. */.  S
ed80: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20  elect *pSelect  
ed90: 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
eda0: 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20   from a "CREATE 
edb0: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a  ... AS SELECT" *
edc0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
edd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ede0: 20 2f 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c   /* The new tabl
edf0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
ee00: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
ee10: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
ee20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
ee30: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
ee40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
ee50: 74 61 62 61 73 65 20 69 6e 20 77 68 69 63 68 20  tabase in which 
ee60: 74 68 65 20 74 61 62 6c 65 20 6c 69 76 65 73 20  the table lives 
ee70: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
ee80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
ee90: 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64  * An implied ind
eea0: 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ex of the table 
eeb0: 2a 2f 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d  */..  if( pEnd==
eec0: 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 20  0 && pSelect==0 
eed0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
eee0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 64 62   }.  assert( !db
eef0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
ef00: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
ef10: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
ef20: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
ef30: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
ef40: 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53  init.busy || !pS
ef50: 65 6c 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  elect );..  /* I
ef60: 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
ef70: 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e  usy is 1 it mean
ef80: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
ef90: 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
efa0: 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
efb0: 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65  ster" or "sqlite
efc0: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61  _temp_master" ta
efd0: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
efe0: 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20  .  ** So do not 
eff0: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73  write to the dis
f000: 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  k again.  Extrac
f010: 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
f020: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
f030: 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
f040: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  he db->init.newT
f050: 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65  num field.  (The
f060: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
f070: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  * should have be
f080: 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20  en put there by 
f090: 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62  the sqliteOpenCb
f0a0: 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2a 0a   routine.).  **.
f0b0: 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74    ** If the root
f0c0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
f0d0: 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  1, that means th
f0e0: 69 73 20 69 73 20 74 68 65 20 73 71 6c 69 74 65  is is the sqlite
f0f0: 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62  _master.  ** tab
f100: 6c 65 20 69 74 73 65 6c 66 2e 20 20 53 6f 20 6d  le itself.  So m
f110: 61 72 6b 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79  ark it read-only
f120: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
f130: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
f140: 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e    p->tnum = db->
f150: 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20  init.newTnum;.  
f160: 20 20 69 66 28 20 70 2d 3e 74 6e 75 6d 3d 3d 31    if( p->tnum==1
f170: 20 29 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c   ) p->tabFlags |
f180: 3d 20 54 46 5f 52 65 61 64 6f 6e 6c 79 3b 0a 20  = TF_Readonly;. 
f190: 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c   }..  /* Special
f1a0: 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
f1b0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 54 61  WITHOUT ROWID Ta
f1c0: 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 74 61  bles */.  if( ta
f1d0: 62 4f 70 74 73 20 26 20 54 46 5f 57 69 74 68 6f  bOpts & TF_Witho
f1e0: 75 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69  utRowid ){.    i
f1f0: 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20  f( (p->tabFlags 
f200: 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
f210: 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  nt) ){.      sql
f220: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
f230: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  rse,.          "
f240: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6e 6f  AUTOINCREMENT no
f250: 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 57 49 54  t allowed on WIT
f260: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
f270: 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  s");.      retur
f280: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
f290: 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20   (p->tabFlags & 
f2a0: 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79  TF_HasPrimaryKey
f2b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
f2c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
f2d0: 61 72 73 65 2c 20 22 50 52 49 4d 41 52 59 20 4b  arse, "PRIMARY K
f2e0: 45 59 20 6d 69 73 73 69 6e 67 20 6f 6e 20 74 61  EY missing on ta
f2f0: 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d  ble %s", p->zNam
f300: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
f310: 20 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67 73       p->tabFlags
f320: 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75 74 52 6f   |= TF_WithoutRo
f330: 77 69 64 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62  wid | TF_NoVisib
f340: 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 63  leRowid;.      c
f350: 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52  onvertToWithoutR
f360: 6f 77 69 64 54 61 62 6c 65 28 70 50 61 72 73 65  owidTable(pParse
f370: 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , p);.    }.  }.
f380: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
f390: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
f3a0: 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  , p->pSchema);..
f3b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f3c0: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52  MIT_CHECK.  /* R
f3d0: 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
f3e0: 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  all CHECK constr
f3f0: 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73  aint expressions
f400: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
f410: 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 73 71  pCheck ){.    sq
f420: 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66  lite3ResolveSelf
f430: 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65  Reference(pParse
f440: 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c  , p, NC_IsCheck,
f450: 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a   0, p->pCheck);.
f460: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
f470: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f480: 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20  IT_CHECK) */..  
f490: 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  /* Estimate the 
f4a0: 61 76 65 72 61 67 65 20 72 6f 77 20 73 69 7a 65  average row size
f4b0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61   for the table a
f4c0: 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69  nd for all impli
f4d0: 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  ed indices */.  
f4e0: 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64  estimateTableWid
f4f0: 74 68 28 70 29 3b 0a 20 20 66 6f 72 28 70 49 64  th(p);.  for(pId
f500: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
f510: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
f520: 65 78 74 29 7b 0a 20 20 20 20 65 73 74 69 6d 61  ext){.    estima
f530: 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49 64  teIndexWidth(pId
f540: 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  x);.  }..  /* If
f550: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   not initializin
f560: 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  g, then create a
f570: 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20   record for the 
f580: 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69  new table.  ** i
f590: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  n the SQLITE_MAS
f5a0: 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65  TER table of the
f5b0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a   database..  **.
f5c0: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
f5d0: 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c  a TEMPORARY tabl
f5e0: 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74  e, write the ent
f5f0: 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69  ry into the auxi
f600: 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20  liary.  ** file 
f610: 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20  instead of into 
f620: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
f630: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
f640: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
f650: 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  y ){.    int n;.
f660: 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
f670: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20   char *zType;   
f680: 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74   /* "view" or "t
f690: 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61  able" */.    cha
f6a0: 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20  r *zType2;   /* 
f6b0: 22 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45  "VIEW" or "TABLE
f6c0: 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  " */.    char *z
f6d0: 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74  Stmt;    /* Text
f6e0: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
f6f0: 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56  ABLE or CREATE V
f700: 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  IEW statement */
f710: 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
f720: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
f730: 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
f740: 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  v==0) ) return;.
f750: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f760: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
f770: 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  se, 0);..    /* 
f780: 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69  .    ** Initiali
f790: 7a 65 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65  ze zType for the
f7a0: 20 6e 65 77 20 76 69 65 77 20 6f 72 20 74 61 62   new view or tab
f7b0: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
f7c0: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  f( p->pSelect==0
f7d0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72   ){.      /* A r
f7e0: 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a  egular table */.
f7f0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74        zType = "t
f800: 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79  able";.      zTy
f810: 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23  pe2 = "TABLE";.#
f820: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f830: 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73  IT_VIEW.    }els
f840: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69  e{.      /* A vi
f850: 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70  ew */.      zTyp
f860: 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20  e = "view";.    
f870: 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57    zType2 = "VIEW
f880: 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  ";.#endif.    }.
f890: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
f8a0: 69 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  is a CREATE TABL
f8b0: 45 20 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e  E xx AS SELECT .
f8c0: 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65 20  .., execute the 
f8d0: 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74  SELECT.    ** st
f8e0: 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c  atement to popul
f8f0: 61 74 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c  ate the new tabl
f900: 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65  e. The root-page
f910: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a   number for the.
f920: 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65      ** new table
f930: 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72 20   is in register 
f940: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e  pParse->regRoot.
f950: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
f960: 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68  nce the SELECT h
f970: 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79  as been coded by
f980: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
f990: 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20  , it is in a.   
f9a0: 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61   ** suitable sta
f9b0: 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  te to query for 
f9c0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
f9d0: 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65   and types to be
f9e0: 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20   used.    ** by 
f9f0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20  the new table.. 
fa00: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73     **.    ** A s
fa10: 68 61 72 65 64 2d 63 61 63 68 65 20 77 72 69 74  hared-cache writ
fa20: 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  e-lock is not re
fa30: 71 75 69 72 65 64 20 74 6f 20 77 72 69 74 65 20  quired to write 
fa40: 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  to the new table
fa50: 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63  ,.    ** as a sc
fa60: 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68  hema-lock must h
fa70: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
fa80: 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65   obtained to cre
fa90: 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20  ate it. Since.  
faa0: 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f    ** a schema-lo
fab0: 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20  ck excludes all 
fac0: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 75  other database u
fad0: 73 65 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d  sers, the write-
fae0: 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a  lock would.    *
faf0: 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a  * be redundant..
fb00: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
fb10: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
fb20: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
fb30: 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68 65      /* Where the
fb40: 20 53 45 4c 45 43 54 20 73 68 6f 75 6c 64 20 73   SELECT should s
fb50: 74 6f 72 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a  tore results */.
fb60: 20 20 20 20 20 20 69 6e 74 20 72 65 67 59 69 65        int regYie
fb70: 6c 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67  ld;       /* Reg
fb80: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f  ister holding co
fb90: 2d 72 6f 75 74 69 6e 65 20 65 6e 74 72 79 2d 70  -routine entry-p
fba0: 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  oint */.      in
fbb0: 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20  t addrTop;      
fbc0: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
fbd0: 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  co-routine */.  
fbe0: 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 3b 20      int regRec; 
fbf0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 63          /* A rec
fc00: 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ord to be insert
fc10: 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 74 61   into the new ta
fc20: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ble */.      int
fc30: 20 72 65 67 52 6f 77 69 64 3b 20 20 20 20 20 20   regRowid;      
fc40: 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20 74 68 65   /* Rowid of the
fc50: 20 6e 65 78 74 20 72 6f 77 20 74 6f 20 69 6e 73   next row to ins
fc60: 65 72 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ert */.      int
fc70: 20 61 64 64 72 49 6e 73 4c 6f 6f 70 3b 20 20 20   addrInsLoop;   
fc80: 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c   /* Top of the l
fc90: 6f 6f 70 20 66 6f 72 20 69 6e 73 65 72 74 69 6e  oop for insertin
fca0: 67 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  g rows */.      
fcb0: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20  Table *pSelTab; 
fcc0: 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 74      /* A table t
fcd0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
fce0: 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73  e SELECT results
fcf0: 20 2a 2f 0a 0a 20 20 20 20 20 20 72 65 67 59 69   */..      regYi
fd00: 65 6c 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  eld = ++pParse->
fd10: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52  nMem;.      regR
fd20: 65 63 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ec = ++pParse->n
fd30: 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f  Mem;.      regRo
fd40: 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  wid = ++pParse->
fd50: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65  nMem;.      asse
fd60: 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d  rt(pParse->nTab=
fd70: 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  =1);.      sqlit
fd80: 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
fd90: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
fda0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
fdb0: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20  P_OpenWrite, 1, 
fdc0: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c  pParse->regRoot,
fdd0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
fde0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
fdf0: 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53 52  (v, OPFLAG_P2ISR
fe00: 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  EG);.      pPars
fe10: 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20  e->nTab = 2;.   
fe20: 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c     addrTop = sql
fe30: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
fe40: 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 20 20  ddr(v) + 1;.    
fe50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fe60: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
fe70: 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c  routine, regYiel
fe80: 64 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a  d, 0, addrTop);.
fe90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
fea0: 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
feb0: 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t, SRT_Coroutine
fec0: 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20  , regYield);.   
fed0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
fee0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
fef0: 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
ff00: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f  sqlite3VdbeEndCo
ff10: 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 59 69  routine(v, regYi
ff20: 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eld);.      sqli
ff30: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
ff40: 76 2c 20 61 64 64 72 54 6f 70 20 2d 20 31 29 3b  v, addrTop - 1);
ff50: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
ff60: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
ff70: 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 20  ;.      pSelTab 
ff80: 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
ff90: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
ffa0: 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  e, pSelect);.   
ffb0: 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d     if( pSelTab==
ffc0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
ffd0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
ffe0: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d  l==0 );.      p-
fff0: 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
10000 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e  >nCol;.      p->
10010 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
10020 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c  aCol;.      pSel
10030 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
10040 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43       pSelTab->aC
10050 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ol = 0;.      sq
10060 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
10070 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20  (db, pSelTab);. 
10080 20 20 20 20 20 61 64 64 72 49 6e 73 4c 6f 6f 70       addrInsLoop
10090 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
100a0 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
100b0 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b  , dest.iSDParm);
100c0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
100d0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
100e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
100f0 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
10100 2c 20 64 65 73 74 2e 69 53 64 73 74 2c 20 64 65  , dest.iSdst, de
10110 73 74 2e 6e 53 64 73 74 2c 20 72 65 67 52 65 63  st.nSdst, regRec
10120 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10130 54 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c  TableAffinity(v,
10140 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   p, 0);.      sq
10150 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10160 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
10170 31 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  1, regRowid);.  
10180 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10190 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
101a0 72 74 2c 20 31 2c 20 72 65 67 52 65 63 2c 20 72  rt, 1, regRec, r
101b0 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
101c0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
101d0 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b  v, addrInsLoop);
101e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
101f0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
10200 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20  drInsLoop);.    
10210 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10220 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
10230 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   1);.    }..    
10240 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
10250 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
10260 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65  the CREATE state
10270 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20  ment */.    if( 
10280 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
10290 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54   zStmt = createT
102a0 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b  ableStmt(db, p);
102b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
102c0 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20 3d    Token *pEnd2 =
102d0 20 74 61 62 4f 70 74 73 20 3f 20 26 70 50 61 72   tabOpts ? &pPar
102e0 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20 3a  se->sLastToken :
102f0 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20 3d   pEnd;.      n =
10300 20 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a 20   (int)(pEnd2->z 
10310 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  - pParse->sNameT
10320 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 69  oken.z);.      i
10330 66 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d  f( pEnd2->z[0]!=
10340 27 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64 32  ';' ) n += pEnd2
10350 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74  ->n;.      zStmt
10360 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
10370 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20  f(db, .         
10380 20 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73   "CREATE %s %.*s
10390 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50  ", zType2, n, pP
103a0 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
103b0 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .z.      );.    
103c0 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74  }..    /* A slot
103d0 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20   for the record 
103e0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
103f0 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68   allocated in th
10400 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  e .    ** SQLITE
10410 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
10420 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20  We just need to 
10430 75 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74  update that slot
10440 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a   with all.    **
10450 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
10460 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64   we've collected
10470 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
10480 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
10490 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55  pParse,.      "U
104a0 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20  PDATE %Q.%s ".  
104b0 20 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65         "SET type
104c0 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20  ='%s', name=%Q, 
104d0 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f  tbl_name=%Q, roo
104e0 74 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25  tpage=#%d, sql=%
104f0 51 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52  Q ".       "WHER
10500 45 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20  E rowid=#%d",.  
10510 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
10520 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45  .zDbSName, MASTE
10530 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20 7a 54  R_NAME,.      zT
10540 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e  ype,.      p->zN
10550 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e  ame,.      p->zN
10560 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73  ame,.      pPars
10570 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20  e->regRoot,.    
10580 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70    zStmt,.      p
10590 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a  Parse->regRowid.
105a0 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
105b0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74  e3DbFree(db, zSt
105c0 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mt);.    sqlite3
105d0 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
105e0 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  rse, iDb);..#ifn
105f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10600 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
10610 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
10620 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
10630 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65  create an sqlite
10640 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
10650 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69  for.    ** keepi
10660 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f  ng track of auto
10670 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a  increment keys..
10680 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
10690 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  p->tabFlags & TF
106a0 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21  _Autoincrement)!
106b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a  =0 ){.      Db *
106c0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
106d0 44 62 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Db];.      asser
106e0 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
106f0 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
10700 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20 69  b, 0) );.      i
10710 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  f( pDb->pSchema-
10720 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20  >pSeqTab==0 ){. 
10730 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65         sqlite3Ne
10740 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
10750 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45  ,.          "CRE
10760 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c  ATE TABLE %Q.sql
10770 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d  ite_sequence(nam
10780 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20  e,seq)",.       
10790 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65     pDb->zDbSName
107a0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
107b0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
107c0 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65  ..    /* Reparse
107d0 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75   everything to u
107e0 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e  pdate our intern
107f0 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72  al data structur
10800 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  es */.    sqlite
10810 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68  3VdbeAddParseSch
10820 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20  emaOp(v, iDb,.  
10830 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10840 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c  MPrintf(db, "tbl
10850 5f 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74  _name='%q' AND t
10860 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c  ype!='trigger'",
10870 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d   p->zName));.  }
10880 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  ...  /* Add the 
10890 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d  table to the in-
108a0 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
108b0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
108c0 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  abase..  */.  if
108d0 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
108e0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f  ){.    Table *pO
108f0 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a  ld;.    Schema *
10900 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63  pSchema = p->pSc
10910 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74  hema;.    assert
10920 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
10930 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
10940 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64  , 0) );.    pOld
10950 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
10960 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74  sert(&pSchema->t
10970 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65  blHash, p->zName
10980 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  , p);.    if( pO
10990 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ld ){.      asse
109a0 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20  rt( p==pOld );  
109b0 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
109c0 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64  ave failed insid
109d0 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a  e HashInsert() *
109e0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  /.      sqlite3O
109f0 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
10a00 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
10a10 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  .    pParse->pNe
10a20 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  wTable = 0;.    
10a30 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
10a40 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
10a50 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
10a60 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42  TE_OMIT_ALTERTAB
10a70 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70  LE.    if( !p->p
10a80 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
10a90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
10aa0 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
10ab0 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  *)pParse->sNameT
10ac0 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e  oken.z;.      in
10ad0 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61  t nName;.      a
10ae0 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74 20  ssert( !pSelect 
10af0 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64  && pCons && pEnd
10b00 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43   );.      if( pC
10b10 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  ons->z==0 ){.   
10b20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e       pCons = pEn
10b30 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
10b40 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28 28   nName = (int)((
10b50 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f  const char *)pCo
10b60 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a  ns->z - zName);.
10b70 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f        p->addColO
10b80 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c  ffset = 13 + sql
10b90 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28  ite3Utf8CharLen(
10ba0 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
10bb0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
10bc0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
10bd0 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
10be0 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
10bf0 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
10c00 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
10c10 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f  te a new VIEW.*/
10c20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
10c30 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65  ateView(.  Parse
10c40 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
10c50 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
10c60 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
10c70 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20  *pBegin,     /* 
10c80 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
10c90 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65   that begins the
10ca0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
10cb0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
10cc0 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
10cd0 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
10ce0 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
10cf0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
10d00 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e2,     /* The t
10d10 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
10d20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
10d30 76 69 65 77 20 2a 2f 0a 20 20 45 78 70 72 4c 69  view */.  ExprLi
10d40 73 74 20 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a 20  st *pCNames, /* 
10d50 4f 70 74 69 6f 6e 61 6c 20 6c 69 73 74 20 6f 66  Optional list of
10d60 20 76 69 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d   view column nam
10d70 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  es */.  Select *
10d80 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20  pSelect,   /* A 
10d90 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
10da0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
10db0 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a  e the new view *
10dc0 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
10dd0 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66         /* TRUE f
10de0 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76  or a TEMPORARY v
10df0 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  iew */.  int noE
10e00 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  rr          /* S
10e10 75 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65  uppress error me
10e20 73 73 61 67 65 73 20 69 66 20 56 49 45 57 20 61  ssages if VIEW a
10e30 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
10e40 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
10e50 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74    int n;.  const
10e60 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65   char *z;.  Toke
10e70 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65  n sEnd;.  DbFixe
10e80 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20  r sFix;.  Token 
10e90 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  *pName = 0;.  in
10ea0 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33  t iDb;.  sqlite3
10eb0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
10ec0 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
10ed0 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20  ->nVar>0 ){.    
10ee0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
10ef0 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74  pParse, "paramet
10f00 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ers are not allo
10f10 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a  wed in views");.
10f20 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f      goto create_
10f30 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20  view_fail;.  }. 
10f40 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
10f50 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
10f60 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d  1, pName2, isTem
10f70 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b  p, 1, 0, noErr);
10f80 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
10f90 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
10fa0 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
10fb0 6e 45 72 72 20 29 20 67 6f 74 6f 20 63 72 65 61  nErr ) goto crea
10fc0 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20  te_view_fail;.  
10fd0 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
10fe0 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
10ff0 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
11000 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  e);.  iDb = sqli
11010 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
11020 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  (db, p->pSchema)
11030 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e  ;.  sqlite3FixIn
11040 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
11050 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70  , iDb, "view", p
11060 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c  Name);.  if( sql
11070 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73  ite3FixSelect(&s
11080 46 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29 20  Fix, pSelect) ) 
11090 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77  goto create_view
110a0 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  _fail;..  /* Mak
110b0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
110c0 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74  entire SELECT st
110d0 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
110e0 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
110f0 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f   ** This will fo
11100 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72  rce all the Expr
11110 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
11120 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
11130 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
11140 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69   rather than poi
11150 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20  nt to the input 
11160 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d  string - which m
11170 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  eans that.  ** t
11180 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74  hey will persist
11190 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
111a0 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  nt sqlite3_exec(
111b0 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a  ) call returns..
111c0 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63    */.  p->pSelec
111d0 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
111e0 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74  tDup(db, pSelect
111f0 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
11200 29 3b 0a 20 20 70 2d 3e 70 43 68 65 63 6b 20 3d  );.  p->pCheck =
11210 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
11220 44 75 70 28 64 62 2c 20 70 43 4e 61 6d 65 73 2c  Dup(db, pCNames,
11230 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
11240 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
11250 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
11260 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c  create_view_fail
11270 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  ;..  /* Locate t
11280 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
11290 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d  EATE VIEW statem
112a0 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20  ent.  Make sEnd 
112b0 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68  point to.  ** th
112c0 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45  e end..  */.  sE
112d0 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61  nd = pParse->sLa
112e0 73 74 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72  stToken;.  asser
112f0 74 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20  t( sEnd.z[0]!=0 
11300 29 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b  );.  if( sEnd.z[
11310 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73  0]!=';' ){.    s
11320 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b  End.z += sEnd.n;
11330 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  .  }.  sEnd.n = 
11340 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73  0;.  n = (int)(s
11350 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e  End.z - pBegin->
11360 7a 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e  z);.  assert( n>
11370 30 20 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69  0 );.  z = pBegi
11380 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 73  n->z;.  while( s
11390 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
113a0 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  n-1]) ){ n--; }.
113b0 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d    sEnd.z = &z[n-
113c0 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31  1];.  sEnd.n = 1
113d0 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69  ;..  /* Use sqli
113e0 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f  te3EndTable() to
113f0 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f   add the view to
11400 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
11410 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ER table */.  sq
11420 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50  lite3EndTable(pP
11430 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20  arse, 0, &sEnd, 
11440 30 2c 20 30 29 3b 0a 0a 63 72 65 61 74 65 5f 76  0, 0);..create_v
11450 69 65 77 5f 66 61 69 6c 3a 0a 20 20 73 71 6c 69  iew_fail:.  sqli
11460 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
11470 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
11480 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
11490 65 6c 65 74 65 28 64 62 2c 20 70 43 4e 61 6d 65  elete(db, pCName
114a0 73 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  s);.  return;.}.
114b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
114c0 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23  _OMIT_VIEW */..#
114d0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
114e0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
114f0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
11500 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
11510 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61  LE)./*.** The Ta
11520 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54  ble structure pT
11530 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  able is really a
11540 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20   VIEW.  Fill in 
11550 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  the names of.** 
11560 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
11570 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70  he view in the p
11580 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e  Table structure.
11590 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
115a0 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
115b0 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  .  If an error i
115c0 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20  s seen leave an 
115d0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
115e0 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
115f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11600 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
11610 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
11620 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
11630 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54  {.  Table *pSelT
11640 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20  ab;   /* A fake 
11650 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68  table from which
11660 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75   we get the resu
11670 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65  lt set */.  Sele
11680 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a  ct *pSel;     /*
11690 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   Copy of the SEL
116a0 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ECT that impleme
116b0 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a  nts the view */.
116c0 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20    int nErr = 0; 
116d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
116e0 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
116f0 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  red */.  int n; 
11700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
11710 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20  mporarily holds 
11720 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75  the number of cu
11730 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a  rsors assigned *
11740 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
11750 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
11760 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
11770 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63  ction for malloc
11780 20 65 72 72 6f 72 73 20 2a 2f 0a 23 69 66 6e 64   errors */.#ifnd
11790 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
117a0 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 73  UTHORIZATION.  s
117b0 71 6c 69 74 65 33 5f 78 61 75 74 68 20 78 41 75  qlite3_xauth xAu
117c0 74 68 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76  th;       /* Sav
117d0 65 64 20 78 41 75 74 68 20 70 6f 69 6e 74 65 72  ed xAuth pointer
117e0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   */.#endif..  as
117f0 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a  sert( pTable );.
11800 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11810 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
11820 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56  E.  if( sqlite3V
11830 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70  tabCallConnect(p
11840 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29  Parse, pTable) )
11850 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
11860 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
11870 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
11880 54 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20  Table) ) return 
11890 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  0;.#endif..#ifnd
118a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
118b0 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74  IEW.  /* A posit
118c0 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74  ive nCol means t
118d0 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73  he columns names
118e0 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61   for this view a
118f0 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  re.  ** already 
11900 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  known..  */.  if
11910 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30  ( pTable->nCol>0
11920 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
11930 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43  /* A negative nC
11940 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  ol is a special 
11950 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74  marker meaning t
11960 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65  hat we are curre
11970 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67  ntly.  ** trying
11980 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
11990 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
119a0 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20  f we enter this 
119b0 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a  routine with.  *
119c0 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * a negative nCo
119d0 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20  l, it means two 
119e0 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f  or more views fo
119f0 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20  rm a loop, like 
11a00 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
11a10 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
11a20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20  one AS SELECT * 
11a30 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20  FROM two;.  **  
11a40 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74     CREATE VIEW t
11a50 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  wo AS SELECT * F
11a60 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20  ROM one;.  **.  
11a70 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65  ** Actually, the
11a80 20 65 72 72 6f 72 20 61 62 6f 76 65 20 69 73 20   error above is 
11a90 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f 72  now caught prior
11aa0 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69   to reaching thi
11ab0 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75  s point..  ** Bu
11ac0 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  t the following 
11ad0 74 65 73 74 20 69 73 20 73 74 69 6c 6c 20 69 6d  test is still im
11ae0 70 6f 72 74 61 6e 74 20 61 73 20 69 74 20 64 6f  portant as it do
11af0 65 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20  es come up.  ** 
11b00 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
11b10 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20  :.  ** .  **    
11b20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61   CREATE TABLE ma
11b30 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20  in.ex1(a);.  ** 
11b40 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20      CREATE TEMP 
11b50 56 49 45 57 20 65 78 31 20 41 53 20 53 45 4c 45  VIEW ex1 AS SELE
11b60 43 54 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20  CT a FROM ex1;. 
11b70 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 2a   **     SELECT *
11b80 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a   FROM temp.ex1;.
11b90 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
11ba0 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  e->nCol<0 ){.   
11bb0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11bc0 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25  (pParse, "view %
11bd0 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20  s is circularly 
11be0 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65  defined", pTable
11bf0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
11c00 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73  turn 1;.  }.  as
11c10 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43  sert( pTable->nC
11c20 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ol>=0 );..  /* I
11c30 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
11c40 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e  r, it means we n
11c50 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
11c60 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a  he table names..
11c70 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
11c80 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
11c90 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
11ca0 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e  ect() will expan
11cb0 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65  d any.  ** "*" e
11cc0 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72  lements in the r
11cd0 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68  esults set of th
11ce0 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20  e view and will 
11cf0 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20  assign cursors. 
11d00 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65   ** to the eleme
11d10 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  nts of the FROM 
11d20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20  clause.  But we 
11d30 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73  do not want thes
11d40 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74  e changes.  ** t
11d50 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20  o be permanent. 
11d60 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74   So the computat
11d70 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61  ion is done on a
11d80 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
11d90 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  ECT.  ** stateme
11da0 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
11db0 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20  the view..  */. 
11dc0 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
11dd0 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53  >pSelect );.  pS
11de0 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  el = sqlite3Sele
11df0 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65  ctDup(db, pTable
11e00 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
11e10 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20   if( pSel ){.   
11e20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61   n = pParse->nTa
11e30 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72  b;.    sqlite3Sr
11e40 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
11e50 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  rs(pParse, pSel-
11e60 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62  >pSrc);.    pTab
11e70 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20  le->nCol = -1;. 
11e80 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
11e90 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 23 69 66  .bDisable++;.#if
11ea0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11eb0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
11ec0 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78     xAuth = db->x
11ed0 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41  Auth;.    db->xA
11ee0 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65  uth = 0;.    pSe
11ef0 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
11f00 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
11f10 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20  pParse, pSel);. 
11f20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78     db->xAuth = x
11f30 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Auth;.#else.    
11f40 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
11f50 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
11f60 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29  ct(pParse, pSel)
11f70 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61  ;.#endif.    pPa
11f80 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20  rse->nTab = n;. 
11f90 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 70     if( pTable->p
11fa0 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f  Check ){.      /
11fb0 2a 20 43 52 45 41 54 45 20 56 49 45 57 20 6e 61  * CREATE VIEW na
11fc0 6d 65 28 61 72 67 6c 69 73 74 29 20 41 53 20 2e  me(arglist) AS .
11fd0 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  ...      ** The 
11fe0 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
11ff0 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
12000 65 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d  e are taken from
12010 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 6c 69 73  .      ** arglis
12020 74 20 77 68 69 63 68 20 69 73 20 73 74 6f 72 65  t which is store
12030 64 20 69 6e 20 70 54 61 62 6c 65 2d 3e 70 43 68  d in pTable->pCh
12040 65 63 6b 2e 20 20 54 68 65 20 70 43 68 65 63 6b  eck.  The pCheck
12050 20 66 69 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20   field.      ** 
12060 6e 6f 72 6d 61 6c 6c 79 20 68 6f 6c 64 73 20 43  normally holds C
12070 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
12080 20 6f 6e 20 61 6e 20 6f 72 64 69 6e 61 72 79 20   on an ordinary 
12090 74 61 62 6c 65 2c 20 62 75 74 20 66 6f 72 0a 20  table, but for. 
120a0 20 20 20 20 20 2a 2a 20 61 20 56 49 45 57 20 69       ** a VIEW i
120b0 74 20 68 6f 6c 64 73 20 74 68 65 20 6c 69 73 74  t holds the list
120c0 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
120d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
120e0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
120f0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
12100 73 65 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65  se, pTable->pChe
12110 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ck, .           
12120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12130 20 20 20 20 20 20 26 70 54 61 62 6c 65 2d 3e 6e        &pTable->n
12140 43 6f 6c 2c 20 26 70 54 61 62 6c 65 2d 3e 61 43  Col, &pTable->aC
12150 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  ol);.      if( d
12160 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
12170 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 50  =0 .       && pP
12180 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 0a 20 20  arse->nErr==0.  
12190 20 20 20 20 20 26 26 20 70 54 61 62 6c 65 2d 3e       && pTable->
121a0 6e 43 6f 6c 3d 3d 70 53 65 6c 2d 3e 70 45 4c 69  nCol==pSel->pELi
121b0 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20  st->nExpr.      
121c0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
121d0 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d  e3SelectAddColum
121e0 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
121f0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  n(pParse, pTable
12200 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d  , pSel);.      }
12210 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
12220 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20  SelTab ){.      
12230 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57 20 6e  /* CREATE VIEW n
12240 61 6d 65 20 41 53 2e 2e 2e 20 20 77 69 74 68 6f  ame AS...  witho
12250 75 74 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 6c  ut an argument l
12260 69 73 74 2e 20 20 43 6f 6e 73 74 72 75 63 74 0a  ist.  Construct.
12270 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6c        ** the col
12280 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74  umn names from t
12290 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
122a0 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
122b0 20 74 68 65 20 76 69 65 77 2e 0a 20 20 20 20 20   the view..     
122c0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
122d0 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d  ( pTable->aCol==
122e0 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c  0 );.      pTabl
122f0 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->nCol = pSelTa
12300 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->nCol;.      p
12310 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53  Table->aCol = pS
12320 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
12330 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
12340 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c   = 0;.      pSel
12350 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
12360 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
12370 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
12380 65 6c 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c  eld(db, 0, pTabl
12390 65 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  e->pSchema) );. 
123a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
123b0 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
123c0 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  ;.      nErr++;.
123d0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
123e0 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
123f0 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 73   pSelTab);.    s
12400 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
12410 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20  te(db, pSel);.  
12420 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
12430 62 44 69 73 61 62 6c 65 2d 2d 3b 0a 20 20 7d 20  bDisable--;.  } 
12440 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b  else {.    nErr+
12450 2b 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d  +;.  }.  pTable-
12460 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  >pSchema->schema
12470 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65  Flags |= DB_Unre
12480 73 65 74 56 69 65 77 73 3b 0a 23 65 6e 64 69 66  setViews;.#endif
12490 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
124a0 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e  VIEW */.  return
124b0 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69   nErr;  .}.#endi
124c0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
124d0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
124e0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
124f0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
12500 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65  ABLE) */..#ifnde
12510 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
12520 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  EW./*.** Clear t
12530 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
12540 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20  from every VIEW 
12550 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e  in database idx.
12560 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12570 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
12580 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
12590 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68  int idx){.  Hash
125a0 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72  Elem *i;.  asser
125b0 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
125c0 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64  MutexHeld(db, id
125d0 78 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21  x, 0) );.  if( !
125e0 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
125f0 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
12600 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e  tViews) ) return
12610 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
12620 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
12630 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d  Db[idx].pSchema-
12640 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73  >tblHash); i;i=s
12650 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
12660 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
12670 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
12680 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
12690 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
126a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
126b0 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
126c0 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  db, pTab);.     
126d0 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b   pTab->aCol = 0;
126e0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f  .      pTab->nCo
126f0 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  l = 0;.    }.  }
12700 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72  .  DbClearProper
12710 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
12720 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a  nresetViews);.}.
12730 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
12740 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
12750 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a  l(A,B).#endif /*
12760 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
12770 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  W */../*.** This
12780 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
12790 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20  led by the VDBE 
127a0 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e  to adjust the in
127b0 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a  ternal schema.**
127c0 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20   used by SQLite 
127d0 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c  when the btree l
127e0 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62  ayer moves a tab
127f0 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68  le root page. Th
12800 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f  e.** root-page o
12810 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  f a table or ind
12820 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  ex in database i
12830 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66  Db has changed f
12840 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20  rom iFrom.** to 
12850 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65  iTo..**.** Ticke
12860 74 20 23 31 37 32 38 3a 20 20 54 68 65 20 73 79  t #1728:  The sy
12870 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74  mbol table might
12880 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69   still contain i
12890 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e  nformation.** on
128a0 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69   tables and/or i
128b0 6e 64 69 63 65 73 20 74 68 61 74 20 61 72 65 20  ndices that are 
128c0 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62  the process of b
128d0 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
128e0 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75   If you are unlu
128f0 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73  cky, one of thos
12900 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65  e deleted indice
12910 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68  s or tables migh
12920 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61  t.** have the sa
12930 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62  me rootpage numb
12940 65 72 20 61 73 20 74 68 65 20 72 65 61 6c 20 74  er as the real t
12950 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68  able or index th
12960 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d  at is.** being m
12970 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e  oved.  So we can
12980 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68 69  not stop searchi
12990 6e 67 20 61 66 74 65 72 20 74 68 65 20 66 69 72  ng after the fir
129a0 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63  st match .** bec
129b0 61 75 73 65 20 74 68 65 20 66 69 72 73 74 20 6d  ause the first m
129c0 61 74 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f  atch might be fo
129d0 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c  r one of the del
129e0 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20  eted indices.** 
129f0 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f  or tables and no
12a00 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  t the table/inde
12a10 78 20 74 68 61 74 20 69 73 20 61 63 74 75 61 6c  x that is actual
12a20 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a  ly being moved..
12a30 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69  ** We must conti
12a40 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69  nue looping unti
12a50 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64  l all tables and
12a60 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a   indices with.**
12a70 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d   rootpage==iFrom
12a80 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65   have been conve
12a90 72 74 65 64 20 74 6f 20 68 61 76 65 20 61 20 72  rted to have a r
12aa0 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a  ootpage of iTo.*
12ab0 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  * in order to be
12ac0 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 77 65   certain that we
12ad0 20 67 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f   got the right o
12ae0 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ne..*/.#ifndef S
12af0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
12b00 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74  ACUUM.void sqlit
12b10 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28  e3RootPageMoved(
12b20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
12b30 20 69 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c   iDb, int iFrom,
12b40 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73   int iTo){.  Has
12b50 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20  hElem *pElem;.  
12b60 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 44  Hash *pHash;.  D
12b70 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72  b *pDb;..  asser
12b80 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
12b90 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
12ba0 62 2c 20 30 29 20 29 3b 0a 20 20 70 44 62 20 3d  b, 0) );.  pDb =
12bb0 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
12bc0 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
12bd0 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
12be0 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
12bf0 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
12c00 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
12c10 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
12c20 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54  t(pElem)){.    T
12c30 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
12c40 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
12c50 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  m);.    if( pTab
12c60 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
12c70 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75  .      pTab->tnu
12c80 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
12c90 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44   }.  pHash = &pD
12ca0 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  b->pSchema->idxH
12cb0 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  ash;.  for(pElem
12cc0 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
12cd0 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20  (pHash); pElem; 
12ce0 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
12cf0 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
12d00 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
12d10 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
12d20 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Elem);.    if( p
12d30 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d  Idx->tnum==iFrom
12d40 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   ){.      pIdx->
12d50 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20  tnum = iTo;.    
12d60 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
12d70 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65  /*.** Write code
12d80 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61   to erase the ta
12d90 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
12da0 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64  ge iTable from d
12db0 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20  atabase iDb..** 
12dc0 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20  Also write code 
12dd0 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71  to modify the sq
12de0 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
12df0 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  e and internal s
12e00 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f  chema.** if a ro
12e10 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68  ot-page of anoth
12e20 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
12e30 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c  d by the btree-l
12e40 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65  ayer whilst.** e
12e50 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74  rasing iTable (t
12e60 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
12e70 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
12e80 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
12e90 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65   .static void de
12ea0 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61  stroyRootPage(Pa
12eb0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
12ec0 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62   iTable, int iDb
12ed0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
12ee0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
12ef0 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20  arse);.  int r1 
12f00 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
12f10 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 61  Reg(pParse);.  a
12f20 73 73 65 72 74 28 20 69 54 61 62 6c 65 3e 31 20  ssert( iTable>1 
12f30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12f40 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73  AddOp3(v, OP_Des
12f50 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72 31  troy, iTable, r1
12f60 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
12f70 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
12f80 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
12f90 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
12fa0 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f  M.  /* OP_Destro
12fb0 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20 69  y stores an in i
12fc0 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20 74 68  nteger r1. If th
12fd0 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20  is integer.  ** 
12fe0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
12ff0 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74  n it is the root
13000 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
13010 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f  a table moved to
13020 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69  .  ** location i
13030 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f  Table. The follo
13040 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69  wing code modifi
13050 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  es the sqlite_ma
13060 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20  ster table to.  
13070 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e  ** reflect this.
13080 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22  .  **.  ** The "
13090 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53 51 4c  #NNN" in the SQL
130a0 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f   is a special co
130b0 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e  nstant that mean
130c0 73 20 77 68 61 74 65 76 65 72 20 76 61 6c 75 65  s whatever value
130d0 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72 65 67 69  .  ** is in regi
130e0 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20 67  ster NNN.  See g
130f0 72 61 6d 6d 61 72 20 72 75 6c 65 73 20 61 73 73  rammar rules ass
13100 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
13110 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 2a   TK_REGISTER.  *
13120 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64 69  * token for addi
13130 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
13140 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  on..  */.  sqlit
13150 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
13160 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44  arse, .     "UPD
13170 41 54 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f  ATE %Q.%s SET ro
13180 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52 45 20  otpage=%d WHERE 
13190 23 25 64 20 41 4e 44 20 72 6f 6f 74 70 61 67 65  #%d AND rootpage
131a0 3d 23 25 64 22 2c 0a 20 20 20 20 20 70 50 61 72  =#%d",.     pPar
131b0 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
131c0 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45  .zDbSName, MASTE
131d0 52 5f 4e 41 4d 45 2c 20 69 54 61 62 6c 65 2c 20  R_NAME, iTable, 
131e0 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a  r1, r1);.#endif.
131f0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
13200 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
13210 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  r1);.}../*.** Wr
13220 69 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f  ite VDBE code to
13230 20 65 72 61 73 65 20 74 61 62 6c 65 20 70 54 61   erase table pTa
13240 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69  b and all associ
13250 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20  ated indices on 
13260 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f  disk..** Code to
13270 20 75 70 64 61 74 65 20 74 68 65 20 73 71 6c 69   update the sqli
13280 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73  te_master tables
13290 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63   and internal sc
132a0 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73  hema definitions
132b0 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f  .** in case a ro
132c0 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e  ot-page belongin
132d0 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62  g to another tab
132e0 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74  le is moved by t
132f0 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a  he btree layer.*
13300 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20  * is also added 
13310 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e  (this can happen
13320 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61   with an auto-va
13330 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a  cuum database)..
13340 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
13350 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73  estroyTable(Pars
13360 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
13370 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20   *pTab){.#ifdef 
13380 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
13390 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a  VACUUM.  Index *
133a0 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 44 62 20  pIdx;.  int iDb 
133b0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
133c0 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
133d0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
133e0 29 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  );.  destroyRoot
133f0 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 54 61  Page(pParse, pTa
13400 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  b->tnum, iDb);. 
13410 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
13420 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
13430 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
13440 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  .    destroyRoot
13450 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 64  Page(pParse, pId
13460 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
13470 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66   }.#else.  /* If
13480 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61   the database ma
13490 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d  y be auto-vacuum
134a0 20 63 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c   capable (if SQL
134b0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
134c0 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  UUM.  ** is not 
134d0 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69  defined), then i
134e0 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
134f0 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f  o call OP_Destro
13500 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61  y on the.  ** ta
13510 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f  ble and index ro
13520 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65  ot-pages in orde
13530 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  r, starting with
13540 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79   the numerically
13550 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72   .  ** largest r
13560 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e  oot-page number.
13570 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73   This guarantees
13580 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68   that none of th
13590 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a  e root-pages.  *
135a0 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65  * to be destroye
135b0 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62  d is relocated b
135c0 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f  y an earlier OP_
135d0 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66  Destroy. i.e. if
135e0 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77   the.  ** follow
135f0 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a  ing were coded:.
13600 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73    **.  ** OP_Des
13610 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e  troy 4 0.  ** ..
13620 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f  ..  ** OP_Destro
13630 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20  y 5 0.  **.  ** 
13640 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20  and root page 5 
13650 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74  happened to be t
13660 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  he largest root-
13670 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74  page number in t
13680 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
13690 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65  , then root page
136a0 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65   5 would be move
136b0 64 20 74 6f 20 70 61 67 65 20 34 20 62 79 20 74  d to page 4 by t
136c0 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73  he .  ** "OP_Des
136d0 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65  troy 4 0" opcode
136e0 2e 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74  . The subsequent
136f0 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30   "OP_Destroy 5 0
13700 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a  " would hit.  **
13710 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67   a free-list pag
13720 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54  e..  */.  int iT
13730 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b  ab = pTab->tnum;
13740 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65  .  int iDestroye
13750 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28  d = 0;..  while(
13760 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20   1 ){.    Index 
13770 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69  *pIdx;.    int i
13780 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20  Largest = 0;..  
13790 20 20 69 66 28 20 69 44 65 73 74 72 6f 79 65 64    if( iDestroyed
137a0 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73  ==0 || iTab<iDes
137b0 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20  troyed ){.      
137c0 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b  iLargest = iTab;
137d0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
137e0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
137f0 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
13800 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
13810 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78   int iIdx = pIdx
13820 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73  ->tnum;.      as
13830 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68  sert( pIdx->pSch
13840 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
13850 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ma );.      if( 
13860 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c  (iDestroyed==0 |
13870 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79  | (iIdx<iDestroy
13880 65 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61  ed)) && iIdx>iLa
13890 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  rgest ){.       
138a0 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78   iLargest = iIdx
138b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
138c0 20 20 20 20 69 66 28 20 69 4c 61 72 67 65 73 74      if( iLargest
138d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
138e0 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  urn;.    }else{.
138f0 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
13900 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
13910 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
13920 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
13930 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
13940 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61  Db>=0 && iDb<pPa
13950 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a  rse->db->nDb );.
13960 20 20 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f        destroyRoo
13970 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c  tPage(pParse, iL
13980 61 72 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20  argest, iDb);.  
13990 20 20 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d      iDestroyed =
139a0 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d   iLargest;.    }
139b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
139c0 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74 72  *.** Remove entr
139d0 69 65 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  ies from the sql
139e0 69 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73  ite_statN tables
139f0 20 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32 2c   (for N in (1,2,
13a00 33 29 29 0a 2a 2a 20 61 66 74 65 72 20 61 20 44  3)).** after a D
13a10 52 4f 50 20 49 4e 44 45 58 20 6f 72 20 44 52 4f  ROP INDEX or DRO
13a20 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e  P TABLE command.
13a30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13a40 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74  sqlite3ClearStat
13a50 54 61 62 6c 65 73 28 0a 20 20 50 61 72 73 65 20  Tables(.  Parse 
13a60 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
13a70 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
13a80 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
13a90 20 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 20   iDb,           
13aa0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
13ab0 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
13ac0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
13ad0 65 2c 20 20 20 20 20 2f 2a 20 22 69 64 78 22 20  e,     /* "idx" 
13ae0 6f 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63 6f  or "tbl" */.  co
13af0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
13b00 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
13b10 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 2a  index or table *
13b20 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
13b30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
13b40 61 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ame = pParse->db
13b50 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
13b60 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  ame;.  for(i=1; 
13b70 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<=4; i++){.    
13b80 63 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a 20  char zTab[24];. 
13b90 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
13ba0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 62 29  ntf(sizeof(zTab)
13bb0 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f 73 74  ,zTab,"sqlite_st
13bc0 61 74 25 64 22 2c 69 29 3b 0a 20 20 20 20 69 66  at%d",i);.    if
13bd0 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
13be0 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  le(pParse->db, z
13bf0 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29 7b  Tab, zDbName) ){
13c00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65  .      sqlite3Ne
13c10 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
13c20 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54  ,.        "DELET
13c30 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
13c40 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20 20  RE %s=%Q",.     
13c50 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62     zDbName, zTab
13c60 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20  , zType, zName. 
13c70 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
13c80 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
13c90 61 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f 70  ate code to drop
13ca0 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69   a table..*/.voi
13cb0 64 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f  d sqlite3CodeDro
13cc0 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
13cd0 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
13ce0 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  b, int iDb, int 
13cf0 69 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65 20  isView){.  Vdbe 
13d00 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
13d10 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
13d20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
13d30 67 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20 3d  ger;.  Db *pDb =
13d40 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
13d50 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
13d60 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
13d70 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
13d80 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  .  sqlite3BeginW
13d90 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
13da0 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a  arse, 1, iDb);..
13db0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13dc0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
13dd0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
13de0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  (pTab) ){.    sq
13df0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
13e00 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20  v, OP_VBegin);. 
13e10 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
13e20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72  Drop all trigger
13e30 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
13e40 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  h the table bein
13e50 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a  g dropped. Code.
13e60 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65    ** is generate
13e70 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72  d to remove entr
13e80 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  ies from sqlite_
13e90 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20  master and/or.  
13ea0 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  ** sqlite_temp_m
13eb0 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65  aster if require
13ec0 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67 67  d..  */.  pTrigg
13ed0 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67  er = sqlite3Trig
13ee0 67 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  gerList(pParse, 
13ef0 70 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28 20  pTab);.  while( 
13f00 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
13f10 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
13f20 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
13f30 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20  >pSchema || .   
13f40 20 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70       pTrigger->p
13f50 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b  Schema==db->aDb[
13f60 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  1].pSchema );.  
13f70 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69    sqlite3DropTri
13f80 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20  ggerPtr(pParse, 
13f90 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 70  pTrigger);.    p
13fa0 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67  Trigger = pTrigg
13fb0 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a  er->pNext;.  }..
13fc0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13fd0 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
13fe0 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e  T.  /* Remove an
13ff0 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65  y entries of the
14000 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
14010 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   table associate
14020 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
14030 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
14040 70 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  ped. This is don
14050 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62  e before the tab
14060 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20  le is dropped.  
14070 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20  ** at the btree 
14080 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74  level, in case t
14090 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
140a0 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74  ce table needs t
140b0 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61  o.  ** move as a
140c0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64   result of the d
140d0 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20  rop (can happen 
140e0 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
140f0 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ode)..  */.  if(
14100 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
14110 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
14120 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nt ){.    sqlite
14130 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
14140 72 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c 45  rse,.      "DELE
14150 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  TE FROM %Q.sqlit
14160 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45  e_sequence WHERE
14170 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20   name=%Q",.     
14180 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20   pDb->zDbSName, 
14190 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pTab->zName.    
141a0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
141b0 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c   /* Drop all SQL
141c0 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
141d0 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69   and index entri
141e0 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  es that refer to
141f0 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e   the.  ** table.
14200 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d   The program nam
14210 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  e loops through 
14220 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
14230 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 2a   and deletes.  *
14240 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74  * every row that
14250 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
14260 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  le of the same n
14270 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62  ame as the one b
14280 65 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65  eing.  ** droppe
14290 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20  d. Triggers are 
142a0 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65  handled separate
142b0 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69  ly because a tri
142c0 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a  gger can be.  **
142d0 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
142e0 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68  temp database th
142f0 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  at refers to a t
14300 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a  able in another.
14310 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
14320 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73   */.  sqlite3Nes
14330 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
14340 20 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20   .      "DELETE 
14350 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
14360 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64   tbl_name=%Q and
14370 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27   type!='trigger'
14380 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44  ",.      pDb->zD
14390 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e  bSName, MASTER_N
143a0 41 4d 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  AME, pTab->zName
143b0 29 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65 77  );.  if( !isView
143c0 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70   && !IsVirtual(p
143d0 54 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73 74  Tab) ){.    dest
143e0 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c  royTable(pParse,
143f0 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f   pTab);.  }..  /
14400 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62  * Remove the tab
14410 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51  le entry from SQ
14420 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20  Lite's internal 
14430 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66  schema and modif
14440 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d  y.  ** the schem
14450 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20  a cookie..  */. 
14460 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
14470 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Tab) ){.    sqli
14480 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
14490 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44   OP_VDestroy, iD
144a0 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  b, 0, 0, pTab->z
144b0 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Name, 0);.  }.  
144c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
144d0 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c  4(v, OP_DropTabl
144e0 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54  e, iDb, 0, 0, pT
144f0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
14500 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
14510 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
14520 29 3b 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52  );.  sqliteViewR
14530 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29  esetAll(db, iDb)
14540 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
14550 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
14560 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b  d to do the work
14570 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45   of a DROP TABLE
14580 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70   statement..** p
14590 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  Name is the name
145a0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
145b0 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a   be dropped..*/.
145c0 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
145d0 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
145e0 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
145f0 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c  ame, int isView,
14600 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54   int noErr){.  T
14610 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64  able *pTab;.  Vd
14620 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
14630 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
14640 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
14650 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
14660 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
14670 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
14680 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
14690 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
146a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e   );.  assert( pN
146b0 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
146c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61    if( sqlite3Rea
146d0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
146e0 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70  ) goto exit_drop
146f0 5f 74 61 62 6c 65 3b 0a 20 20 69 66 28 20 6e 6f  _table;.  if( no
14700 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
14710 73 73 45 72 72 2b 2b 3b 0a 20 20 61 73 73 65 72  ssErr++;.  asser
14720 74 28 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20  t( isView==0 || 
14730 69 73 56 69 65 77 3d 3d 4c 4f 43 41 54 45 5f 56  isView==LOCATE_V
14740 49 45 57 20 29 3b 0a 20 20 70 54 61 62 20 3d 20  IEW );.  pTab = 
14750 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
14760 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 69  leItem(pParse, i
14770 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61  sView, &pName->a
14780 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72  [0]);.  if( noEr
14790 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73  r ) db->suppress
147a0 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54  Err--;..  if( pT
147b0 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ab==0 ){.    if(
147c0 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74 65 33   noErr ) sqlite3
147d0 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53  CodeVerifyNamedS
147e0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e  chema(pParse, pN
147f0 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
14800 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ase);.    goto e
14810 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
14820 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
14830 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
14840 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
14850 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ma);.  assert( i
14860 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
14870 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  >nDb );..  /* If
14880 20 70 54 61 62 20 69 73 20 61 20 76 69 72 74 75   pTab is a virtu
14890 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56  al table, call V
148a0 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
148b0 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20  s() to ensure.  
148c0 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c  ** it is initial
148d0 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ized..  */.  if(
148e0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
148f0 20 26 26 20 73 71 6c 69 74 65 33 56 69 65 77 47   && sqlite3ViewG
14900 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
14910 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20  arse, pTab) ){. 
14920 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14930 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66  p_table;.  }.#if
14940 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14950 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
14960 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b   {.    int code;
14970 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
14980 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
14990 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63  ABLE(iDb);.    c
149a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
149b0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
149c0 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  bSName;.    cons
149d0 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20  t char *zArg2 = 
149e0 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
149f0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
14a00 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
14a10 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
14a20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
14a30 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
14a40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56     }.    if( isV
14a50 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  iew ){.      if(
14a60 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
14a70 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
14a80 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
14a90 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b  _DROP_TEMP_VIEW;
14aa0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14ab0 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
14ac0 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20  ITE_DROP_VIEW;. 
14ad0 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
14ae0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
14af0 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73  ALTABLE.    }els
14b00 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28  e if( IsVirtual(
14b10 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63  pTab) ){.      c
14b20 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
14b30 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  P_VTABLE;.      
14b40 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47  zArg2 = sqlite3G
14b50 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
14b60 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b  b)->pMod->zName;
14b70 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
14b80 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  e{.      if( !OM
14b90 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
14ba0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
14bb0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
14bc0 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  P_TEMP_TABLE;.  
14bd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14be0 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
14bf0 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _DROP_TABLE;.   
14c00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
14c10 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
14c20 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
14c30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
14c40 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Arg2, zDb) ){.  
14c50 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
14c60 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
14c70 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
14c80 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
14c90 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
14ca0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20  pTab->zName, 0, 
14cb0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
14cc0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
14cd0 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  le;.    }.  }.#e
14ce0 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74  ndif.  if( sqlit
14cf0 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
14d00 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
14d10 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26  ", 7)==0 .    &&
14d20 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
14d30 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73  (pTab->zName, "s
14d40 71 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29  qlite_stat", 11)
14d50 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
14d60 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
14d70 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
14d80 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22   not be dropped"
14d90 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
14da0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
14db0 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23  op_table;.  }..#
14dc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14dd0 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73  IT_VIEW.  /* Ens
14de0 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69  ure DROP TABLE i
14df0 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20  s not used on a 
14e00 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56  view, and DROP V
14e10 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a  IEW is not used.
14e20 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e    ** on a table.
14e30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69  .  */.  if( isVi
14e40 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
14e50 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
14e60 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14e70 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
14e80 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20  TABLE to delete 
14e90 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d  table %s", pTab-
14ea0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
14eb0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
14ec0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73  e;.  }.  if( !is
14ed0 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
14ee0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
14ef0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14f00 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56  rse, "use DROP V
14f10 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69  IEW to delete vi
14f20 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  ew %s", pTab->zN
14f30 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
14f40 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
14f50 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
14f60 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
14f70 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62  o remove the tab
14f80 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  le from the mast
14f90 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e  er table.  ** on
14fa0 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20   disk..  */.  v 
14fb0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
14fc0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
14fd0 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
14fe0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
14ff0 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
15000 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
15010 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28  ClearStatTables(
15020 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74 62  pParse, iDb, "tb
15030 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  l", pTab->zName)
15040 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44  ;.    sqlite3FkD
15050 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ropTable(pParse,
15060 20 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20   pName, pTab);. 
15070 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72     sqlite3CodeDr
15080 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
15090 70 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65  pTab, iDb, isVie
150a0 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72  w);.  }..exit_dr
150b0 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69  op_table:.  sqli
150c0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
150d0 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, pName);.}..
150e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
150f0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
15100 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72  create a new for
15110 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  eign key on the 
15120 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74  table.** current
15130 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
15140 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c  ction.  pFromCol
15150 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
15160 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  h columns.** in 
15170 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
15180 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  e point to the f
15190 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20  oreign key.  If 
151a0 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e  pFromCol==0 then
151b0 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20  .** connect the 
151c0 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20  key to the last 
151d0 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e  column inserted.
151e0 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d    pTo is the nam
151f0 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  e of.** the tabl
15200 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 28 61  e referred to (a
15210 2e 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74  .k.a the "parent
15220 22 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f  " table).  pToCo
15230 6c 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f  l is a list.** o
15240 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
15250 70 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65  parent pTo table
15260 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e  .  flags contain
15270 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  s all.** informa
15280 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
15290 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
152a0 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70  on algorithms sp
152b0 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68  ecified.** in th
152c0 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20  e ON DELETE, ON 
152d0 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e  UPDATE and ON IN
152e0 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SERT clauses..**
152f0 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75  .** An FKey stru
15300 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
15310 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
15320 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
15330 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74  y.** under const
15340 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ruction in the p
15350 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
15360 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   field..**.** Th
15370 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  e foreign key is
15380 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41   set for IMMEDIA
15390 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  TE processing.  
153a0 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  A subsequent cal
153b0 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44  l.** to sqlite3D
153c0 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29  eferForeignKey()
153d0 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
153e0 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a  is to DEFERRED..
153f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
15400 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28  reateForeignKey(
15410 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
15420 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
15430 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
15440 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43  ExprList *pFromC
15450 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ol,  /* Columns 
15460 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68  in this table th
15470 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65  at point to othe
15480 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b  r table */.  Tok
15490 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20  en *pTo,        
154a0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
154b0 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
154c0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43    ExprList *pToC
154d0 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol,    /* Column
154e0 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74  s in the other t
154f0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  able */.  int fl
15500 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
15510 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
15520 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
15530 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  . */.){.  sqlite
15540 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
15550 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
15560 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
15570 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  KEY.  FKey *pFKe
15580 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70  y = 0;.  FKey *p
15590 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20  NextTo;.  Table 
155a0 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  *p = pParse->pNe
155b0 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42  wTable;.  int nB
155c0 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  yte;.  int i;.  
155d0 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72  int nCol;.  char
155e0 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *z;..  assert( 
155f0 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  pTo!=0 );.  if( 
15600 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  p==0 || IN_DECLA
15610 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66  RE_VTAB ) goto f
15620 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72  k_end;.  if( pFr
15630 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
15640 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43  int iCol = p->nC
15650 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45  ol-1;.    if( NE
15660 56 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f  VER(iCol<0) ) go
15670 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69  to fk_end;.    i
15680 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
15690 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b  Col->nExpr!=1 ){
156a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
156b0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
156c0 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25  foreign key on %
156d0 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68  s".         " sh
156e0 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f  ould reference o
156f0 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f  nly one column o
15700 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20  f table %T",.   
15710 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43        p->aCol[iC
15720 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b  ol].zName, pTo);
15730 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  .      goto fk_e
15740 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43  nd;.    }.    nC
15750 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ol = 1;.  }else 
15760 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
15770 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72  oCol->nExpr!=pFr
15780 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a  omCol->nExpr ){.
15790 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
157a0 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
157b0 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63      "number of c
157c0 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67  olumns in foreig
157d0 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  n key does not m
157e0 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
157f0 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f  of ".        "co
15800 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66  lumns in the ref
15810 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b  erenced table");
15820 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
15830 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
15840 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Col = pFromCol->
15850 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79  nExpr;.  }.  nBy
15860 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b  te = sizeof(*pFK
15870 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73  ey) + (nCol-1)*s
15880 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f  izeof(pFKey->aCo
15890 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b  l[0]) + pTo->n +
158a0 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c   1;.  if( pToCol
158b0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
158c0 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72   i<pToCol->nExpr
158d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42  ; i++){.      nB
158e0 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  yte += sqlite3St
158f0 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61  rlen30(pToCol->a
15900 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a  [i].zName) + 1;.
15910 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
15920 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  y = sqlite3DbMal
15930 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
15940 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79  e );.  if( pFKey
15950 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ==0 ){.    goto 
15960 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46  fk_end;.  }.  pF
15970 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a  Key->pFrom = p;.
15980 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72    pFKey->pNextFr
15990 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20  om = p->pFKey;. 
159a0 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b   z = (char*)&pFK
159b0 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a  ey->aCol[nCol];.
159c0 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a    pFKey->zTo = z
159d0 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54  ;.  memcpy(z, pT
159e0 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20  o->z, pTo->n);. 
159f0 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a   z[pTo->n] = 0;.
15a00 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
15a10 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d  (z);.  z += pTo-
15a20 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e  >n+1;.  pFKey->n
15a30 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66  Col = nCol;.  if
15a40 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
15a50 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  .    pFKey->aCol
15a60 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e  [0].iFrom = p->n
15a70 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Col-1;.  }else{.
15a80 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
15a90 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
15aa0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
15ab0 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c  r(j=0; j<p->nCol
15ac0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
15ad0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
15ae0 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  mp(p->aCol[j].zN
15af0 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61  ame, pFromCol->a
15b00 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
15b10 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79  .          pFKey
15b20 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20  ->aCol[i].iFrom 
15b30 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = j;.          b
15b40 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
15b50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
15b60 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a  ( j>=p->nCol ){.
15b70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15b80 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15b90 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e  .          "unkn
15ba0 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c  own column \"%s\
15bb0 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  " in foreign key
15bc0 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20   definition", . 
15bd0 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f           pFromCo
15be0 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
15bf0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f          goto fk_
15c00 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
15c10 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f   }.  }.  if( pTo
15c20 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
15c30 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
15c40 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
15c50 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
15c60 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
15c70 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79  me);.      pFKey
15c80 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d  ->aCol[i].zCol =
15c90 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   z;.      memcpy
15ca0 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  (z, pToCol->a[i]
15cb0 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  .zName, n);.    
15cc0 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20    z[n] = 0;.    
15cd0 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20    z += n+1;.    
15ce0 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69  }.  }.  pFKey->i
15cf0 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20  sDeferred = 0;. 
15d00 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b   pFKey->aAction[
15d10 30 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20  0] = (u8)(flags 
15d20 26 20 30 78 66 66 29 3b 20 20 20 20 20 20 20 20  & 0xff);        
15d30 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45      /* ON DELETE
15d40 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b   action */.  pFK
15d50 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d  ey->aAction[1] =
15d60 20 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20   (u8)((flags >> 
15d70 38 20 29 20 26 20 30 78 66 66 29 3b 20 20 20 20  8 ) & 0xff);    
15d80 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74  /* ON UPDATE act
15d90 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ion */..  assert
15da0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
15db0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
15dc0 70 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  p->pSchema) );. 
15dd0 20 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65 79   pNextTo = (FKey
15de0 20 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49 6e   *)sqlite3HashIn
15df0 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61  sert(&p->pSchema
15e00 2d 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20 20  ->fkeyHash, .   
15e10 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28     pFKey->zTo, (
15e20 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20 29  void *)pFKey.  )
15e30 3b 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 3d  ;.  if( pNextTo=
15e40 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  =pFKey ){.    sq
15e50 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
15e60 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  );.    goto fk_e
15e70 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e  nd;.  }.  if( pN
15e80 65 78 74 54 6f 20 29 7b 0a 20 20 20 20 61 73 73  extTo ){.    ass
15e90 65 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50  ert( pNextTo->pP
15ea0 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20  revTo==0 );.    
15eb0 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d  pFKey->pNextTo =
15ec0 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e   pNextTo;.    pN
15ed0 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d  extTo->pPrevTo =
15ee0 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f   pFKey;.  }..  /
15ef0 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69  * Link the forei
15f00 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61  gn key to the ta
15f10 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20  ble as the last 
15f20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  step..  */.  p->
15f30 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20  pFKey = pFKey;. 
15f40 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f   pFKey = 0;..fk_
15f50 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62  end:.  sqlite3Db
15f60 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b  Free(db, pFKey);
15f70 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
15f80 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
15f90 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a  FOREIGN_KEY) */.
15fa0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
15fb0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f  tDelete(db, pFro
15fc0 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  mCol);.  sqlite3
15fd0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
15fe0 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f  b, pToCol);.}../
15ff0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16000 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
16010 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d   an INITIALLY IM
16020 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49  MEDIATE or INITI
16030 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a  ALLY DEFERRED.**
16040 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20   clause is seen 
16050 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72  as part of a for
16060 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
16070 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65  ion.  The isDefe
16080 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  rred.** paramete
16090 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49  r is 1 for INITI
160a0 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e  ALLY DEFERRED an
160b0 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  d 0 for INITIALL
160c0 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20  Y IMMEDIATE..** 
160d0 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  The behavior of 
160e0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
160f0 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67  y created foreig
16100 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65  n key is adjuste
16110 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79  d.** accordingly
16120 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
16130 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
16140 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
16150 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b  int isDeferred){
16160 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16170 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
16180 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
16190 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20    FKey *pFKey;. 
161a0 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61   if( (pTab = pPa
161b0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
161c0 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70  =0 || (pFKey = p
161d0 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29  Tab->pFKey)==0 )
161e0 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
161f0 74 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30  t( isDeferred==0
16200 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d   || isDeferred==
16210 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  1 ); /* EV: R-30
16220 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70  323-21917 */.  p
16230 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
16240 20 3d 20 28 75 38 29 69 73 44 65 66 65 72 72 65   = (u8)isDeferre
16250 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  d;.#endif.}../*.
16260 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
16270 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65   that will erase
16280 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65   and refill inde
16290 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69  x *pIdx.  This i
162a0 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69  s.** used to ini
162b0 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20  tialize a newly 
162c0 63 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72  created index or
162d0 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68   to recompute th
162e0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
162f0 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70  an index in resp
16300 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45  onse to a REINDE
16310 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
16320 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   if memRootPage 
16330 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c  is not negative,
16340 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
16350 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c  he index is newl
16360 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54  y.** created.  T
16370 68 65 20 72 65 67 69 73 74 65 72 20 73 70 65 63  he register spec
16380 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74  ified by memRoot
16390 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Page contains th
163a0 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e  e.** root page n
163b0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
163c0 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50  ex.  If memRootP
163d0 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
163e0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64   then.** the ind
163f0 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
16400 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c  s and must be cl
16410 65 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69  eared before bei
16420 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a  ng refilled and.
16430 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ** the root page
16440 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
16450 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72  ndex is taken fr
16460 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e  om pIndex->tnum.
16470 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16480 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
16490 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
164a0 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c  , Index *pIndex,
164b0 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65   int memRootPage
164c0 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
164d0 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
164e0 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  e;  /* The table
164f0 20 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64   that is indexed
16500 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
16510 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
16520 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75       /* Btree cu
16530 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54  rsor used for pT
16540 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ab */.  int iIdx
16550 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
16560 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20  +;     /* Btree 
16570 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  cursor used for 
16580 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20  pIndex */.  int 
16590 69 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20 20  iSorter;        
165a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
165b0 72 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 4f  rsor opened by O
165c0 70 65 6e 53 6f 72 74 65 72 20 28 69 66 20 69 6e  penSorter (if in
165d0 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61   use) */.  int a
165e0 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  ddr1;           
165f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
16600 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c  ress of top of l
16610 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
16620 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r2;             
16630 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
16640 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f  ss to jump to fo
16650 72 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  r next iteration
16660 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20   */.  int tnum; 
16670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16680 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
16690 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e of index */.  
166a0 69 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62 65  int iPartIdxLabe
166b0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
166c0 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c  * Jump to this l
166d0 61 62 65 6c 20 74 6f 20 73 6b 69 70 20 61 20 72  abel to skip a r
166e0 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ow */.  Vdbe *v;
166f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16700 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
16710 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
16720 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
16730 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  e */.  KeyInfo *
16740 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  pKey;           
16750 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f        /* KeyInfo
16760 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20   for index */.  
16770 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20  int regRecord;  
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16790 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
167a0 6e 67 20 61 73 73 65 6d 62 6c 65 64 20 69 6e 64  ng assembled ind
167b0 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73  ex record */.  s
167c0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
167d0 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a  rse->db;      /*
167e0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
167f0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
16800 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
16810 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
16820 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
16830 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
16840 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
16850 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69  ATION.  if( sqli
16860 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
16870 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e  rse, SQLITE_REIN
16880 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  DEX, pIndex->zNa
16890 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d  me, 0,.      db-
168a0 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
168b0 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75  me ) ){.    retu
168c0 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
168d0 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77    /* Require a w
168e0 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
168f0 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72   table to perfor
16900 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  m this operation
16910 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62   */.  sqlite3Tab
16920 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
16930 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
16940 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  1, pTab->zName);
16950 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
16960 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
16970 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
16980 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f  urn;.  if( memRo
16990 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  otPage>=0 ){.   
169a0 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50   tnum = memRootP
169b0 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
169c0 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d    tnum = pIndex-
169d0 3e 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65  >tnum;.  }.  pKe
169e0 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  y = sqlite3KeyIn
169f0 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
16a00 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 61 73 73  , pIndex);.  ass
16a10 65 72 74 28 20 70 4b 65 79 21 3d 30 20 7c 7c 20  ert( pKey!=0 || 
16a20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
16a30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
16a40 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   );..  /* Open t
16a50 68 65 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72  he sorter cursor
16a60 20 69 66 20 77 65 20 61 72 65 20 74 6f 20 75 73   if we are to us
16a70 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53 6f 72  e one. */.  iSor
16a80 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ter = pParse->nT
16a90 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56  ab++;.  sqlite3V
16aa0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
16ab0 53 6f 72 74 65 72 4f 70 65 6e 2c 20 69 53 6f 72  SorterOpen, iSor
16ac0 74 65 72 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  ter, 0, pIndex->
16ad0 6e 4b 65 79 43 6f 6c 2c 20 28 63 68 61 72 2a 29  nKeyCol, (char*)
16ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16af0 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49       sqlite3KeyI
16b00 6e 66 6f 52 65 66 28 70 4b 65 79 29 2c 20 50 34  nfoRef(pKey), P4
16b10 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a  _KEYINFO);..  /*
16b20 20 4f 70 65 6e 20 74 68 65 20 74 61 62 6c 65 2e   Open the table.
16b30 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
16b40 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61  l rows of the ta
16b50 62 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67 20 69  ble, inserting i
16b60 6e 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f 72 64  ndex.  ** record
16b70 73 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65  s into the sorte
16b80 72 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f  r. */.  sqlite3O
16b90 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
16ba0 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62   iTab, iDb, pTab
16bb0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
16bc0 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
16bd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16be0 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20  P_Rewind, iTab, 
16bf0 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
16c00 28 76 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64  (v);.  regRecord
16c10 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
16c20 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20  pReg(pParse);.. 
16c30 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
16c40 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
16c50 70 49 6e 64 65 78 2c 69 54 61 62 2c 72 65 67 52  pIndex,iTab,regR
16c60 65 63 6f 72 64 2c 30 2c 26 69 50 61 72 74 49 64  ecord,0,&iPartId
16c70 78 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a 20 20 73  xLabel,0,0);.  s
16c80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16c90 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  (v, OP_SorterIns
16ca0 65 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 72 65  ert, iSorter, re
16cb0 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
16cc0 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49 64  te3ResolvePartId
16cd0 78 4c 61 62 65 6c 28 70 50 61 72 73 65 2c 20 69  xLabel(pParse, i
16ce0 50 61 72 74 49 64 78 4c 61 62 65 6c 29 3b 0a 20  PartIdxLabel);. 
16cf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16d00 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
16d10 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 20 56  Tab, addr1+1); V
16d20 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
16d30 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
16d40 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
16d50 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61  .  if( memRootPa
16d60 67 65 3c 30 20 29 20 73 71 6c 69 74 65 33 56 64  ge<0 ) sqlite3Vd
16d70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
16d80 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29  lear, tnum, iDb)
16d90 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16da0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
16db0 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75  Write, iIdx, tnu
16dc0 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20  m, iDb, .       
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
16de0 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45  ar *)pKey, P4_KE
16df0 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65  YINFO);.  sqlite
16e00 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
16e10 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 7c   OPFLAG_BULKCSR|
16e20 28 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30  ((memRootPage>=0
16e30 29 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47  )?OPFLAG_P2ISREG
16e40 3a 30 29 29 3b 0a 0a 20 20 61 64 64 72 31 20 3d  :0));..  addr1 =
16e50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16e60 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
16e70 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 30 29  ort, iSorter, 0)
16e80 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
16e90 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75  );.  if( IsUniqu
16ea0 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29  eIndex(pIndex) )
16eb0 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d 20 73  {.    int j2 = s
16ec0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
16ed0 74 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20 20  tAddr(v) + 3;.  
16ee0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
16ef0 6f 28 76 2c 20 6a 32 29 3b 0a 20 20 20 20 61 64  o(v, j2);.    ad
16f00 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
16f10 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
16f20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16f30 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
16f40 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20 69  SorterCompare, i
16f50 53 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67 52  Sorter, j2, regR
16f60 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20  ecord,.         
16f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f80 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29  pIndex->nKeyCol)
16f90 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
16fa0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 55 6e  );.    sqlite3Un
16fb0 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  iqueConstraint(p
16fc0 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c  Parse, OE_Abort,
16fd0 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 65 6c 73   pIndex);.  }els
16fe0 65 7b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73  e{.    addr2 = s
16ff0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
17000 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20  tAddr(v);.  }.  
17010 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17020 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61  3(v, OP_SorterDa
17030 74 61 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67  ta, iSorter, reg
17040 52 65 63 6f 72 64 2c 20 69 49 64 78 29 3b 0a 20  Record, iIdx);. 
17050 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17060 70 33 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 69  p3(v, OP_Last, i
17070 49 64 78 2c 20 30 2c 20 2d 31 29 3b 0a 20 20 73  Idx, 0, -1);.  s
17080 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17090 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
170a0 2c 20 69 49 64 78 2c 20 72 65 67 52 65 63 6f 72  , iIdx, regRecor
170b0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
170c0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
170d0 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
170e0 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  T);.  sqlite3Rel
170f0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
17100 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
17110 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17120 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
17130 4e 65 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61  Next, iSorter, a
17140 64 64 72 32 29 3b 20 56 64 62 65 43 6f 76 65 72  ddr2); VdbeCover
17150 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
17160 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
17170 20 61 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69   addr1);..  sqli
17180 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
17190 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29   OP_Close, iTab)
171a0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
171b0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
171c0 65 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69  e, iIdx);.  sqli
171d0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
171e0 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74   OP_Close, iSort
171f0 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  er);.}../*.** Al
17200 6c 6f 63 61 74 65 20 68 65 61 70 20 73 70 61 63  locate heap spac
17210 65 20 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64  e to hold an Ind
17220 65 78 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e  ex object with n
17230 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a  Col columns..**.
17240 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20  ** Increase the 
17250 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20  allocation size 
17260 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 65 78  to provide an ex
17270 74 72 61 20 6e 45 78 74 72 61 20 62 79 74 65 73  tra nExtra bytes
17280 0a 2a 2a 20 6f 66 20 38 2d 62 79 74 65 20 61 6c  .** of 8-byte al
17290 69 67 6e 65 64 20 73 70 61 63 65 20 61 66 74 65  igned space afte
172a0 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  r the Index obje
172b0 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 0a  ct and return a.
172c0 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ** pointer to th
172d0 69 73 20 65 78 74 72 61 20 73 70 61 63 65 20 69  is extra space i
172e0 6e 20 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49  n *ppExtra..*/.I
172f0 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c  ndex *sqlite3All
17300 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74  ocateIndexObject
17310 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
17320 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
17330 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
17340 2a 2f 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20  */.  i16 nCol,  
17350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
17360 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  al number of col
17370 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
17380 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  x */.  int nExtr
17390 61 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  a,          /* N
173a0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
173b0 66 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f  f extra space to
173c0 20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72   alloc */.  char
173d0 20 2a 2a 70 70 45 78 74 72 61 20 20 20 20 20 20   **ppExtra      
173e0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
173f0 68 65 20 22 65 78 74 72 61 22 20 73 70 61 63 65  he "extra" space
17400 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
17410 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
17420 20 41 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78   Allocated index
17430 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
17440 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
17450 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
17460 61 63 65 20 66 6f 72 20 49 6e 64 65 78 20 6f 62  ace for Index ob
17470 6a 65 63 74 20 2b 20 61 72 72 61 79 73 20 2a 2f  ject + arrays */
17480 0a 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e  ..  nByte = ROUN
17490 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29  D8(sizeof(Index)
174a0 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) +             
174b0 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74   /* Index struct
174c0 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ure  */.        
174d0 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28    ROUND8(sizeof(
174e0 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20  char*)*nCol) +  
174f0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
17500 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20  azColl     */.  
17510 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73          ROUND8(s
17520 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e  izeof(LogEst)*(n
17530 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 2f 2a 20  Col+1) +     /* 
17540 49 6e 64 65 78 2e 61 69 52 6f 77 4c 6f 67 45 73  Index.aiRowLogEs
17550 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  t   */.         
17560 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69          sizeof(i
17570 31 36 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20  16)*nCol +      
17580 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
17590 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20  iColumn   */.   
175a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
175b0 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 29 3b 20  zeof(u8)*nCol); 
175c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
175d0 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20  ndex.aSortOrder 
175e0 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  */.  p = sqlite3
175f0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
17600 20 6e 42 79 74 65 20 2b 20 6e 45 78 74 72 61 29   nByte + nExtra)
17610 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
17620 20 63 68 61 72 20 2a 70 45 78 74 72 61 20 3d 20   char *pExtra = 
17630 28 28 63 68 61 72 2a 29 70 29 2b 52 4f 55 4e 44  ((char*)p)+ROUND
17640 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29  8(sizeof(Index))
17650 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20  ;.    p->azColl 
17660 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  = (const char**)
17670 70 45 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b  pExtra; pExtra +
17680 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
17690 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20  char*)*nCol);.  
176a0 20 20 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74    p->aiRowLogEst
176b0 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 45 78 74   = (LogEst*)pExt
176c0 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 73 69  ra; pExtra += si
176d0 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43  zeof(LogEst)*(nC
176e0 6f 6c 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 61 69  ol+1);.    p->ai
176f0 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 70  Column = (i16*)p
17700 45 78 74 72 61 3b 20 20 20 20 20 20 20 70 45 78  Extra;       pEx
17710 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31  tra += sizeof(i1
17720 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e  6)*nCol;.    p->
17730 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
17740 2a 29 70 45 78 74 72 61 3b 0a 20 20 20 20 70 2d  *)pExtra;.    p-
17750 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b  >nColumn = nCol;
17760 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20  .    p->nKeyCol 
17770 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20  = nCol - 1;.    
17780 2a 70 70 45 78 74 72 61 20 3d 20 28 28 63 68 61  *ppExtra = ((cha
17790 72 2a 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a 20  r*)p) + nByte;. 
177a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
177b0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
177c0 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61   new index for a
177d0 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e  n SQL table.  pN
177e0 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74  ame1.pName2 is t
177f0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
17800 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62  ndex .** and pTb
17810 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d  lList is the nam
17820 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
17830 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64  hat is to be ind
17840 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c  exed.  Both will
17850 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72   .** be NULL for
17860 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
17870 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  r an index that 
17880 69 73 20 63 72 65 61 74 65 64 20 74 6f 20 73 61  is created to sa
17890 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55  tisfy a.** UNIQU
178a0 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49  E constraint.  I
178b0 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e  f pTable and pIn
178c0 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73  dex are NULL, us
178d0 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
178e0 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61  ble.** as the ta
178f0 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
17900 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  d.  pParse->pNew
17910 54 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65  Table is a table
17920 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72   that is.** curr
17930 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
17940 74 72 75 63 74 65 64 20 62 79 20 61 20 43 52 45  tructed by a CRE
17950 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
17960 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74  ent..**.** pList
17970 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f   is a list of co
17980 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65  lumns to be inde
17990 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c  xed.  pList will
179a0 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73   be NULL if this
179b0 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79  .** is a primary
179c0 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63   key or unique-c
179d0 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65  onstraint on the
179e0 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c   most recent col
179f0 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20  umn added.** to 
17a00 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
17a10 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
17a20 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69  uction.  .*/.voi
17a30 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49  d sqlite3CreateI
17a40 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
17a50 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c  Parse,     /* Al
17a60 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
17a70 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a  out this parse *
17a80 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
17a90 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  1,     /* First 
17aa0 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
17ab0 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
17ac0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
17ad0 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e  e2,     /* Secon
17ae0 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20  d part of index 
17af0 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c  name. May be NUL
17b00 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  L */.  SrcList *
17b10 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62  pTblName, /* Tab
17b20 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65  le to index. Use
17b30 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
17b40 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70  le if 0 */.  Exp
17b50 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
17b60 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c  /* A list of col
17b70 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
17b80 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
17b90 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45  ror,       /* OE
17ba0 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72  _Abort, OE_Ignor
17bb0 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f  e, OE_Replace, o
17bc0 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54  r OE_None */.  T
17bd0 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
17be0 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
17bf0 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
17c00 73 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  s this statement
17c10 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50 49 57   */.  Expr *pPIW
17c20 68 65 72 65 2c 20 20 20 20 2f 2a 20 57 48 45 52  here,    /* WHER
17c30 45 20 63 6c 61 75 73 65 20 66 6f 72 20 70 61 72  E clause for par
17c40 74 69 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a  tial indices */.
17c50 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c    int sortOrder,
17c60 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64       /* Sort ord
17c70 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65  er of primary ke
17c80 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55  y when pList==NU
17c90 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f  LL */.  int ifNo
17ca0 74 45 78 69 73 74 2c 20 20 20 20 2f 2a 20 4f 6d  tExist,    /* Om
17cb0 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65  it error if inde
17cc0 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
17cd0 20 2a 2f 0a 20 20 75 38 20 69 64 78 54 79 70 65   */.  u8 idxType
17ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17cf0 69 6e 64 65 78 20 74 79 70 65 20 2a 2f 0a 29 7b  index type */.){
17d00 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
17d10 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65   0;     /* Table
17d20 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
17d30 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
17d40 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  x = 0;   /* The 
17d50 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61  index to be crea
17d60 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
17d70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Name = 0;     /*
17d80 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   Name of the ind
17d90 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  ex */.  int nNam
17da0 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
17db0 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
17dc0 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f  ters in zName */
17dd0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 44  .  int i, j;.  D
17de0 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20  bFixer sFix;    
17df0 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67      /* For assig
17e00 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61  ning database na
17e10 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f  mes to pTable */
17e20 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
17e30 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20  Mask;   /* 1 to 
17e40 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e  honor DESC in in
17e50 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72  dex.  0 to ignor
17e60 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  e. */.  sqlite3 
17e70 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
17e80 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  ;.  Db *pDb;    
17e90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17ea0 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20 63  specific table c
17eb0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e  ontaining the in
17ec0 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20 2a  dexed database *
17ed0 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
17ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
17ef0 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
17f00 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  e that is being 
17f10 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b  written */.  Tok
17f20 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20  en *pName = 0;  
17f30 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
17f40 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
17f50 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  ex to create */.
17f60 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
17f70 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65  t_item *pListIte
17f80 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  m; /* For loopin
17f90 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a  g over pList */.
17fa0 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30    int nExtra = 0
17fb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17fc0 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f     /* Space allo
17fd0 63 61 74 65 64 20 66 6f 72 20 7a 45 78 74 72 61  cated for zExtra
17fe0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  [] */.  int nExt
17ff0 72 61 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  raCol;          
18000 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
18010 65 72 20 6f 66 20 65 78 74 72 61 20 63 6f 6c 75  er of extra colu
18020 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20  mns needed */.  
18030 63 68 61 72 20 2a 7a 45 78 74 72 61 20 3d 20 30  char *zExtra = 0
18040 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18050 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20   /* Extra space 
18060 61 66 74 65 72 20 74 68 65 20 49 6e 64 65 78 20  after the Index 
18070 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64 65  object */.  Inde
18080 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20 20  x *pPk = 0;     
18090 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   /* PRIMARY KEY 
180a0 69 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55  index for WITHOU
180b0 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a  T ROWID tables *
180c0 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  /..  if( db->mal
180d0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
180e0 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20  rse->nErr>0 ){. 
180f0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18100 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
18110 20 69 66 28 20 49 4e 5f 44 45 43 4c 41 52 45 5f   if( IN_DECLARE_
18120 56 54 41 42 20 26 26 20 69 64 78 54 79 70 65 21  VTAB && idxType!
18130 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
18140 50 52 49 4d 41 52 59 4b 45 59 20 29 7b 0a 20 20  PRIMARYKEY ){.  
18150 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18160 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
18170 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
18180 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
18190 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
181a0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
181b0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
181c0 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
181d0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
181e0 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65   be indexed.  Re
181f0 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f  turn early if no
18200 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
18210 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
18220 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74  ){..    /* Use t
18230 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65  he two-part inde
18240 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  x name to determ
18250 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ine the database
18260 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72   .    ** to sear
18270 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ch for the table
18280 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c  . 'Fix' the tabl
18290 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64  e name to this d
182a0 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  b.    ** before 
182b0 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74  looking up the t
182c0 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
182d0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20   assert( pName1 
182e0 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20  && pName2 );.   
182f0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
18300 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
18310 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
18320 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
18330 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20  f( iDb<0 ) goto 
18340 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18350 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  x;.    assert( p
18360 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a  Name && pName->z
18370 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
18380 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a  ITE_OMIT_TEMPDB.
18390 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e      /* If the in
183a0 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71  dex name was unq
183b0 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20  ualified, check 
183c0 69 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  if the table.   
183d0 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61   ** is a temp ta
183e0 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20  ble. If so, set 
183f0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
18400 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69  1. Do not do thi
18410 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74  s.    ** if init
18420 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62  ialising a datab
18430 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20  ase schema..    
18440 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  */.    if( !db->
18450 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
18460 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
18470 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70  3SrcListLookup(p
18480 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29  Parse, pTblName)
18490 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d  ;.      if( pNam
184a0 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62  e2->n==0 && pTab
184b0 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d   && pTab->pSchem
184c0 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  a==db->aDb[1].pS
184d0 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
184e0 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20   iDb = 1;.      
184f0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
18500 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e      sqlite3FixIn
18510 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
18520 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20  , iDb, "index", 
18530 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
18540 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
18550 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d  t(&sFix, pTblNam
18560 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42  e) ){.      /* B
18570 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65  ecause the parse
18580 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62  r constructs pTb
18590 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e  lName from a sin
185a0 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a  gle identifier,.
185b0 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
185c0 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e  FixSrcList can n
185d0 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20  ever fail. */.  
185e0 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
185f0 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20     }.    pTab = 
18600 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
18610 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30  leItem(pParse, 0
18620 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30  , &pTblName->a[0
18630 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
18640 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18650 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29  ==0 || pTab==0 )
18660 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d  ;.    if( pTab==
18670 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
18680 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
18690 69 66 28 20 69 44 62 3d 3d 31 20 26 26 20 64 62  if( iDb==1 && db
186a0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
186b0 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma!=pTab->pSchem
186c0 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  a ){.      sqlit
186d0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
186e0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22  e, .           "
186f0 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61 20  cannot create a 
18700 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f  TEMP index on no
18710 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c 22 25  n-TEMP table \"%
18720 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\"",.          
18730 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
18740 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
18750 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
18760 20 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73 52   }.    if( !HasR
18770 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 50 6b  owid(pTab) ) pPk
18780 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
18790 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
187a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
187b0 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29  sert( pName==0 )
187c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
187d0 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70  tart==0 );.    p
187e0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
187f0 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28  ewTable;.    if(
18800 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78   !pTab ) goto ex
18810 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18820 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
18830 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
18840 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
18850 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20  a);.  }.  pDb = 
18860 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a  &db->aDb[iDb];..
18870 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
18880 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
18890 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
188a0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
188b0 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e  trNICmp(pTab->zN
188c0 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
188d0 37 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26  7)==0 .       &&
188e0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
188f0 30 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  0.#if SQLITE_USE
18900 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
18910 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
18920 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28  e3UserAuthTable(
18930 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a  pTab->zName)==0.
18940 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 26 26  #endif.       &&
18950 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
18960 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d  (&pTab->zName[7]
18970 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29 21  ,"altertab_",9)!
18980 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
18990 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
189a0 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
189b0 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c  not be indexed",
189c0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
189d0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
189e0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
189f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18a00 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54  IT_VIEW.  if( pT
18a10 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
18a20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
18a30 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
18a40 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
18a50 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
18a60 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18a70 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ex;.  }.#endif.#
18a80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18a90 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
18aa0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
18ab0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
18ac0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
18ad0 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74 61  rse, "virtual ta
18ae0 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  bles may not be 
18af0 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
18b00 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18b10 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
18b20 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  f..  /*.  ** Fin
18b30 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
18b40 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73  e index.  Make s
18b50 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74  ure there is not
18b60 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72   already another
18b70 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
18b80 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61  able with the sa
18b90 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a  me name.  .  **.
18ba0 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20    ** Exception: 
18bb0 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69   If we are readi
18bc0 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ng the names of 
18bd0 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65  permanent indice
18be0 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  s from the.  ** 
18bf0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
18c00 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d  ble (because som
18c10 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
18c20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65  changed the sche
18c30 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65  ma) and.  ** one
18c40 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   of the index na
18c50 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74  mes collides wit
18c60 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  h the name of a 
18c70 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
18c80 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74  or.  ** index, t
18c90 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74  hen we will cont
18ca0 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20  inue to process 
18cb0 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a  this index..  **
18cc0 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d  .  ** If pName==
18cd0 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  0 it means that 
18ce0 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c  we are.  ** deal
18cf0 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61  ing with a prima
18d00 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45  ry key or UNIQUE
18d10 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65   constraint.  We
18d20 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20   have to invent 
18d30 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d  our.  ** own nam
18d40 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e  e..  */.  if( pN
18d50 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ame ){.    zName
18d60 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
18d70 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
18d80 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  e);.    if( zNam
18d90 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  e==0 ) goto exit
18da0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18db0 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
18dc0 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  ->z!=0 );.    if
18dd0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
18de0 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
18df0 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
18e00 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
18e10 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18e20 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
18e30 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
18e40 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
18e50 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
18e60 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20  b, zName, 0)!=0 
18e70 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18e80 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
18e90 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
18ea0 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d  eady a table nam
18eb0 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
18ec0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
18ed0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
18ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18ef0 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
18f00 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
18f10 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29  , pDb->zDbSName)
18f20 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
18f30 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a   !ifNotExist ){.
18f40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
18f50 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
18f60 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64  "index %s alread
18f70 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65  y exists", zName
18f80 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
18f90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18fa0 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
18fb0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18fc0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
18fd0 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
18fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
18ff0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
19000 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ndex;.    }.  }e
19010 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  lse{.    int n;.
19020 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70      Index *pLoop
19030 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ;.    for(pLoop=
19040 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d  pTab->pIndex, n=
19050 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  1; pLoop; pLoop=
19060 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b  pLoop->pNext, n+
19070 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  +){}.    zName =
19080 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
19090 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f  db, "sqlite_auto
190a0 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54  index_%s_%d", pT
190b0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  ab->zName, n);. 
190c0 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
190d0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
190e0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
190f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
19100 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6e  utomatic index n
19110 61 6d 65 73 20 67 65 6e 65 72 61 74 65 64 20 66  ames generated f
19120 72 6f 6d 20 77 69 74 68 69 6e 20 73 71 6c 69 74  rom within sqlit
19130 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
19140 29 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 68 61  ).    ** must ha
19150 76 65 20 6e 61 6d 65 73 20 74 68 61 74 20 61 72  ve names that ar
19160 65 20 64 69 73 74 69 6e 63 74 20 66 72 6f 6d 20  e distinct from 
19170 6e 6f 72 6d 61 6c 20 61 75 74 6f 6d 61 74 69 63  normal automatic
19180 20 69 6e 64 65 78 20 6e 61 6d 65 73 2e 0a 20 20   index names..  
19190 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
191a0 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e  ng statement con
191b0 76 65 72 74 73 20 22 73 71 6c 69 74 65 33 5f 61  verts "sqlite3_a
191c0 75 74 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e 74  utoindex..." int
191d0 6f 0a 20 20 20 20 2a 2a 20 22 73 71 6c 69 74 65  o.    ** "sqlite
191e0 33 5f 62 75 74 6f 69 6e 64 65 78 2e 2e 2e 22 20  3_butoindex..." 
191f0 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65  in order to make
19200 20 74 68 65 20 6e 61 6d 65 73 20 64 69 73 74 69   the names disti
19210 6e 63 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  nct..    ** The 
19220 22 76 74 61 62 5f 65 72 72 2e 74 65 73 74 22 20  "vtab_err.test" 
19230 74 65 73 74 20 64 65 6d 6f 6e 73 74 72 61 74 65  test demonstrate
19240 73 20 74 68 65 20 6e 65 65 64 20 6f 66 20 74 68  s the need of th
19250 69 73 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f  is statement. */
19260 0a 20 20 20 20 69 66 28 20 49 4e 5f 44 45 43 4c  .    if( IN_DECL
19270 41 52 45 5f 56 54 41 42 20 29 20 7a 4e 61 6d 65  ARE_VTAB ) zName
19280 5b 37 5d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  [7]++;.  }..  /*
19290 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f   Check for autho
192a0 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61  rization to crea
192b0 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a  te an index..  *
192c0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
192d0 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
192e0 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73  ION.  {.    cons
192f0 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44  t char *zDb = pD
19300 62 2d 3e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b->zDbSName;.   
19310 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
19320 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
19330 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
19340 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
19350 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
19360 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
19370 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
19380 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52     i = SQLITE_CR
19390 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20  EATE_INDEX;.    
193a0 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
193b0 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d   && iDb==1 ) i =
193c0 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
193d0 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
193e0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
193f0 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a  eck(pParse, i, z
19400 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
19410 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
19420 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
19430 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
19440 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
19450 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20  If pList==0, it 
19460 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69  means this routi
19470 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ne was called to
19480 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a   make a primary.
19490 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20    ** key out of 
194a0 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
194b0 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
194c0 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
194d0 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63  ction..  ** So c
194e0 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73  reate a fake lis
194f0 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68  t to simulate th
19500 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  is..  */.  if( p
19510 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54  List==0 ){.    T
19520 6f 6b 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20 20  oken prevCol;.  
19530 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e    sqlite3TokenIn
19540 69 74 28 26 70 72 65 76 43 6f 6c 2c 20 70 54 61  it(&prevCol, pTa
19550 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
19560 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol-1].zName);.  
19570 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
19580 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
19590 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20  pParse, 0,.     
195a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
195b0 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
195c0 5f 49 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20 30  _ID, &prevCol, 0
195d0 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
195e0 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  t==0 ) goto exit
195f0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
19600 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
19610 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20  ->nExpr==1 );.  
19620 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
19630 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 70 4c  tSetSortOrder(pL
19640 69 73 74 2c 20 73 6f 72 74 4f 72 64 65 72 29 3b  ist, sortOrder);
19650 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
19660 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65  lite3ExprListChe
19670 63 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c  ckLength(pParse,
19680 20 70 4c 69 73 74 2c 20 22 69 6e 64 65 78 22 29   pList, "index")
19690 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75  ;.  }..  /* Figu
196a0 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
196b0 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
196c0 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 73  re required to s
196d0 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a  tore explicitly.
196e0 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63    ** specified c
196f0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
19700 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20  e names..  */.  
19710 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
19720 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
19730 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
19740 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
19750 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
19760 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
19770 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
19780 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20  K_COLLATE ){.   
19790 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20     nExtra += (1 
197a0 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  + sqlite3Strlen3
197b0 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  0(pExpr->u.zToke
197c0 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n));.    }.  }..
197d0 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63    /* .  ** Alloc
197e0 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74  ate the index st
197f0 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20  ructure. .  */. 
19800 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
19810 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
19820 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70  .  nExtraCol = p
19830 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  Pk ? pPk->nKeyCo
19840 6c 20 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78 20  l : 1;.  pIndex 
19850 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74  = sqlite3Allocat
19860 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c  eIndexObject(db,
19870 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20   pList->nExpr + 
19880 6e 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20  nExtraCol,.     
19890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198b0 20 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61 20   nName + nExtra 
198c0 2b 20 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20  + 1, &zExtra);. 
198d0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
198e0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
198f0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
19900 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  dex;.  }.  asser
19910 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
19920 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e  IGNMENT(pIndex->
19930 61 69 52 6f 77 4c 6f 67 45 73 74 29 20 29 3b 0a  aiRowLogEst) );.
19940 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
19950 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
19960 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29  Index->azColl) )
19970 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ;.  pIndex->zNam
19980 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45  e = zExtra;.  zE
19990 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20  xtra += nName + 
199a0 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64  1;.  memcpy(pInd
199b0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  ex->zName, zName
199c0 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49  , nName+1);.  pI
199d0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  ndex->pTable = p
199e0 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f  Tab;.  pIndex->o
199f0 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45  nError = (u8)onE
19a00 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  rror;.  pIndex->
19a10 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e  uniqNotNull = on
19a20 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a  Error!=OE_None;.
19a30 20 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70    pIndex->idxTyp
19a40 65 20 3d 20 69 64 78 54 79 70 65 3b 0a 20 20 70  e = idxType;.  p
19a50 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d  Index->pSchema =
19a60 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
19a70 63 68 65 6d 61 3b 0a 20 20 70 49 6e 64 65 78 2d  chema;.  pIndex-
19a80 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c 69 73 74  >nKeyCol = pList
19a90 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ->nExpr;.  if( p
19aa0 50 49 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73  PIWhere ){.    s
19ab0 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
19ac0 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73  fReference(pPars
19ad0 65 2c 20 70 54 61 62 2c 20 4e 43 5f 50 61 72 74  e, pTab, NC_Part
19ae0 49 64 78 2c 20 70 50 49 57 68 65 72 65 2c 20 30  Idx, pPIWhere, 0
19af0 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  );.    pIndex->p
19b00 50 61 72 74 49 64 78 57 68 65 72 65 20 3d 20 70  PartIdxWhere = p
19b10 50 49 57 68 65 72 65 3b 0a 20 20 20 20 70 50 49  PIWhere;.    pPI
19b20 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Where = 0;.  }. 
19b30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19b40 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
19b50 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 0a  db, iDb, 0) );..
19b60 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
19b70 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68  e if we should h
19b80 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65 73  onor DESC reques
19b90 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75  ts on index colu
19ba0 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  mns.  */.  if( p
19bb0 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c  Db->pSchema->fil
19bc0 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20  e_format>=4 ){. 
19bd0 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b     sortOrderMask
19be0 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f   = -1;   /* Hono
19bf0 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73  r DESC */.  }els
19c00 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  e{.    sortOrder
19c10 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Mask = 0;    /* 
19c20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20  Ignore DESC */. 
19c30 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65   }..  /* Analyze
19c40 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70   the list of exp
19c50 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 66 6f  ressions that fo
19c60 72 6d 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  rm the terms of 
19c70 74 68 65 20 69 6e 64 65 78 20 61 6e 64 0a 20 20  the index and.  
19c80 2a 2a 20 72 65 70 6f 72 74 20 61 6e 79 20 65 72  ** report any er
19c90 72 6f 72 73 2e 20 20 49 6e 20 74 68 65 20 63 6f  rors.  In the co
19ca0 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
19cb0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
19cc0 73 20 65 78 61 63 74 6c 79 0a 20 20 2a 2a 20 61  s exactly.  ** a
19cd0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73   table column, s
19ce0 74 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e  tore that column
19cf0 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20   in aiColumn[]. 
19d00 20 46 6f 72 20 67 65 6e 65 72 61 6c 20 65 78 70   For general exp
19d10 72 65 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70  ressions,.  ** p
19d20 6f 70 75 6c 61 74 65 20 70 49 6e 64 65 78 2d 3e  opulate pIndex->
19d30 61 43 6f 6c 45 78 70 72 20 61 6e 64 20 73 74 6f  aColExpr and sto
19d40 72 65 20 58 4e 5f 45 58 50 52 20 28 2d 32 29 20  re XN_EXPR (-2) 
19d50 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20  in aiColumn[].. 
19d60 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49   **.  ** TODO: I
19d70 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69  ssue a warning i
19d80 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f  f two or more co
19d90 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
19da0 65 78 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  ex are identical
19db0 2e 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73  ..  ** TODO: Iss
19dc0 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20  ue a warning if 
19dd0 74 68 65 20 74 61 62 6c 65 20 70 72 69 6d 61 72  the table primar
19de0 79 20 6b 65 79 20 69 73 20 75 73 65 64 20 61 73  y key is used as
19df0 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a   part of the.  *
19e00 2a 20 69 6e 64 65 78 20 6b 65 79 2e 0a 20 20 2a  * index key..  *
19e10 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69  /.  for(i=0, pLi
19e20 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b  stItem=pList->a;
19e30 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
19e40 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b   i++, pListItem+
19e50 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 43  +){.    Expr *pC
19e60 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
19e70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d         /* The i-
19e80 74 68 20 69 6e 64 65 78 20 65 78 70 72 65 73 73  th index express
19e90 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ion */.    int r
19ea0 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
19eb0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 53 43  r;        /* ASC
19ec0 20 6f 72 20 44 45 53 43 20 6f 6e 20 74 68 65 20   or DESC on the 
19ed0 69 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e 20  i-th expression 
19ee0 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
19ef0 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20  r *zColl;       
19f00 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
19f10 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
19f20 20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65 33   */..    sqlite3
19f30 53 74 72 69 6e 67 54 6f 49 64 28 70 4c 69 73 74  StringToId(pList
19f40 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
19f50 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
19f60 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50  SelfReference(pP
19f70 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 49  arse, pTab, NC_I
19f80 64 78 45 78 70 72 2c 20 70 4c 69 73 74 49 74 65  dxExpr, pListIte
19f90 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  m->pExpr, 0);.  
19fa0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
19fb0 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  rr ) goto exit_c
19fc0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
19fd0 20 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65   pCExpr = sqlite
19fe0 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
19ff0 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70  (pListItem->pExp
1a000 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 45 78  r);.    if( pCEx
1a010 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
1a020 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  N ){.      if( p
1a030 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65  Tab==pParse->pNe
1a040 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  wTable ){.      
1a050 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1a060 67 28 70 50 61 72 73 65 2c 20 22 65 78 70 72 65  g(pParse, "expre
1a070 73 73 69 6f 6e 73 20 70 72 6f 68 69 62 69 74 65  ssions prohibite
1a080 64 20 69 6e 20 50 52 49 4d 41 52 59 20 4b 45 59  d in PRIMARY KEY
1a090 20 61 6e 64 20 22 0a 20 20 20 20 20 20 20 20 20   and ".         
1a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0b0 20 20 20 20 20 20 20 22 55 4e 49 51 55 45 20 63         "UNIQUE c
1a0c0 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20  onstraints");.  
1a0d0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1a0e0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1a0f0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1a100 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72  pIndex->aColExpr
1a110 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ==0 ){.        E
1a120 78 70 72 4c 69 73 74 20 2a 70 43 6f 70 79 20 3d  xprList *pCopy =
1a130 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1a140 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2c 20 30  Dup(db, pList, 0
1a150 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  );.        pInde
1a160 78 2d 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70 43  x->aColExpr = pC
1a170 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28  opy;.        if(
1a180 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
1a190 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
1a1a0 61 73 73 65 72 74 28 20 70 43 6f 70 79 21 3d 30  assert( pCopy!=0
1a1b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c   );.          pL
1a1c0 69 73 74 49 74 65 6d 20 3d 20 26 70 43 6f 70 79  istItem = &pCopy
1a1d0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[i];.        
1a1e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1a1f0 6a 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20  j = XN_EXPR;.   
1a200 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
1a210 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 45 58 50 52  umn[i] = XN_EXPR
1a220 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  ;.      pIndex->
1a230 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b  uniqNotNull = 0;
1a240 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a250 20 20 6a 20 3d 20 70 43 45 78 70 72 2d 3e 69 43    j = pCExpr->iC
1a260 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 61 73 73  olumn;.      ass
1a270 65 72 74 28 20 6a 3c 3d 30 78 37 66 66 66 20 29  ert( j<=0x7fff )
1a280 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 30 20  ;.      if( j<0 
1a290 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70  ){.        j = p
1a2a0 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
1a2b0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
1a2c0 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c  ->aCol[j].notNul
1a2d0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
1a2e0 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e  pIndex->uniqNotN
1a2f0 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ull = 0;.      }
1a300 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  .      pIndex->a
1a310 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31  iColumn[i] = (i1
1a320 36 29 6a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  6)j;.    }.    z
1a330 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  Coll = 0;.    if
1a340 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  ( pListItem->pEx
1a350 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pr->op==TK_COLLA
1a360 54 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  TE ){.      int 
1a370 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a 43 6f  nColl;.      zCo
1a380 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e  ll = pListItem->
1a390 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
1a3a0 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73  .      nColl = s
1a3b0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1a3c0 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20  Coll) + 1;.     
1a3d0 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e   assert( nExtra>
1a3e0 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20  =nColl );.      
1a3f0 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 7a  memcpy(zExtra, z
1a400 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20  Coll, nColl);.  
1a410 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74      zColl = zExt
1a420 72 61 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61  ra;.      zExtra
1a430 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20   += nColl;.     
1a440 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c   nExtra -= nColl
1a450 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1a460 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43  j>=0 ){.      zC
1a470 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  oll = pTab->aCol
1a480 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 7d  [j].zColl;.    }
1a490 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20  .    if( !zColl 
1a4a0 29 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  ) zColl = sqlite
1a4b0 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20  3StrBINARY;.    
1a4c0 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
1a4d0 73 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f  sy && !sqlite3Lo
1a4e0 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
1a4f0 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  se, zColl) ){.  
1a500 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1a510 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1a520 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a  }.    pIndex->az
1a530 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b  Coll[i] = zColl;
1a540 0a 20 20 20 20 72 65 71 75 65 73 74 65 64 53 6f  .    requestedSo
1a550 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49  rtOrder = pListI
1a560 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26  tem->sortOrder &
1a570 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a   sortOrderMask;.
1a580 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72      pIndex->aSor
1a590 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29  tOrder[i] = (u8)
1a5a0 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
1a5b0 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70  er;.  }..  /* Ap
1a5c0 70 65 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6b  pend the table k
1a5d0 65 79 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ey to the end of
1a5e0 20 74 68 65 20 69 6e 64 65 78 2e 20 20 46 6f 72   the index.  For
1a5f0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20   WITHOUT ROWID. 
1a600 20 2a 2a 20 74 61 62 6c 65 73 20 28 77 68 65 6e   ** tables (when
1a610 20 70 50 6b 21 3d 30 29 20 74 68 69 73 20 77 69   pPk!=0) this wi
1a620 6c 6c 20 62 65 20 74 68 65 20 64 65 63 6c 61 72  ll be the declar
1a630 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20  ed PRIMARY KEY. 
1a640 20 46 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c   For.  ** normal
1a650 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50   tables (when pP
1a660 6b 3d 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20  k==0) this will 
1a670 62 65 20 74 68 65 20 72 6f 77 69 64 2e 0a 20 20  be the rowid..  
1a680 2a 2f 0a 20 20 69 66 28 20 70 50 6b 20 29 7b 0a  */.  if( pPk ){.
1a690 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
1a6a0 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  Pk->nKeyCol; j++
1a6b0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d  ){.      int x =
1a6c0 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a   pPk->aiColumn[j
1a6d0 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
1a6e0 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69   x>=0 );.      i
1a6f0 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49 6e  f( hasColumn(pIn
1a700 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70  dex->aiColumn, p
1a710 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20  Index->nKeyCol, 
1a720 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  x) ){.        pI
1a730 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b  ndex->nColumn--;
1a740 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20   .      }else{. 
1a750 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61         pIndex->a
1a760 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a  iColumn[i] = x;.
1a770 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1a780 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d  azColl[i] = pPk-
1a790 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20  >azColl[j];.    
1a7a0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72      pIndex->aSor
1a7b0 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 50 6b 2d  tOrder[i] = pPk-
1a7c0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a  >aSortOrder[j];.
1a7d0 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
1a7e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
1a7f0 73 73 65 72 74 28 20 69 3d 3d 70 49 6e 64 65 78  ssert( i==pIndex
1a800 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d  ->nColumn );.  }
1a810 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64 65 78  else{.    pIndex
1a820 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
1a830 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 70 49  XN_ROWID;.    pI
1a840 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20  ndex->azColl[i] 
1a850 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  = sqlite3StrBINA
1a860 52 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  RY;.  }.  sqlite
1a870 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70  3DefaultRowEst(p
1a880 49 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 70 50  Index);.  if( pP
1a890 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
1a8a0 3d 30 20 29 20 65 73 74 69 6d 61 74 65 49 6e 64  =0 ) estimateInd
1a8b0 65 78 57 69 64 74 68 28 70 49 6e 64 65 78 29 3b  exWidth(pIndex);
1a8c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1a8d0 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73 20 65 76  ndex contains ev
1a8e0 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 74  ery column of it
1a8f0 73 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  s table, then ma
1a900 72 6b 0a 20 20 2a 2a 20 69 74 20 61 73 20 61 20  rk.  ** it as a 
1a910 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a  covering index *
1a920 2f 0a 20 20 61 73 73 65 72 74 28 20 48 61 73 52  /.  assert( HasR
1a930 6f 77 69 64 28 70 54 61 62 29 20 0a 20 20 20 20  owid(pTab) .    
1a940 20 20 7c 7c 20 70 54 61 62 2d 3e 69 50 4b 65 79    || pTab->iPKey
1a950 3c 30 20 7c 7c 20 73 71 6c 69 74 65 33 43 6f 6c  <0 || sqlite3Col
1a960 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65  umnOfIndex(pInde
1a970 78 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79 29 3e  x, pTab->iPKey)>
1a980 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54 62 6c  =0 );.  if( pTbl
1a990 4e 61 6d 65 21 3d 30 20 26 26 20 70 49 6e 64 65  Name!=0 && pInde
1a9a0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 54 61 62  x->nColumn>=pTab
1a9b0 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 70 49  ->nCol ){.    pI
1a9c0 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67  ndex->isCovering
1a9d0 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = 1;.    for(j=
1a9e0 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
1a9f0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
1aa00 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20   j==pTab->iPKey 
1aa10 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1aa20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6c    if( sqlite3Col
1aa30 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65  umnOfIndex(pInde
1aa40 78 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e 74 69 6e  x,j)>=0 ) contin
1aa50 75 65 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  ue;.      pIndex
1aa60 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 30  ->isCovering = 0
1aa70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1aa80 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1aa90 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e  pTab==pParse->pN
1aaa0 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f  ewTable ){.    /
1aab0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
1aac0 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74  as been called t
1aad0 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f  o create an auto
1aae0 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20 61  matic index as a
1aaf0 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f  .    ** result o
1ab00 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  f a PRIMARY KEY 
1ab10 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65  or UNIQUE clause
1ab20 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66   on a column def
1ab30 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20  inition, or.    
1ab40 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  ** a PRIMARY KEY
1ab50 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
1ab60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  e following the 
1ab70 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
1ab80 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20  ns..    ** i.e. 
1ab90 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  one of:.    **. 
1aba0 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42     ** CREATE TAB
1abb0 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b  LE t(x PRIMARY K
1abc0 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43  EY, y);.    ** C
1abd0 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c  REATE TABLE t(x,
1abe0 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29   y, UNIQUE(x, y)
1abf0 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1ac00 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68 65   Either way, che
1ac10 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
1ac20 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68   table already h
1ac30 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78  as such an index
1ac40 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20  . If.    ** so, 
1ac50 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65  don't bother cre
1ac60 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20  ating this one. 
1ac70 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65  This only applie
1ac80 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f  s to.    ** auto
1ac90 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65  matically create
1aca0 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73  d indices. Users
1acb0 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20   can do as they 
1acc0 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a  wish with.    **
1acd0 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65   explicit indice
1ace0 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
1acf0 20 54 77 6f 20 55 4e 49 51 55 45 20 6f 72 20 50   Two UNIQUE or P
1ad00 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
1ad10 72 61 69 6e 74 73 20 61 72 65 20 63 6f 6e 73 69  raints are consi
1ad20 64 65 72 65 64 20 65 71 75 69 76 61 6c 65 6e 74  dered equivalent
1ad30 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20 74 68 75  .    ** (and thu
1ad40 73 20 73 75 70 70 72 65 73 73 69 6e 67 20 74 68  s suppressing th
1ad50 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76  e second one) ev
1ad60 65 6e 20 69 66 20 74 68 65 79 20 68 61 76 65 20  en if they have 
1ad70 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a  different.    **
1ad80 20 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20 20   sort orders..  
1ad90 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
1ada0 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
1adb0 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nt collating seq
1adc0 75 65 6e 63 65 73 20 6f 72 20 69 66 20 74 68 65  uences or if the
1add0 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20   columns of.    
1ade0 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  ** the constrain
1adf0 74 20 6f 63 63 75 72 20 69 6e 20 64 69 66 66 65  t occur in diffe
1ae00 72 65 6e 74 20 6f 72 64 65 72 73 2c 20 74 68 65  rent orders, the
1ae10 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  n the constraint
1ae20 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e  s are.    ** con
1ae30 73 69 64 65 72 65 64 20 64 69 73 74 69 6e 63 74  sidered distinct
1ae40 20 61 6e 64 20 62 6f 74 68 20 72 65 73 75 6c 74   and both result
1ae50 20 69 6e 20 73 65 70 61 72 61 74 65 20 69 6e 64   in separate ind
1ae60 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ices..    */.   
1ae70 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
1ae80 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
1ae90 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
1aea0 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
1aeb0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20  {.      int k;. 
1aec0 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73 55       assert( IsU
1aed0 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
1aee0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1aef0 28 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 21  ( pIdx->idxType!
1af00 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
1af10 41 50 50 44 45 46 20 29 3b 0a 20 20 20 20 20 20  APPDEF );.      
1af20 61 73 73 65 72 74 28 20 49 73 55 6e 69 71 75 65  assert( IsUnique
1af30 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29 3b  Index(pIndex) );
1af40 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ..      if( pIdx
1af50 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65  ->nKeyCol!=pInde
1af60 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e  x->nKeyCol ) con
1af70 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
1af80 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b  (k=0; k<pIdx->nK
1af90 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20  eyCol; k++){.   
1afa0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1afb0 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  *z1;.        con
1afc0 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20  st char *z2;.   
1afd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
1afe0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d  x->aiColumn[k]>=
1aff0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
1b000 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
1b010 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f  k]!=pIndex->aiCo
1b020 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b  lumn[k] ) break;
1b030 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49  .        z1 = pI
1b040 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20  dx->azColl[k];. 
1b050 20 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64         z2 = pInd
1b060 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20  ex->azColl[k];. 
1b070 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1b080 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32  e3StrICmp(z1, z2
1b090 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
1b0a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d   }.      if( k==
1b0b0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b  pIdx->nKeyCol ){
1b0c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
1b0d0 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64  x->onError!=pInd
1b0e0 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20  ex->onError ){. 
1b0f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
1b100 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61   constraint crea
1b110 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64  tes the same ind
1b120 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73  ex as a previous
1b130 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
1b140 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69  nstraint specifi
1b150 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20  ed somewhere in 
1b160 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
1b170 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
1b180 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72        ** However
1b190 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   the ON CONFLICT
1b1a0 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66   clauses are dif
1b1b0 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20  ferent. If both 
1b1c0 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20  this .          
1b1d0 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  ** constraint an
1b1e0 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  d the previous e
1b1f0 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72  quivalent constr
1b200 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63  aint have explic
1b210 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  it.          ** 
1b220 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
1b230 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65  ses this is an e
1b240 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c  rror. Otherwise,
1b250 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20   use the.       
1b260 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79     ** explicitly
1b270 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76   specified behav
1b280 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ior for the inde
1b290 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  x..          */.
1b2a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28            if( !(
1b2b0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
1b2c0 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e  E_Default || pIn
1b2d0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
1b2e0 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20  _Default) ){.   
1b2f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b300 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1b310 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1b320 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f    "conflicting O
1b330 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
1b340 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30  es specified", 0
1b350 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1b360 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
1b370 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
1b380 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
1b390 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72        pIdx->onEr
1b3a0 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e  ror = pIndex->on
1b3b0 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Error;.         
1b3c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1b3d0 20 20 20 20 20 69 66 28 20 69 64 78 54 79 70 65       if( idxType
1b3e0 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  ==SQLITE_IDXTYPE
1b3f0 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 20 70 49  _PRIMARYKEY ) pI
1b400 64 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 69 64  dx->idxType = id
1b410 78 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 67  xType;.        g
1b420 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1b430 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
1b440 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c     }.  }..  /* L
1b450 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65  ink the new Inde
1b460 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  x structure to i
1b470 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20  ts table and to 
1b480 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69  the other.  ** i
1b490 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1b4a0 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20  e structures. . 
1b4b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1b4c0 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
1b4d0 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
1b4e0 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65  busy ){.    Inde
1b4f0 78 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74  x *p;.    assert
1b500 28 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  ( !IN_DECLARE_VT
1b510 41 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  AB );.    assert
1b520 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
1b530 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
1b540 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
1b550 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   );.    p = sqli
1b560 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
1b570 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e  Index->pSchema->
1b580 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20  idxHash, .      
1b590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5a0 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
1b5b0 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  e, pIndex);.    
1b5c0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61  if( p ){.      a
1b5d0 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78  ssert( p==pIndex
1b5e0 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
1b5f0 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
1b600 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1b610 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
1b620 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1b630 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1b640 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  }.    db->flags 
1b650 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
1b660 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28  Changes;.    if(
1b670 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
1b680 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e        pIndex->tn
1b690 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
1b6a0 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  wTnum;.    }.  }
1b6b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1b6c0 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 43 52  s the initial CR
1b6d0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1b6e0 6d 65 6e 74 20 28 6f 72 20 43 52 45 41 54 45 20  ment (or CREATE 
1b6f0 54 41 42 4c 45 20 69 66 20 74 68 65 0a 20 20 2a  TABLE if the.  *
1b700 2a 20 69 6e 64 65 78 20 69 73 20 61 6e 20 69 6d  * index is an im
1b710 70 6c 69 65 64 20 69 6e 64 65 78 20 66 6f 72 20  plied index for 
1b720 61 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d  a UNIQUE or PRIM
1b730 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
1b740 6e 74 29 20 74 68 65 6e 0a 20 20 2a 2a 20 65 6d  nt) then.  ** em
1b750 69 74 20 63 6f 64 65 20 74 6f 20 61 6c 6c 6f 63  it code to alloc
1b760 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 72 6f  ate the index ro
1b770 6f 74 70 61 67 65 20 6f 6e 20 64 69 73 6b 20 61  otpage on disk a
1b780 6e 64 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72 79  nd make an entry
1b790 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 69 6e   for.  ** the in
1b7a0 64 65 78 20 69 6e 20 74 68 65 20 73 71 6c 69 74  dex in the sqlit
1b7b0 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
1b7c0 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  nd populate the 
1b7d0 69 6e 64 65 78 20 77 69 74 68 0a 20 20 2a 2a 20  index with.  ** 
1b7e0 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 2c 20 64  content.  But, d
1b7f0 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 69 66  o not do this if
1b800 20 77 65 20 61 72 65 20 73 69 6d 70 6c 79 20 72   we are simply r
1b810 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74  eading the sqlit
1b820 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61  e_master.  ** ta
1b830 62 6c 65 20 74 6f 20 70 61 72 73 65 20 74 68 65  ble to parse the
1b840 20 73 63 68 65 6d 61 2c 20 6f 72 20 69 66 20 74   schema, or if t
1b850 68 69 73 20 69 6e 64 65 78 20 69 73 20 74 68 65  his index is the
1b860 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
1b870 65 78 0a 20 20 2a 2a 20 6f 66 20 61 20 57 49 54  ex.  ** of a WIT
1b880 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
1b890 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
1b8a0 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  TblName==0 it me
1b8b0 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69  ans this index i
1b8c0 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61  s generated as a
1b8d0 6e 20 69 6d 70 6c 69 65 64 20 50 52 49 4d 41 52  n implied PRIMAR
1b8e0 59 20 4b 45 59 0a 20 20 2a 2a 20 6f 72 20 55 4e  Y KEY.  ** or UN
1b8f0 49 51 55 45 20 69 6e 64 65 78 20 69 6e 20 61 20  IQUE index in a 
1b900 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
1b910 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74  tement.  Since t
1b920 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61  he table.  ** ha
1b930 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61  s just been crea
1b940 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ted, it contains
1b950 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65   no data and the
1b960 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a   index initializ
1b970 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20  ation.  ** step 
1b980 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a  can be skipped..
1b990 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20    */.  else if( 
1b9a0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c  HasRowid(pTab) |
1b9b0 7c 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  | pTblName!=0 ){
1b9c0 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
1b9d0 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
1b9e0 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b     int iMem = ++
1b9f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20  pParse->nMem;.. 
1ba00 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
1ba10 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1ba20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
1ba30 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1ba40 6e 64 65 78 3b 0a 0a 20 20 20 20 73 71 6c 69 74  ndex;..    sqlit
1ba50 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
1ba60 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
1ba70 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 43   iDb);..    /* C
1ba80 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61  reate the rootpa
1ba90 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ge for the index
1baa0 20 75 73 69 6e 67 20 43 72 65 61 74 65 49 6e 64   using CreateInd
1bab0 65 78 2e 20 42 75 74 20 62 65 66 6f 72 65 0a 20  ex. But before. 
1bac0 20 20 20 2a 2a 20 64 6f 69 6e 67 20 73 6f 2c 20     ** doing so, 
1bad0 63 6f 64 65 20 61 20 4e 6f 6f 70 20 69 6e 73 74  code a Noop inst
1bae0 72 75 63 74 69 6f 6e 20 61 6e 64 20 73 74 6f 72  ruction and stor
1baf0 65 20 69 74 73 20 61 64 64 72 65 73 73 20 69 6e  e its address in
1bb00 20 0a 20 20 20 20 2a 2a 20 49 6e 64 65 78 2e 74   .    ** Index.t
1bb10 6e 75 6d 2e 20 54 68 69 73 20 69 73 20 72 65 71  num. This is req
1bb20 75 69 72 65 64 20 69 6e 20 63 61 73 65 20 74 68  uired in case th
1bb30 69 73 20 69 6e 64 65 78 20 69 73 20 61 63 74 75  is index is actu
1bb40 61 6c 6c 79 20 61 20 0a 20 20 20 20 2a 2a 20 50  ally a .    ** P
1bb50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 74  RIMARY KEY and t
1bb60 68 65 20 74 61 62 6c 65 20 69 73 20 61 63 74 75  he table is actu
1bb70 61 6c 6c 79 20 61 20 57 49 54 48 4f 55 54 20 52  ally a WITHOUT R
1bb80 4f 57 49 44 20 74 61 62 6c 65 2e 20 49 6e 20 0a  OWID table. In .
1bb90 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65      ** that case
1bba0 20 74 68 65 20 63 6f 6e 76 65 72 74 54 6f 57 69   the convertToWi
1bbb0 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28  thoutRowidTable(
1bbc0 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  ) routine will r
1bbd0 65 70 6c 61 63 65 0a 20 20 20 20 2a 2a 20 74 68  eplace.    ** th
1bbe0 65 20 4e 6f 6f 70 20 77 69 74 68 20 61 20 47 6f  e Noop with a Go
1bbf0 74 6f 20 74 6f 20 6a 75 6d 70 20 6f 76 65 72 20  to to jump over 
1bc00 74 68 65 20 56 44 42 45 20 63 6f 64 65 20 67 65  the VDBE code ge
1bc10 6e 65 72 61 74 65 64 20 62 65 6c 6f 77 2e 20 2a  nerated below. *
1bc20 2f 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e  /.    pIndex->tn
1bc30 75 6d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  um = sqlite3Vdbe
1bc40 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f  AddOp0(v, OP_Noo
1bc50 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  p);.    sqlite3V
1bc60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1bc70 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62  CreateIndex, iDb
1bc80 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  , iMem);..    /*
1bc90 20 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70   Gather the comp
1bca0 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
1bcb0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
1bcc0 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20  atement into.   
1bcd0 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61   ** the zStmt va
1bce0 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20  riable.    */.  
1bcf0 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a    if( pStart ){.
1bd00 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69        int n = (i
1bd10 6e 74 29 28 70 50 61 72 73 65 2d 3e 73 4c 61 73  nt)(pParse->sLas
1bd20 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65  tToken.z - pName
1bd30 2d 3e 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e 73  ->z) + pParse->s
1bd40 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20  LastToken.n;.   
1bd50 20 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b     if( pName->z[
1bd60 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b  n-1]==';' ) n--;
1bd70 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65  .      /* A name
1bd80 64 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20  d index with an 
1bd90 65 78 70 6c 69 63 69 74 20 43 52 45 41 54 45 20  explicit CREATE 
1bda0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
1bdb0 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  */.      zStmt =
1bdc0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1bdd0 64 62 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e  db, "CREATE%s IN
1bde0 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20  DEX %.*s",.     
1bdf0 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e     onError==OE_N
1be00 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49  one ? "" : " UNI
1be10 51 55 45 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e  QUE", n, pName->
1be20 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  z);.    }else{. 
1be30 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d       /* An autom
1be40 61 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74  atic index creat
1be50 65 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20  ed by a PRIMARY 
1be60 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  KEY or UNIQUE co
1be70 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
1be80 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c    /* zStmt = sql
1be90 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b  ite3MPrintf("");
1bea0 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   */.      zStmt 
1beb0 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
1bec0 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20  /* Add an entry 
1bed0 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  in sqlite_master
1bee0 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a   for this index.
1bef0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
1bf00 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
1bf10 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22  arse, .        "
1bf20 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25  INSERT INTO %Q.%
1bf30 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27  s VALUES('index'
1bf40 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22  ,%Q,%Q,#%d,%Q);"
1bf50 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ,.        db->aD
1bf60 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c  b[iDb].zDbSName,
1bf70 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20   MASTER_NAME,.  
1bf80 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
1bf90 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61  ame,.        pTa
1bfa0 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
1bfb0 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20    iMem,.        
1bfc0 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20  zStmt.    );.   
1bfd0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1bfe0 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20  b, zStmt);..    
1bff0 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65  /* Fill the inde
1c000 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20  x with data and 
1c010 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65  reparse the sche
1c020 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45  ma. Code an OP_E
1c030 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20  xpire.    ** to 
1c040 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70  invalidate all p
1c050 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  re-compiled stat
1c060 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  ements..    */. 
1c070 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20     if( pTblName 
1c080 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1c090 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
1c0a0 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d  se, pIndex, iMem
1c0b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c0c0 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
1c0d0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
1c0e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
1c0f0 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20  arseSchemaOp(v, 
1c100 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 73 71  iDb,.         sq
1c110 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1c120 20 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20   "name='%q' AND 
1c130 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 70  type='index'", p
1c140 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Index->zName));.
1c150 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c160 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 45 78  eAddOp0(v, OP_Ex
1c170 70 69 72 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  pire);.    }..  
1c180 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1c190 70 48 65 72 65 28 76 2c 20 70 49 6e 64 65 78 2d  pHere(v, pIndex-
1c1a0 3e 74 6e 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f  >tnum);.  }..  /
1c1b0 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e  * When adding an
1c1c0 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69   index to the li
1c1d0 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f  st of indices fo
1c1e0 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a  r a table, make.
1c1f0 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e    ** sure all in
1c200 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45  dices labeled OE
1c210 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66  _Replace come af
1c220 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61  ter all those la
1c230 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67  beled.  ** OE_Ig
1c240 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e  nore.  This is n
1c250 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65  ecessary for the
1c260 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74 72 61   correct constra
1c270 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70  int check.  ** p
1c280 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20 73 71  rocessing (in sq
1c290 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e  lite3GenerateCon
1c2a0 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 29 29  straintChecks())
1c2b0 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a   as part of.  **
1c2c0 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e 53 45   UPDATE and INSE
1c2d0 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  RT statements.  
1c2e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
1c2f0 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62  init.busy || pTb
1c300 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  lName==0 ){.    
1c310 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  if( onError!=OE_
1c320 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d  Replace || pTab-
1c330 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20  >pIndex==0.     
1c340 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e      || pTab->pIn
1c350 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
1c360 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20  _Replace){.     
1c370 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
1c380 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
1c390 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65       pTab->pInde
1c3a0 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  x = pIndex;.    
1c3b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
1c3c0 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61  ex *pOther = pTa
1c3d0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
1c3e0 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e   while( pOther->
1c3f0 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d  pNext && pOther-
1c400 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21  >pNext->onError!
1c410 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20  =OE_Replace ){. 
1c420 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20         pOther = 
1c430 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
1c440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
1c450 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74  dex->pNext = pOt
1c460 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
1c470 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20    pOther->pNext 
1c480 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  = pIndex;.    }.
1c490 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
1c4a0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20    }..  /* Clean 
1c4b0 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  up before exitin
1c4c0 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65  g */.exit_create
1c4d0 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49  _index:.  if( pI
1c4e0 6e 64 65 78 20 29 20 66 72 65 65 49 6e 64 65 78  ndex ) freeIndex
1c4f0 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
1c500 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1c510 65 28 64 62 2c 20 70 50 49 57 68 65 72 65 29 3b  e(db, pPIWhere);
1c520 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
1c530 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
1c540 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72  st);.  sqlite3Sr
1c550 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
1c560 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  pTblName);.  sql
1c570 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1c580 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
1c590 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61  Fill the Index.a
1c5a0 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20  iRowEst[] array 
1c5b0 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66  with default inf
1c5c0 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72  ormation - infor
1c5d0 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20  mation.** to be 
1c5e0 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 61 76  used when we hav
1c5f0 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e  e not run the AN
1c600 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  ALYZE command..*
1c610 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d  *.** aiRowEst[0]
1c620 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20   is supposed to 
1c630 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62  contain the numb
1c640 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
1c650 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20  n the index..** 
1c660 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20  Since we do not 
1c670 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69  know, guess 1 mi
1c680 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74  llion.  aiRowEst
1c690 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61  [1] is an estima
1c6a0 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d  te of the.** num
1c6b0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1c6c0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61  he table that ma
1c6d0 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c  tch any particul
1c6e0 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  ar value of the.
1c6f0 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20  ** first column 
1c700 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61  of the index.  a
1c710 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e  iRowEst[2] is an
1c720 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
1c730 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f   number.** of ro
1c740 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e  ws that match an
1c750 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d  y particular com
1c760 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  bination of the 
1c770 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a  first 2 columns.
1c780 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ** of the index.
1c790 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20    And so forth. 
1c7a0 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20   It must always 
1c7b0 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
1c7c0 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .*.**           
1c7d0 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52  aiRowEst[N]<=aiR
1c7e0 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20  owEst[N-1].**   
1c7f0 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74          aiRowEst
1c800 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61  [N]>=1.**.** Apa
1c810 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65  rt from that, we
1c820 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20   have little to 
1c830 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e  go on besides in
1c840 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a  tuition as to.**
1c850 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20   how aiRowEst[] 
1c860 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61  should be initia
1c870 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62  lized.  The numb
1c880 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68 65  ers generated he
1c890 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20  re.** are based 
1c8a0 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65  on typical value
1c8b0 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61  s found in actua
1c8c0 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f  l indices..*/.vo
1c8d0 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c  id sqlite3Defaul
1c8e0 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70  tRowEst(Index *p
1c8f0 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20 20 20 20  Idx){.  /*      
1c900 20 20 20 20 20 20 20 20 20 20 31 30 2c 20 20 39            10,  9
1c910 2c 20 20 38 2c 20 20 37 2c 20 20 36 20 2a 2f 0a  ,  8,  7,  6 */.
1c920 20 20 4c 6f 67 45 73 74 20 61 56 61 6c 5b 5d 20    LogEst aVal[] 
1c930 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33 30 2c 20  = { 33, 32, 30, 
1c940 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f 67 45  28, 26 };.  LogE
1c950 73 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69  st *a = pIdx->ai
1c960 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 6e 74  RowLogEst;.  int
1c970 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 41 72 72   nCopy = MIN(Arr
1c980 61 79 53 69 7a 65 28 61 56 61 6c 29 2c 20 70 49  aySize(aVal), pI
1c990 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20  dx->nKeyCol);.  
1c9a0 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 6e 64  int i;..  /* Ind
1c9b0 65 78 65 73 20 77 69 74 68 20 64 65 66 61 75 6c  exes with defaul
1c9c0 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 73 20  t row estimates 
1c9d0 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20  should not have 
1c9e0 73 74 61 74 31 20 64 61 74 61 20 2a 2f 0a 20 20  stat1 data */.  
1c9f0 61 73 73 65 72 74 28 20 21 70 49 64 78 2d 3e 68  assert( !pIdx->h
1ca00 61 73 53 74 61 74 31 20 29 3b 0a 0a 20 20 2f 2a  asStat1 );..  /*
1ca10 20 53 65 74 20 74 68 65 20 66 69 72 73 74 20 65   Set the first e
1ca20 6e 74 72 79 20 28 6e 75 6d 62 65 72 20 6f 66 20  ntry (number of 
1ca30 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65  rows in the inde
1ca40 78 29 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61  x) to the estima
1ca50 74 65 64 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  ted .  ** number
1ca60 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1ca70 74 61 62 6c 65 2c 20 6f 72 20 68 61 6c 66 20 74  table, or half t
1ca80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
1ca90 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 0a 20  s in the table. 
1caa0 20 2a 2a 20 66 6f 72 20 61 20 70 61 72 74 69 61   ** for a partia
1cab0 6c 20 69 6e 64 65 78 2e 20 20 20 42 75 74 20 64  l index.   But d
1cac0 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 65 73  o not let the es
1cad0 74 69 6d 61 74 65 20 64 72 6f 70 20 62 65 6c 6f  timate drop belo
1cae0 77 20 31 30 2e 20 2a 2f 0a 20 20 61 5b 30 5d 20  w 10. */.  a[0] 
1caf0 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1cb00 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 66  nRowLogEst;.  if
1cb10 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78  ( pIdx->pPartIdx
1cb20 57 68 65 72 65 21 3d 30 20 29 20 61 5b 30 5d 20  Where!=0 ) a[0] 
1cb30 2d 3d 20 31 30 3b 20 20 61 73 73 65 72 74 28 20  -= 10;  assert( 
1cb40 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  10==sqlite3LogEs
1cb50 74 28 32 29 20 29 3b 0a 20 20 69 66 28 20 61 5b  t(2) );.  if( a[
1cb60 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20 3d 20 33  0]<33 ) a[0] = 3
1cb70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3;              
1cb80 20 20 20 20 61 73 73 65 72 74 28 20 33 33 3d 3d      assert( 33==
1cb90 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
1cba0 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 73 74 69 6d  ) );..  /* Estim
1cbb0 61 74 65 20 74 68 61 74 20 61 5b 31 5d 20 69 73  ate that a[1] is
1cbc0 20 31 30 2c 20 61 5b 32 5d 20 69 73 20 39 2c 20   10, a[2] is 9, 
1cbd0 61 5b 33 5d 20 69 73 20 38 2c 20 61 5b 34 5d 20  a[3] is 8, a[4] 
1cbe0 69 73 20 37 2c 20 61 5b 35 5d 20 69 73 0a 20 20  is 7, a[5] is.  
1cbf0 2a 2a 20 36 20 61 6e 64 20 65 61 63 68 20 73 75  ** 6 and each su
1cc00 62 73 65 71 75 65 6e 74 20 76 61 6c 75 65 20 28  bsequent value (
1cc10 69 66 20 61 6e 79 29 20 69 73 20 35 2e 20 20 2a  if any) is 5.  *
1cc20 2f 0a 20 20 6d 65 6d 63 70 79 28 26 61 5b 31 5d  /.  memcpy(&a[1]
1cc30 2c 20 61 56 61 6c 2c 20 6e 43 6f 70 79 2a 73 69  , aVal, nCopy*si
1cc40 7a 65 6f 66 28 4c 6f 67 45 73 74 29 29 3b 0a 20  zeof(LogEst));. 
1cc50 20 66 6f 72 28 69 3d 6e 43 6f 70 79 2b 31 3b 20   for(i=nCopy+1; 
1cc60 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  i<=pIdx->nKeyCol
1cc70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 5b 69 5d  ; i++){.    a[i]
1cc80 20 3d 20 32 33 3b 20 20 20 20 20 20 20 20 20 20   = 23;          
1cc90 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1cca0 28 20 32 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 23==sqlite3Log
1ccb0 45 73 74 28 35 29 20 29 3b 0a 20 20 7d 0a 0a 20  Est(5) );.  }.. 
1ccc0 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69   assert( 0==sqli
1ccd0 74 65 33 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a  te3LogEst(1) );.
1cce0 20 20 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e    if( IsUniqueIn
1ccf0 64 65 78 28 70 49 64 78 29 20 29 20 61 5b 70 49  dex(pIdx) ) a[pI
1cd00 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20 3d 20 30  dx->nKeyCol] = 0
1cd10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1cd20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f  routine will dro
1cd30 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61  p an existing na
1cd40 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73  med index.  This
1cd50 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c   routine.** impl
1cd60 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20  ements the DROP 
1cd70 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e  INDEX statement.
1cd80 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1cd90 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20  DropIndex(Parse 
1cda0 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
1cdb0 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45   *pName, int ifE
1cdc0 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20  xists){.  Index 
1cdd0 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20  *pIndex;.  Vdbe 
1cde0 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
1cdf0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1ce00 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73    int iDb;..  as
1ce10 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
1ce20 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65  rr==0 );   /* Ne
1ce30 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ver called with 
1ce40 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a  prior errors */.
1ce50 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1ce60 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
1ce70 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1ce80 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ex;.  }.  assert
1ce90 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
1cea0 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   );.  if( SQLITE
1ceb0 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
1cec0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
1ced0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
1cee0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
1cef0 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
1cf00 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
1cf10 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
1cf20 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
1cf30 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
1cf40 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20   pIndex==0 ){.  
1cf50 20 20 69 66 28 20 21 69 66 45 78 69 73 74 73 20    if( !ifExists 
1cf60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1cf70 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1cf80 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
1cf90 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b   %S", pName, 0);
1cfa0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cfb0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
1cfc0 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70  ifyNamedSchema(p
1cfd0 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  Parse, pName->a[
1cfe0 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
1cff0 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
1d000 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
1d010 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
1d020 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
1d030 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 64    if( pIndex->id
1d040 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44  xType!=SQLITE_ID
1d050 58 54 59 50 45 5f 41 50 50 44 45 46 20 29 7b 0a  XTYPE_APPDEF ){.
1d060 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1d070 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
1d080 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
1d090 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20  th UNIQUE ".    
1d0a0 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45    "or PRIMARY KE
1d0b0 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Y constraint can
1d0c0 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
1d0d0 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78   0);.    goto ex
1d0e0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1d0f0 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
1d100 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
1d110 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  db, pIndex->pSch
1d120 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ema);.#ifndef SQ
1d130 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
1d140 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
1d150 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  int code = SQLIT
1d160 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20  E_DROP_INDEX;.  
1d170 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
1d180 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a  pIndex->pTable;.
1d190 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1d1a0 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
1d1b0 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b].zDbSName;.   
1d1c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1d1d0 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
1d1e0 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73  (iDb);.    if( s
1d1f0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1d200 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
1d210 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
1d220 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
1d230 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1d240 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
1d250 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
1d260 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53  & iDb ) code = S
1d270 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
1d280 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
1d290 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1d2a0 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49  pParse, code, pI
1d2b0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61  ndex->zName, pTa
1d2c0 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
1d2d0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
1d2e0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1d2f0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1d300 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1d310 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
1d320 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20   index and from 
1d330 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
1d340 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
1d350 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1d360 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
1d370 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1d380 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1d390 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20  se, 1, iDb);.   
1d3a0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
1d3b0 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
1d3c0 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
1d3d0 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65  %Q.%s WHERE name
1d3e0 3d 25 51 20 41 4e 44 20 74 79 70 65 3d 27 69 6e  =%Q AND type='in
1d3f0 64 65 78 27 22 2c 0a 20 20 20 20 20 20 20 64 62  dex'",.       db
1d400 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
1d410 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45  ame, MASTER_NAME
1d420 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a  , pIndex->zName.
1d430 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
1d440 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65  e3ClearStatTable
1d450 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  s(pParse, iDb, "
1d460 69 64 78 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  idx", pIndex->zN
1d470 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
1d480 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
1d490 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
1d4a0 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
1d4b0 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e  pParse, pIndex->
1d4c0 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
1d4d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d4e0 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65  4(v, OP_DropInde
1d4f0 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 49  x, iDb, 0, 0, pI
1d500 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
1d510 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  .  }..exit_drop_
1d520 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33  index:.  sqlite3
1d530 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
1d540 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , pName);.}../*.
1d550 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61 20 70  ** pArray is a p
1d560 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72  ointer to an arr
1d570 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45  ay of objects. E
1d580 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  ach object in th
1d590 65 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73 7a  e.** array is sz
1d5a0 45 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20 73  Entry bytes in s
1d5b0 69 7a 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ize. This routin
1d5c0 65 20 75 73 65 73 20 73 71 6c 69 74 65 33 44 62  e uses sqlite3Db
1d5d0 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20  Realloc().** to 
1d5e0 65 78 74 65 6e 64 20 74 68 65 20 61 72 72 61 79  extend the array
1d5f0 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69   so that there i
1d600 73 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65  s space for a ne
1d610 77 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20  w object at the 
1d620 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  end..**.** When 
1d630 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1d640 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72   called, *pnEntr
1d650 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63  y contains the c
1d660 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a  urrent size of.*
1d670 2a 20 74 68 65 20 61 72 72 61 79 20 28 69 6e 20  * the array (in 
1d680 65 6e 74 72 69 65 73 20 2d 20 73 6f 20 74 68 65  entries - so the
1d690 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28   allocation is (
1d6a0 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45  (*pnEntry) * szE
1d6b0 6e 74 72 79 29 20 62 79 74 65 73 0a 2a 2a 20 69  ntry) bytes.** i
1d6c0 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  n total)..**.** 
1d6d0 49 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29  If the realloc()
1d6e0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 20 28   is successful (
1d6f0 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63  i.e. if no OOM c
1d700 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72 73 29  ondition occurs)
1d710 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61  , the.** space a
1d720 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
1d730 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20 7a   new object is z
1d740 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20  eroed, *pnEntry 
1d750 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65  updated to.** re
1d760 66 6c 65 63 74 20 74 68 65 20 6e 65 77 20 73 69  flect the new si
1d770 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  ze of the array 
1d780 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  and a pointer to
1d790 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74   the new allocat
1d7a0 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  ion.** returned.
1d7b0 20 2a 70 49 64 78 20 69 73 20 73 65 74 20 74 6f   *pIdx is set to
1d7c0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
1d7d0 65 20 6e 65 77 20 61 72 72 61 79 20 65 6e 74 72  e new array entr
1d7e0 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
1d7f0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1d800 20 69 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28   if the realloc(
1d810 29 20 66 61 69 6c 73 2c 20 2a 70 49 64 78 20 69  ) fails, *pIdx i
1d820 73 20 73 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e  s set to -1, *pn
1d830 45 6e 74 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a  Entry remains.**
1d840 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61   unchanged and a
1d850 20 63 6f 70 79 20 6f 66 20 70 41 72 72 61 79 20   copy of pArray 
1d860 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69  returned..*/.voi
1d870 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41  d *sqlite3ArrayA
1d880 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74  llocate(.  sqlit
1d890 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20  e3 *db,      /* 
1d8a0 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  Connection to no
1d8b0 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66  tify of malloc f
1d8c0 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69  ailures */.  voi
1d8d0 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f  d *pArray,     /
1d8e0 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63  * Array of objec
1d8f0 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65  ts.  Might be re
1d900 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69  allocated */.  i
1d910 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20  nt szEntry,     
1d920 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68   /* Size of each
1d930 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61   object in the a
1d940 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  rray */.  int *p
1d950 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e  nEntry,     /* N
1d960 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
1d970 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
1d980 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78  e */.  int *pIdx
1d990 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1d9a0 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  e the index of a
1d9b0 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20 2a   new slot here *
1d9c0 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  /.){.  char *z;.
1d9d0 20 20 69 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e 74    int n = *pnEnt
1d9e0 72 79 3b 0a 20 20 69 66 28 20 28 6e 20 26 20 28  ry;.  if( (n & (
1d9f0 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  n-1))==0 ){.    
1da00 69 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20  int sz = (n==0) 
1da10 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76  ? 1 : 2*n;.    v
1da20 6f 69 64 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  oid *pNew = sqli
1da30 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
1da40 20 70 41 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e   pArray, sz*szEn
1da50 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  try);.    if( pN
1da60 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  ew==0 ){.      *
1da70 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pIdx = -1;.     
1da80 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a   return pArray;.
1da90 20 20 20 20 7d 0a 20 20 20 20 70 41 72 72 61 79      }.    pArray
1daa0 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a   = pNew;.  }.  z
1dab0 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61 79   = (char*)pArray
1dac0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20  ;.  memset(&z[n 
1dad0 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73  * szEntry], 0, s
1dae0 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64 78  zEntry);.  *pIdx
1daf0 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74   = n;.  ++*pnEnt
1db00 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72  ry;.  return pAr
1db10 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  ray;.}../*.** Ap
1db20 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65  pend a new eleme
1db30 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  nt to the given 
1db40 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  IdList.  Create 
1db50 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a  a new IdList if.
1db60 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a  ** need be..**.*
1db70 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69  * A new IdList i
1db80 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
1db90 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  ULL if malloc() 
1dba0 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74  fails..*/.IdList
1dbb0 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41   *sqlite3IdListA
1dbc0 70 70 65 6e 64 28 73 71 6c 69 74 65 33 20 2a 64  ppend(sqlite3 *d
1dbd0 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  b, IdList *pList
1dbe0 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
1dbf0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1dc00 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
1dc10 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1dc20 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
1dc30 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20   sizeof(IdList) 
1dc40 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
1dc50 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1dc60 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d    }.  pList->a =
1dc70 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
1dc80 6f 63 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c  ocate(.      db,
1dc90 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c  .      pList->a,
1dca0 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c  .      sizeof(pL
1dcb0 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20  ist->a[0]),.    
1dcc0 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20    &pList->nId,. 
1dcd0 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 69       &i.  );.  i
1dce0 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71  f( i<0 ){.    sq
1dcf0 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
1dd00 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
1dd10 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1dd20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e    pList->a[i].zN
1dd30 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
1dd40 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
1dd50 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e  Token);.  return
1dd60 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
1dd70 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73   Delete an IdLis
1dd80 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1dd90 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 73  e3IdListDelete(s
1dda0 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69  qlite3 *db, IdLi
1ddb0 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
1ddc0 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
1ddd0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1dde0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
1ddf0 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
1de00 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1de10 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  b, pList->a[i].z
1de20 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
1de30 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1de40 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
1de50 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
1de60 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
1de70 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
1de80 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68  x in pList of th
1de90 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d  e identifier nam
1dea0 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20  ed zId.  Return 
1deb0 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75  -1.** if not fou
1dec0 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
1ded0 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64  e3IdListIndex(Id
1dee0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e  List *pList, con
1def0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
1df00 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1df10 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1df20 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  n -1;.  for(i=0;
1df30 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
1df40 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
1df50 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
1df60 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  t->a[i].zName, z
1df70 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
1df80 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
1df90 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n -1;.}../*.** E
1dfa0 78 70 61 6e 64 20 74 68 65 20 73 70 61 63 65 20  xpand the space 
1dfb0 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
1dfc0 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 20  e given SrcList 
1dfd0 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72 65  object by.** cre
1dfe0 61 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65 77  ating nExtra new
1dff0 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67   slots beginning
1e000 20 61 74 20 69 53 74 61 72 74 2e 20 20 69 53 74   at iStart.  iSt
1e010 61 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73 65  art is zero base
1e020 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20  d..** New slots 
1e030 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a  are zeroed..**.*
1e040 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73  * For example, s
1e050 75 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73 74  uppose a SrcList
1e060 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61   initially conta
1e070 69 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73 3a  ins two entries:
1e080 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65   A,B..** To appe
1e090 6e 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65 73  nd 3 new entries
1e0a0 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20 64   onto the end, d
1e0b0 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  o this:.**.**   
1e0c0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
1e0d0 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 6c  nlarge(db, pSrcl
1e0e0 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a  ist, 3, 2);.**.*
1e0f0 2a 20 41 66 74 65 72 20 74 68 65 20 63 61 6c 6c  * After the call
1e100 20 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64 20   above it would 
1e110 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20  contain:  A, B, 
1e120 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a  nil, nil, nil..*
1e130 2a 20 49 66 20 74 68 65 20 69 53 74 61 72 74 20  * If the iStart 
1e140 61 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65 65  argument had bee
1e150 6e 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20 32  n 1 instead of 2
1e160 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
1e170 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20  t.** would have 
1e180 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e  been:  A, nil, n
1e190 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20  il, nil, B.  To 
1e1a0 70 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77 20  prepend the new 
1e1b0 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53  slots,.** the iS
1e1c0 74 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c 64  tart value would
1e1d0 20 62 65 20 30 2e 20 20 54 68 65 20 72 65 73 75   be 0.  The resu
1e1e0 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a  lt then would.**
1e1f0 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e   be: nil, nil, n
1e200 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20  il, A, B..**.** 
1e210 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
1e220 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 74 68 65  cation fails the
1e230 20 53 72 63 4c 69 73 74 20 69 73 20 75 6e 63 68   SrcList is unch
1e240 61 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a 20 64  anged.  The.** d
1e250 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1e260 66 6c 61 67 20 77 69 6c 6c 20 62 65 20 73 65 74  flag will be set
1e270 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53 72 63   to true..*/.Src
1e280 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
1e290 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20 73  ListEnlarge(.  s
1e2a0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1e2b0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
1e2c0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
1e2d0 66 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f 72 73  fy of OOM errors
1e2e0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1e2f0 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  Src,     /* The 
1e300 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20 65 6e  SrcList to be en
1e310 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20  larged */.  int 
1e320 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 2f  nExtra,        /
1e330 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77 20  * Number of new 
1e340 73 6c 6f 74 73 20 74 6f 20 61 64 64 20 74 6f 20  slots to add to 
1e350 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69  pSrc->a[] */.  i
1e360 6e 74 20 69 53 74 61 72 74 20 20 20 20 20 20 20  nt iStart       
1e370 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 53    /* Index in pS
1e380 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74  rc->a[] of first
1e390 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a   new slot */.){.
1e3a0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53    int i;..  /* S
1e3b0 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
1e3c0 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65  n calling parame
1e3d0 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ters */.  assert
1e3e0 28 20 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20  ( iStart>=0 );. 
1e3f0 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e   assert( nExtra>
1e400 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
1e410 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 61 73 73  pSrc!=0 );.  ass
1e420 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70 53 72  ert( iStart<=pSr
1e430 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a  c->nSrc );..  /*
1e440 20 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74 69   Allocate additi
1e450 6f 6e 61 6c 20 73 70 61 63 65 20 69 66 20 6e 65  onal space if ne
1e460 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 28 75  eded */.  if( (u
1e470 33 32 29 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45  32)pSrc->nSrc+nE
1e480 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f  xtra>pSrc->nAllo
1e490 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  c ){.    SrcList
1e4a0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20   *pNew;.    int 
1e4b0 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d 3e 6e  nAlloc = pSrc->n
1e4c0 53 72 63 2a 32 2b 6e 45 78 74 72 61 3b 0a 20 20  Src*2+nExtra;.  
1e4d0 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20    int nGot;.    
1e4e0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
1e4f0 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63  Realloc(db, pSrc
1e500 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e510 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b   sizeof(*pSrc) +
1e520 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65   (nAlloc-1)*size
1e530 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29  of(pSrc->a[0]) )
1e540 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
1e550 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
1e560 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
1e570 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
1e580 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a  urn pSrc;.    }.
1e590 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77 3b      pSrc = pNew;
1e5a0 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c  .    nGot = (sql
1e5b0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65  ite3DbMallocSize
1e5c0 28 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a  (db, pNew) - siz
1e5d0 65 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a 65  eof(*pSrc))/size
1e5e0 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31  of(pSrc->a[0])+1
1e5f0 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c  ;.    pSrc->nAll
1e600 6f 63 20 3d 20 6e 47 6f 74 3b 0a 20 20 7d 0a 0a  oc = nGot;.  }..
1e610 20 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74 69    /* Move existi
1e620 6e 67 20 73 6c 6f 74 73 20 74 68 61 74 20 63 6f  ng slots that co
1e630 6d 65 20 61 66 74 65 72 20 74 68 65 20 6e 65 77  me after the new
1e640 6c 79 20 69 6e 73 65 72 74 65 64 20 73 6c 6f 74  ly inserted slot
1e650 73 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68  s.  ** out of th
1e660 65 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69  e way */.  for(i
1e670 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69  =pSrc->nSrc-1; i
1e680 3e 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a  >=iStart; i--){.
1e690 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45      pSrc->a[i+nE
1e6a0 78 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b  xtra] = pSrc->a[
1e6b0 69 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e  i];.  }.  pSrc->
1e6c0 6e 53 72 63 20 2b 3d 20 6e 45 78 74 72 61 3b 0a  nSrc += nExtra;.
1e6d0 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e  .  /* Zero the n
1e6e0 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73  ewly allocated s
1e6f0 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  lots */.  memset
1e700 28 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74  (&pSrc->a[iStart
1e710 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 72  ], 0, sizeof(pSr
1e720 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29  c->a[0])*nExtra)
1e730 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74  ;.  for(i=iStart
1e740 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74 72  ; i<iStart+nExtr
1e750 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72  a; i++){.    pSr
1e760 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20  c->a[i].iCursor 
1e770 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
1e780 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1e790 20 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65 64   to the enlarged
1e7a0 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65   SrcList */.  re
1e7b0 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f  turn pSrc;.}.../
1e7c0 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
1e7d0 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  w table name to 
1e7e0 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73  the given SrcLis
1e7f0 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
1e800 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e   SrcList if.** n
1e810 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65  eed be.  A new e
1e820 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20  ntry is created 
1e830 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65  in the SrcList e
1e840 76 65 6e 20 69 66 20 70 54 61 62 6c 65 20 69 73  ven if pTable is
1e850 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53   NULL..**.** A S
1e860 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  rcList is return
1e870 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74  ed, or NULL if t
1e880 68 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65  here is an OOM e
1e890 72 72 6f 72 2e 20 20 54 68 65 20 72 65 74 75 72  rror.  The retur
1e8a0 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d  ned.** SrcList m
1e8b0 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d 65  ight be the same
1e8c0 20 61 73 20 74 68 65 20 53 72 63 4c 69 73 74 20   as the SrcList 
1e8d0 74 68 61 74 20 77 61 73 20 69 6e 70 75 74 20 6f  that was input o
1e8e0 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a  r it might be.**
1e8f0 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20   a new one.  If 
1e900 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65  an OOM error doe
1e910 73 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  s occurs, then t
1e920 68 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20 6f  he prior value o
1e930 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20  f pList.** that 
1e940 69 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73  is input to this
1e950 20 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74 6f   routine is auto
1e960 6d 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64 2e  matically freed.
1e970 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62  .**.** If pDatab
1e980 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c  ase is not null,
1e990 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
1e9a0 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
1e9b0 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61  optional.** data
1e9c0 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78  base name prefix
1e9d0 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22  .  Like this:  "
1e9e0 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e  database.table".
1e9f0 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a    The pDatabase.
1ea00 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ** points to the
1ea10 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
1ea20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74  the pTable point
1ea30 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1ea40 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53  e name..** The S
1ea50 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  rcList.a[].zName
1ea60 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64   field is filled
1ea70 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
1ea80 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74  name which might
1ea90 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54  .** come from pT
1eaa0 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61  able (if pDataba
1eab0 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66  se is NULL) or f
1eac0 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20  rom pDatabase.  
1ead0 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  .** SrcList.a[].
1eae0 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c  zDatabase is fil
1eaf0 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
1eb00 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20  abase name from 
1eb10 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69  pTable,.** or wi
1eb20 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61  th NULL if no da
1eb30 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66  tabase is specif
1eb40 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74  ied..**.** In ot
1eb50 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61  her words, if ca
1eb60 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ll like this:.**
1eb70 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
1eb80 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1eb90 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a  (D,A,B,0);.**.**
1eba0 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62   Then B is a tab
1ebb0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
1ebc0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73  database name is
1ebd0 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49   unspecified.  I
1ebe0 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65  f called.** like
1ebf0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1ec00 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
1ec10 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c  istAppend(D,A,B,
1ec20 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43  C);.**.** Then C
1ec30 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61   is the table na
1ec40 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20  me and B is the 
1ec50 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20 20  database name.  
1ec60 49 66 20 43 20 69 73 20 64 65 66 69 6e 65 64 0a  If C is defined.
1ec70 2a 2a 20 74 68 65 6e 20 73 6f 20 69 73 20 42 2e  ** then so is B.
1ec80 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1ec90 2c 20 77 65 20 6e 65 76 65 72 20 68 61 76 65 20  , we never have 
1eca0 61 20 63 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a  a case where:.**
1ecb0 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
1ecc0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1ecd0 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a  (D,A,0,C);.**.**
1ece0 20 42 6f 74 68 20 70 54 61 62 6c 65 20 61 6e 64   Both pTable and
1ecf0 20 70 44 61 74 61 62 61 73 65 20 61 72 65 20 61   pDatabase are a
1ed00 73 73 75 6d 65 64 20 74 6f 20 62 65 20 71 75 6f  ssumed to be quo
1ed10 74 65 64 2e 20 20 54 68 65 79 20 61 72 65 20 64  ted.  They are d
1ed20 65 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72  equoted.** befor
1ed30 65 20 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f  e being added to
1ed40 20 74 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f   the SrcList..*/
1ed50 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
1ed60 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a  3SrcListAppend(.
1ed70 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1ed80 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1ed90 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
1eda0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73   malloc failures
1edb0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1edc0 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70 70  List,     /* App
1edd0 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63 4c  end to this SrcL
1ede0 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65  ist. NULL create
1edf0 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  s a new SrcList 
1ee00 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
1ee10 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  le,      /* Tabl
1ee20 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20  e to append */. 
1ee30 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73   Token *pDatabas
1ee40 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  e    /* Database
1ee50 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   of the table */
1ee60 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63  .){.  struct Src
1ee70 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1ee80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 61 74  ;.  assert( pDat
1ee90 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62  abase==0 || pTab
1eea0 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e  le!=0 );  /* Can
1eeb0 6e 6f 74 20 68 61 76 65 20 43 20 77 69 74 68 6f  not have C witho
1eec0 75 74 20 42 20 2a 2f 0a 20 20 61 73 73 65 72 74  ut B */.  assert
1eed0 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
1eee0 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
1eef0 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1ef00 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
1ef10 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74  , sizeof(SrcList
1ef20 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
1ef30 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
1ef40 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
1ef50 6c 6f 63 20 3d 20 31 3b 0a 20 20 20 20 70 4c 69  loc = 1;.    pLi
1ef60 73 74 2d 3e 6e 53 72 63 20 3d 20 31 3b 0a 20 20  st->nSrc = 1;.  
1ef70 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d    memset(&pList-
1ef80 3e 61 5b 30 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >a[0], 0, sizeof
1ef90 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
1efa0 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e      pList->a[0].
1efb0 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  iCursor = -1;.  
1efc0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 69 73 74  }else{.    pList
1efd0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
1efe0 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c 69  tEnlarge(db, pLi
1eff0 73 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53  st, 1, pList->nS
1f000 72 63 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  rc);.  }.  if( d
1f010 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1f020 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72  ){.    sqlite3Sr
1f030 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
1f040 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75  pList);.    retu
1f050 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 49 74 65  rn 0;.  }.  pIte
1f060 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
1f070 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  ist->nSrc-1];.  
1f080 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26  if( pDatabase &&
1f090 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30   pDatabase->z==0
1f0a0 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73   ){.    pDatabas
1f0b0 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
1f0c0 20 70 44 61 74 61 62 61 73 65 20 29 7b 0a 20 20   pDatabase ){.  
1f0d0 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d    Token *pTemp =
1f0e0 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20   pDatabase;.    
1f0f0 70 44 61 74 61 62 61 73 65 20 3d 20 70 54 61 62  pDatabase = pTab
1f100 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d  le;.    pTable =
1f110 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49   pTemp;.  }.  pI
1f120 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
1f130 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1f140 6e 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20  n(db, pTable);. 
1f150 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
1f160 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
1f170 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44 61  romToken(db, pDa
1f180 74 61 62 61 73 65 29 3b 0a 20 20 72 65 74 75 72  tabase);.  retur
1f190 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
1f1a0 2a 20 41 73 73 69 67 6e 20 56 64 62 65 43 75 72  * Assign VdbeCur
1f1b0 73 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  sor index number
1f1c0 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20  s to all tables 
1f1d0 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a  in a SrcList.*/.
1f1e0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
1f1f0 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
1f200 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1f210 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
1f220 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1f230 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1f240 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74  *pItem;.  assert
1f250 28 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73 65  (pList || pParse
1f260 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1f270 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  ed );.  if( pLis
1f280 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
1f290 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
1f2a0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
1f2b0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
1f2c0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
1f2d0 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72  >iCursor>=0 ) br
1f2e0 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  eak;.      pItem
1f2f0 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72  ->iCursor = pPar
1f300 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
1f310 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
1f320 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
1f330 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
1f340 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
1f350 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  se, pItem->pSele
1f360 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20  ct->pSrc);.     
1f370 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
1f380 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
1f390 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69  entire SrcList i
1f3a0 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73  ncluding all its
1f3b0 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a   substructure..*
1f3c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
1f3d0 63 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  cListDelete(sqli
1f3e0 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74  te3 *db, SrcList
1f3f0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
1f400 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  i;.  struct SrcL
1f410 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1f420 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1f430 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
1f440 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
1f450 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  i=0; i<pList->nS
1f460 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
1f470 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
1f480 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
1f490 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
1f4a0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1f4b0 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
1f4c0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1f4d0 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41  ee(db, pItem->zA
1f4e0 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lias);.    if( p
1f4f0 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
1f500 65 64 42 79 20 29 20 73 71 6c 69 74 65 33 44 62  edBy ) sqlite3Db
1f510 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
1f520 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a  u1.zIndexedBy);.
1f530 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
1f540 67 2e 69 73 54 61 62 46 75 6e 63 20 29 20 73 71  g.isTabFunc ) sq
1f550 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
1f560 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75  ete(db, pItem->u
1f570 31 2e 70 46 75 6e 63 41 72 67 29 3b 0a 20 20 20  1.pFuncArg);.   
1f580 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
1f590 62 6c 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ble(db, pItem->p
1f5a0 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Tab);.    sqlite
1f5b0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
1f5c0 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
1f5d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1f5e0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  prDelete(db, pIt
1f5f0 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71  em->pOn);.    sq
1f600 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
1f610 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73  e(db, pItem->pUs
1f620 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ing);.  }.  sqli
1f630 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
1f640 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
1f650 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1f660 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
1f670 61 72 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e  arser to add a n
1f680 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a  ew term to the.*
1f690 2a 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69  * end of a growi
1f6a0 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ng FROM clause. 
1f6b0 20 54 68 65 20 22 70 22 20 70 61 72 61 6d 65 74   The "p" paramet
1f6c0 65 72 20 69 73 20 74 68 65 20 70 61 72 74 20 6f  er is the part o
1f6d0 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c  f.** the FROM cl
1f6e0 61 75 73 65 20 74 68 61 74 20 68 61 73 20 61 6c  ause that has al
1f6f0 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74  ready been const
1f700 72 75 63 74 65 64 2e 20 20 22 70 22 20 69 73 20  ructed.  "p" is 
1f710 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20  NULL.** if this 
1f720 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72  is the first ter
1f730 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  m of the FROM cl
1f740 61 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e  ause.  pTable an
1f750 64 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61  d pDatabase.** a
1f760 72 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  re the name of t
1f770 68 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74  he table and dat
1f780 61 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74  abase named in t
1f790 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
1f7a0 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73  erm..** pDatabas
1f7b0 65 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  e is NULL if the
1f7c0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71   database name q
1f7d0 75 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73  ualifier is miss
1f7e0 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75  ing - the.** usu
1f7f0 61 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68 65  al case.  If the
1f800 20 74 65 72 6d 20 68 61 73 20 61 6e 20 61 6c 69   term has an ali
1f810 61 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20  as, then pAlias 
1f820 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
1f830 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49   alias token.  I
1f840 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20  f the term is a 
1f850 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70  subquery, then p
1f860 53 75 62 71 75 65 72 79 20 69 73 20 74 68 65 0a  Subquery is the.
1f870 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
1f880 65 6e 74 20 74 68 61 74 20 74 68 65 20 73 75 62  ent that the sub
1f890 71 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20  query encodes.  
1f8a0 54 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a  The pTable and.*
1f8b0 2a 20 70 44 61 74 61 62 61 73 65 20 70 61 72 61  * pDatabase para
1f8c0 6d 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20  meters are NULL 
1f8d0 66 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e 20  for subqueries. 
1f8e0 20 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73   The pOn and pUs
1f8f0 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ing.** parameter
1f900 73 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  s are the conten
1f910 74 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20  t of the ON and 
1f920 55 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a  USING clauses..*
1f930 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65  *.** Return a ne
1f940 77 20 53 72 63 4c 69 73 74 20 77 68 69 63 68 20  w SrcList which 
1f950 65 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20 46  encodes is the F
1f960 52 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77  ROM with the new
1f970 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a  .** term added..
1f980 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
1f990 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1f9a0 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73  FromTerm(.  Pars
1f9b0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1f9c0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1f9d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
1f9e0 69 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ist *p,         
1f9f0 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
1fa00 70 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  part of the FROM
1fa10 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20   clause already 
1fa20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  seen */.  Token 
1fa30 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20  *pTable,        
1fa40 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1fa50 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f   table to add to
1fa60 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1fa70 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
1fa80 74 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a  tabase,       /*
1fa90 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
1faa0 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
1fab0 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b   pTable */.  Tok
1fac0 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20  en *pAlias,     
1fad0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
1fae0 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
1faf0 68 65 20 41 53 20 73 75 62 65 78 70 72 65 73 73  he AS subexpress
1fb00 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
1fb10 2a 70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20  *pSubquery,     
1fb20 20 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20 75   /* A subquery u
1fb30 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  sed in place of 
1fb40 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  a table name */.
1fb50 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20    Expr *pOn,    
1fb60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1fb70 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
1fb80 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74  join */.  IdList
1fb90 20 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20 20   *pUsing        
1fba0 20 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63    /* The USING c
1fbb0 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20  lause of a join 
1fbc0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
1fbd0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1fbe0 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
1fbf0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1fc00 20 20 69 66 28 20 21 70 20 26 26 20 28 70 4f 6e    if( !p && (pOn
1fc10 20 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a 20   || pUsing) ){. 
1fc20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1fc30 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4a 4f  sg(pParse, "a JO
1fc40 49 4e 20 63 6c 61 75 73 65 20 69 73 20 72 65 71  IN clause is req
1fc50 75 69 72 65 64 20 62 65 66 6f 72 65 20 25 73 22  uired before %s"
1fc60 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f 20  , .      (pOn ? 
1fc70 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29 0a  "ON" : "USING").
1fc80 20 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20      );.    goto 
1fc90 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f  append_from_erro
1fca0 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c  r;.  }.  p = sql
1fcb0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1fcc0 64 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c  d(db, p, pTable,
1fcd0 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69   pDatabase);.  i
1fce0 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52  f( p==0 || NEVER
1fcf0 28 70 2d 3e 6e 53 72 63 3d 3d 30 29 20 29 7b 0a  (p->nSrc==0) ){.
1fd00 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f      goto append_
1fd10 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  from_error;.  }.
1fd20 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b    pItem = &p->a[
1fd30 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73  p->nSrc-1];.  as
1fd40 73 65 72 74 28 20 70 41 6c 69 61 73 21 3d 30 20  sert( pAlias!=0 
1fd50 29 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73 2d  );.  if( pAlias-
1fd60 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d  >n ){.    pItem-
1fd70 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >zAlias = sqlite
1fd80 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1fd90 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a  b, pAlias);.  }.
1fda0 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74    pItem->pSelect
1fdb0 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20   = pSubquery;.  
1fdc0 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e  pItem->pOn = pOn
1fdd0 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e  ;.  pItem->pUsin
1fde0 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65  g = pUsing;.  re
1fdf0 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e 64  turn p;.. append
1fe00 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 61  _from_error:.  a
1fe10 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20  ssert( p==0 );. 
1fe20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1fe30 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 73  te(db, pOn);.  s
1fe40 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1fe50 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29 3b 0a  te(db, pUsing);.
1fe60 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1fe70 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 71 75  elete(db, pSubqu
1fe80 65 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ery);.  return 0
1fe90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1fea0 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20  n INDEXED BY or 
1feb0 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
1fec0 73 65 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72  se to the most r
1fed0 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 0a 2a  ecently added .*
1fee0 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  * element of the
1fef0 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 70 61 73   source-list pas
1ff00 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
1ff10 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76  d argument..*/.v
1ff20 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
1ff30 73 74 49 6e 64 65 78 65 64 42 79 28 50 61 72 73  stIndexedBy(Pars
1ff40 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
1ff50 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70 49  st *p, Token *pI
1ff60 6e 64 65 78 65 64 42 79 29 7b 0a 20 20 61 73 73  ndexedBy){.  ass
1ff70 65 72 74 28 20 70 49 6e 64 65 78 65 64 42 79 21  ert( pIndexedBy!
1ff80 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  =0 );.  if( p &&
1ff90 20 41 4c 57 41 59 53 28 70 2d 3e 6e 53 72 63 3e   ALWAYS(p->nSrc>
1ffa0 30 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  0) ){.    struct
1ffb0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1ffc0 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
1ffd0 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73  nSrc-1];.    ass
1ffe0 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e  ert( pItem->fg.n
1fff0 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a  otIndexed==0 );.
20000 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
20010 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
20020 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  y==0 );.    asse
20030 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
20040 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20  TabFunc==0 );.  
20050 20 20 69 66 28 20 70 49 6e 64 65 78 65 64 42 79    if( pIndexedBy
20060 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64 65  ->n==1 && !pInde
20070 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20  xedBy->z ){.    
20080 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45    /* A "NOT INDE
20090 58 45 44 22 20 63 6c 61 75 73 65 20 77 61 73 20  XED" clause was 
200a0 73 75 70 70 6c 69 65 64 2e 20 53 65 65 20 70 61  supplied. See pa
200b0 72 73 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20  rse.y .      ** 
200c0 63 6f 6e 73 74 72 75 63 74 20 22 69 6e 64 65 78  construct "index
200d0 65 64 5f 6f 70 74 22 20 66 6f 72 20 64 65 74 61  ed_opt" for deta
200e0 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49  ils. */.      pI
200f0 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  tem->fg.notIndex
20100 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
20110 65 7b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  e{.      pItem->
20120 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20  u1.zIndexedBy = 
20130 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
20140 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
20150 20 70 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20   pIndexedBy);.  
20160 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73      pItem->fg.is
20170 49 6e 64 65 78 65 64 42 79 20 3d 20 28 70 49 74  IndexedBy = (pIt
20180 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  em->u1.zIndexedB
20190 79 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  y!=0);.    }.  }
201a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68  .}../*.** Add th
201b0 65 20 6c 69 73 74 20 6f 66 20 66 75 6e 63 74 69  e list of functi
201c0 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  on arguments to 
201d0 74 68 65 20 53 72 63 4c 69 73 74 20 65 6e 74 72  the SrcList entr
201e0 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65  y for a.** table
201f0 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e  -valued-function
20200 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
20210 33 53 72 63 4c 69 73 74 46 75 6e 63 41 72 67 73  3SrcListFuncArgs
20220 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
20230 53 72 63 4c 69 73 74 20 2a 70 2c 20 45 78 70 72  SrcList *p, Expr
20240 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
20250 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 74 72  if( p ){.    str
20260 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
20270 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
20280 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  p->nSrc-1];.    
20290 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66  assert( pItem->f
202a0 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  g.notIndexed==0 
202b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
202c0 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
202d0 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61  edBy==0 );.    a
202e0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
202f0 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b  .isTabFunc==0 );
20300 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 70  .    pItem->u1.p
20310 46 75 6e 63 41 72 67 20 3d 20 70 4c 69 73 74 3b  FuncArg = pList;
20320 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69  .    pItem->fg.i
20330 73 54 61 62 46 75 6e 63 20 3d 20 31 3b 0a 20 20  sTabFunc = 1;.  
20340 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
20350 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
20360 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69  (pParse->db, pLi
20370 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  st);.  }.}../*.*
20380 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  * When building 
20390 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  up a FROM clause
203a0 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20   in the parser, 
203b0 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
203c0 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c  r.** is initiall
203d0 79 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  y attached to th
203e0 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20  e left operand. 
203f0 20 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65   But the code ge
20400 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63  nerator.** expec
20410 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ts the join oper
20420 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68  ator to be on th
20430 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e  e right operand.
20440 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
20450 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69  * Shifts all joi
20460 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d  n operators from
20470 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 66   left to right f
20480 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f  or an entire FRO
20490 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  M.** clause..**.
204a0 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70  ** Example: Supp
204b0 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20  ose the join is 
204c0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
204d0 20 20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74             A nat
204e0 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20  ural cross join 
204f0 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72  B.**.** The oper
20500 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c  ator is "natural
20510 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54   cross join".  T
20520 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61  he A and B opera
20530 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a  nds are stored.*
20540 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64  * in p->a[0] and
20550 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63   p->a[1], respec
20560 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72  tively.  The par
20570 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74  ser initially st
20580 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72  ores the.** oper
20590 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68  ator with A.  Th
205a0 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74  is routine shift
205b0 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20  s that operator 
205c0 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f  over to B..*/.vo
205d0 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
205e0 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53  tShiftJoinType(S
205f0 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66  rcList *p){.  if
20600 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( p ){.    int i
20610 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e  ;.    for(i=p->n
20620 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  Src-1; i>0; i--)
20630 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e  {.      p->a[i].
20640 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d  fg.jointype = p-
20650 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f 69 6e 74  >a[i-1].fg.joint
20660 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ype;.    }.    p
20670 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79  ->a[0].fg.jointy
20680 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pe = 0;.  }.}../
20690 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
206a0 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45  BE code for a BE
206b0 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  GIN statement..*
206c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
206d0 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ginTransaction(P
206e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
206f0 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74  t type){.  sqlit
20700 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
20710 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  v;.  int i;..  a
20720 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
20730 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
20740 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
20750 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
20760 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
20770 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
20780 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45  TRANSACTION, "BE
20790 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20  GIN", 0, 0) ){. 
207a0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
207b0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
207c0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
207d0 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a  f( !v ) return;.
207e0 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44    if( type!=TK_D
207f0 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66  EFERRED ){.    f
20800 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
20810 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  b; i++){.      s
20820 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20830 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
20840 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b  on, i, (type==TK
20850 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a  _EXCLUSIVE)+1);.
20860 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20870 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 29  eUsesBtree(v, i)
20880 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
20890 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
208a0 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
208b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
208c0 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66  rate VDBE code f
208d0 6f 72 20 61 20 43 4f 4d 4d 49 54 20 73 74 61 74  or a COMMIT stat
208e0 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
208f0 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e  qlite3CommitTran
20900 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
20910 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
20920 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  v;..  assert( pP
20930 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  arse!=0 );.  ass
20940 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21  ert( pParse->db!
20950 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  =0 );.  if( sqli
20960 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
20970 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
20980 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54  SACTION, "COMMIT
20990 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  ", 0, 0) ){.    
209a0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20  return;.  }.  v 
209b0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
209c0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
209d0 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
209e0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
209f0 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 29 3b  _AutoCommit, 1);
20a00 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
20a10 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
20a20 20 66 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20   for a ROLLBACK 
20a30 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
20a40 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  id sqlite3Rollba
20a50 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  ckTransaction(Pa
20a60 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
20a70 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65  Vdbe *v;..  asse
20a80 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
20a90 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
20aa0 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  e->db!=0 );.  if
20ab0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
20ac0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
20ad0 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
20ae0 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29  ROLLBACK", 0, 0)
20af0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
20b00 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65    }.  v = sqlite
20b10 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
20b20 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
20b30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20b40 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  p2(v, OP_AutoCom
20b50 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a  mit, 1, 1);.  }.
20b60 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
20b70 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
20b80 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
20b90 68 65 6e 20 69 74 20 70 61 72 73 65 73 20 61 20  hen it parses a 
20ba0 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61 74  command to creat
20bb0 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72  e,.** release or
20bc0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c   rollback an SQL
20bd0 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a   savepoint. .*/.
20be0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 61 76 65  void sqlite3Save
20bf0 70 6f 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61  point(Parse *pPa
20c00 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b  rse, int op, Tok
20c10 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68  en *pName){.  ch
20c20 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ar *zName = sqli
20c30 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
20c40 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
20c50 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
20c60 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
20c70 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
20c80 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
20c90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
20ca0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
20cb0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
20cc0 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d  r * const az[] =
20cd0 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52 45 4c   { "BEGIN", "REL
20ce0 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b  EASE", "ROLLBACK
20cf0 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  " };.    assert(
20d00 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49   !SAVEPOINT_BEGI
20d10 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52  N && SAVEPOINT_R
20d20 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53 41 56  ELEASE==1 && SAV
20d30 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d  EPOINT_ROLLBACK=
20d40 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  =2 );.#endif.   
20d50 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c 69 74   if( !v || sqlit
20d60 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
20d70 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56 45 50  se, SQLITE_SAVEP
20d80 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e  OINT, az[op], zN
20d90 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ame, 0) ){.     
20da0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
20db0 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
20dc0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
20dd0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
20de0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
20df0 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70  OP_Savepoint, op
20e00 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50  , 0, 0, zName, P
20e10 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
20e20 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
20e30 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61  re the TEMP data
20e40 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64  base is open and
20e50 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
20e60 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  se.  Return.** t
20e70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
20e80 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20  ors.  Leave any 
20e90 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
20ea0 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
20eb0 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
20ec0 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
20ed0 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50  tabase(Parse *pP
20ee0 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
20ef0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
20f00 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62  b;.  if( db->aDb
20f10 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70  [1].pBt==0 && !p
20f20 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
20f30 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
20f40 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20    Btree *pBt;.  
20f50 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
20f60 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20  nt flags = .    
20f70 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
20f80 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20  N_READWRITE |.  
20f90 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
20fa0 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
20fb0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
20fc0 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20  EN_EXCLUSIVE |. 
20fd0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
20fe0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
20ff0 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  SE |.          S
21000 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
21010 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  DB;..    rc = sq
21020 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64  lite3BtreeOpen(d
21030 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20  b->pVfs, 0, db, 
21040 26 70 42 74 2c 20 30 2c 20 66 6c 61 67 73 29 3b  &pBt, 0, flags);
21050 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
21060 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21070 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
21080 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
21090 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
210a0 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20  ary database ". 
210b0 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72         "file for
210c0 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61   storing tempora
210d0 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ry tables");.   
210e0 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
210f0 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
21100 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62   1;.    }.    db
21110 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70  ->aDb[1].pBt = p
21120 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
21130 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
21140 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51  ma );.    if( SQ
21150 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69  LITE_NOMEM==sqli
21160 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
21170 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78  ize(pBt, db->nex
21180 74 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30  tPagesize, -1, 0
21190 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
211a0 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
211b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
211c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
211d0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
211e0 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
211f0 68 61 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  hat the schema c
21200 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e 65 65 64 20  ookie will need 
21210 74 6f 20 62 65 20 76 65 72 69 66 69 65 64 0a 2a  to be verified.*
21220 2a 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 69  * for database i
21230 44 62 2e 20 20 54 68 65 20 63 6f 64 65 20 74 6f  Db.  The code to
21240 20 61 63 74 75 61 6c 6c 79 20 76 65 72 69 66 79   actually verify
21250 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
21260 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63 63 75 72  ie.** will occur
21270 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
21280 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56 44 42  he top-level VDB
21290 45 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 67 65  E and will be ge
212a0 6e 65 72 61 74 65 64 0a 2a 2a 20 6c 61 74 65 72  nerated.** later
212b0 2c 20 62 79 20 73 71 6c 69 74 65 33 46 69 6e 69  , by sqlite3Fini
212c0 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76  shCoding()..*/.v
212d0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56  oid sqlite3CodeV
212e0 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73  erifySchema(Pars
212f0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
21300 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  Db){.  Parse *pT
21310 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
21320 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
21330 50 61 72 73 65 29 3b 0a 0a 20 20 61 73 73 65 72  Parse);..  asser
21340 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
21350 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62  <pParse->db->nDb
21360 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
21370 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
21380 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62  b].pBt!=0 || iDb
21390 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
213a0 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f   iDb<SQLITE_MAX_
213b0 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20  ATTACHED+2 );.  
213c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
213d0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 70  chemaMutexHeld(p
213e0 50 61 72 73 65 2d 3e 64 62 2c 20 69 44 62 2c 20  Parse->db, iDb, 
213f0 30 29 20 29 3b 0a 20 20 69 66 28 20 44 62 4d 61  0) );.  if( DbMa
21400 73 6b 54 65 73 74 28 70 54 6f 70 6c 65 76 65 6c  skTest(pToplevel
21410 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44  ->cookieMask, iD
21420 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44 62 4d  b)==0 ){.    DbM
21430 61 73 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c  askSet(pToplevel
21440 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44  ->cookieMask, iD
21450 62 29 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49  b);.    if( !OMI
21460 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
21470 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
21480 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
21490 61 73 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a  ase(pToplevel);.
214a0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
214b0 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  ** If argument z
214c0 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  Db is NULL, then
214d0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64   call sqlite3Cod
214e0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 29 20  eVerifySchema() 
214f0 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 61 74 74  for each .** att
21500 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2e 20  ached database. 
21510 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b  Otherwise, invok
21520 65 20 69 74 20 66 6f 72 20 74 68 65 20 64 61 74  e it for the dat
21530 61 62 61 73 65 20 6e 61 6d 65 64 20 7a 44 62 20  abase named zDb 
21540 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
21550 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e  lite3CodeVerifyN
21560 61 6d 65 64 53 63 68 65 6d 61 28 50 61 72 73 65  amedSchema(Parse
21570 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
21580 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71  char *zDb){.  sq
21590 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
215a0 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b  se->db;.  int i;
215b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
215c0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
215d0 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
215e0 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
215f0 70 44 62 2d 3e 70 42 74 20 26 26 20 28 21 7a 44  pDb->pBt && (!zD
21600 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53  b || 0==sqlite3S
21610 74 72 49 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d  trICmp(zDb, pDb-
21620 3e 7a 44 62 53 4e 61 6d 65 29 29 20 29 7b 0a 20  >zDbSName)) ){. 
21630 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
21640 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
21650 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  rse, i);.    }. 
21660 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
21670 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
21680 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72  hat prepares for
21690 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74   doing an operat
216a0 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  ion that.** migh
216b0 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74  t change the dat
216c0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abase..**.** Thi
216d0 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
216e0 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
216f0 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  on if we are not
21700 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a   already within.
21710 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
21720 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72  .  If we are alr
21730 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72  eady within a tr
21740 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
21750 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  a checkpoint.** 
21760 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65  is set if the se
21770 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d  tStatement param
21780 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41  eter is true.  A
21790 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
217a0 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72  ld.** be set for
217b0 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74   operations that
217c0 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65   might fail (due
217d0 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   to a constraint
217e0 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  ) part of.** the
217f0 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64   way through and
21800 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64   which will need
21810 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72   to undo some wr
21820 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76  ites without hav
21830 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61  ing to.** rollba
21840 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  ck the whole tra
21850 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f  nsaction.  For o
21860 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20  perations where 
21870 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
21880 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65  ** can be checke
21890 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  d before any cha
218a0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
218b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
218c0 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65  t is never.** ne
218d0 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
218e0 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20  a write and the 
218f0 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
21900 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f  d not be set..*/
21910 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
21920 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
21930 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
21940 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74  int setStatement
21950 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61  , int iDb){.  Pa
21960 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
21970 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
21980 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
21990 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
219a0 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
219b0 20 69 44 62 29 3b 0a 20 20 44 62 4d 61 73 6b 53   iDb);.  DbMaskS
219c0 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72  et(pToplevel->wr
219d0 69 74 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20  iteMask, iDb);. 
219e0 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75   pToplevel->isMu
219f0 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65 74 53  ltiWrite |= setS
21a00 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a  tatement;.}../*.
21a10 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
21a20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63   the statement c
21a30 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
21a40 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69 67 68  onstruction migh
21a50 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20  t write.** more 
21a60 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28  than one entry (
21a70 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e  example: deletin
21a80 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20 69  g one row then i
21a90 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68 65 72  nserting another
21aa0 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d  ,.** inserting m
21ab0 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69 6e 20  ultiple rows in 
21ac0 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65  a table, or inse
21ad0 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e 64 20  rting a row and 
21ae0 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e 29 0a  index entries.).
21af0 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74 20 6f  ** If an abort o
21b00 63 63 75 72 73 20 61 66 74 65 72 20 73 6f 6d 65  ccurs after some
21b10 20 6f 66 20 74 68 65 73 65 20 77 72 69 74 65 73   of these writes
21b20 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c   have completed,
21b30 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a   then it will.**
21b40 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
21b50 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65   undo the comple
21b60 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76  ted writes..*/.v
21b70 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69  oid sqlite3Multi
21b80 57 72 69 74 65 28 50 61 72 73 65 20 2a 70 50 61  Write(Parse *pPa
21b90 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  rse){.  Parse *p
21ba0 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
21bb0 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
21bc0 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c  pParse);.  pTopl
21bd0 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69  evel->isMultiWri
21be0 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  te = 1;.}../* .*
21bf0 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
21c00 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ator calls this 
21c10 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20 64 69  routine if is di
21c20 73 63 6f 76 65 72 73 20 74 68 61 74 20 69 74 20  scovers that it 
21c30 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74  is.** possible t
21c40 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74 65 6d  o abort a statem
21c50 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d  ent prior to com
21c60 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64  pletion.  In ord
21c70 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72  er to .** perfor
21c80 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77 69 74  m this abort wit
21c90 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e 67 20  hout corrupting 
21ca0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 77 65  the database, we
21cb0 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a   need to make.**
21cc0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73   sure that the s
21cd0 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72 6f 74  tatement is prot
21ce0 65 63 74 65 64 20 62 79 20 61 20 73 74 61 74 65  ected by a state
21cf0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
21d00 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61  ..**.** Technica
21d10 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65  lly, we only nee
21d20 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 79  d to set the may
21d30 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20 74 68  Abort flag if th
21d40 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69 74  e.** isMultiWrit
21d50 65 20 66 6c 61 67 20 77 61 73 20 70 72 65 76 69  e flag was previ
21d60 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68 65 72  ously set.  Ther
21d70 65 20 69 73 20 61 20 74 69 6d 65 20 64 65 70 65  e is a time depe
21d80 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74  ndency.** such t
21d90 68 61 74 20 74 68 65 20 61 62 6f 72 74 20 6d 75  hat the abort mu
21da0 73 74 20 6f 63 63 75 72 20 61 66 74 65 72 20 74  st occur after t
21db0 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e 20 20  he multiwrite.  
21dc0 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f  This makes.** so
21dd0 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  me statements in
21de0 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45 50 4c  volving the REPL
21df0 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  ACE conflict res
21e00 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
21e10 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65  m.** go a little
21e20 20 66 61 73 74 65 72 2e 20 20 42 75 74 20 74 61   faster.  But ta
21e30 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65 20 6f  king advantage o
21e40 66 20 74 68 69 73 20 74 69 6d 65 20 64 65 70 65  f this time depe
21e50 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20  ndency.** makes 
21e60 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c  it more difficul
21e70 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20  t to prove that 
21e80 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f 72 72  the code is corr
21e90 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74  ect (in .** part
21ea0 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65 76 65  icular, it preve
21eb0 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72 69 74  nts us from writ
21ec0 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69 76 65  ing an effective
21ed0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
21ee0 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41 73 73  on of sqlite3Ass
21ef0 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29 20 61  ertMayAbort()) a
21f00 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20 63 68  nd so we have ch
21f10 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20  osen.** to take 
21f20 74 68 65 20 73 61 66 65 20 72 6f 75 74 65 20 61  the safe route a
21f30 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70 74 69  nd skip the opti
21f40 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  mization..*/.voi
21f50 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72  d sqlite3MayAbor
21f60 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  t(Parse *pParse)
21f70 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
21f80 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
21f90 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
21fa0 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  se);.  pToplevel
21fb0 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a  ->mayAbort = 1;.
21fc0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
21fd0 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20 63 61   OP_Halt that ca
21fe0 75 73 65 73 20 74 68 65 20 76 64 62 65 20 74 6f  uses the vdbe to
21ff0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
22000 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20  E_CONSTRAINT.** 
22010 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72  error. The onErr
22020 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 74  or parameter det
22030 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 28 69  ermines which (i
22040 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20 73 74  f any) of the st
22050 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f  atement.** and/o
22060 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  r current transa
22070 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
22080 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  back..*/.void sq
22090 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
220a0 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
220b0 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
220c0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
220d0 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 20 20   int errCode,   
220e0 20 20 20 2f 2a 20 65 78 74 65 6e 64 65 64 20 65     /* extended e
220f0 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69  rror code */.  i
22100 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
22110 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74   /* Constraint t
22120 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  ype */.  char *p
22130 34 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72  4,         /* Er
22140 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20  ror message */. 
22150 20 69 38 20 70 34 74 79 70 65 2c 20 20 20 20 20   i8 p4type,     
22160 20 20 20 2f 2a 20 50 34 5f 53 54 41 54 49 43 20     /* P4_STATIC 
22170 6f 72 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 20  or P4_TRANSIENT 
22180 2a 2f 0a 20 20 75 38 20 70 35 45 72 72 6d 73 67  */.  u8 p5Errmsg
22190 20 20 20 20 20 20 20 2f 2a 20 50 35 5f 45 72 72         /* P5_Err
221a0 4d 73 67 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  Msg type */.){. 
221b0 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
221c0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
221d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65 72  );.  assert( (er
221e0 72 43 6f 64 65 26 30 78 66 66 29 3d 3d 53 51 4c  rCode&0xff)==SQL
221f0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29  ITE_CONSTRAINT )
22200 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d  ;.  if( onError=
22210 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
22220 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
22230 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20  (pParse);.  }.  
22240 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22250 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72  4(v, OP_Halt, er
22260 72 43 6f 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20  rCode, onError, 
22270 30 2c 20 70 34 2c 20 70 34 74 79 70 65 29 3b 0a  0, p4, p4type);.
22280 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
22290 6e 67 65 50 35 28 76 2c 20 70 35 45 72 72 6d 73  ngeP5(v, p5Errms
222a0 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64  g);.}../*.** Cod
222b0 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65  e an OP_Halt due
222c0 20 74 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52   to UNIQUE or PR
222d0 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
222e0 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a  aint violation..
222f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55  */.void sqlite3U
22300 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28  niqueConstraint(
22310 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
22320 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
22330 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
22340 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
22350 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70  * Constraint typ
22360 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
22370 64 78 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  dx       /* The 
22380 69 6e 64 65 78 20 74 68 61 74 20 74 72 69 67 67  index that trigg
22390 65 72 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69  ers the constrai
223a0 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
223b0 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a  *zErr;.  int j;.
223c0 20 20 53 74 72 41 63 63 75 6d 20 65 72 72 4d 73    StrAccum errMs
223d0 67 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  g;.  Table *pTab
223e0 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b   = pIdx->pTable;
223f0 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ..  sqlite3StrAc
22400 63 75 6d 49 6e 69 74 28 26 65 72 72 4d 73 67 2c  cumInit(&errMsg,
22410 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20   pParse->db, 0, 
22420 30 2c 20 32 30 30 29 3b 0a 20 20 69 66 28 20 70  0, 200);.  if( p
22430 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 7b  Idx->aColExpr ){
22440 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69  .    sqlite3XPri
22450 6e 74 66 28 26 65 72 72 4d 73 67 2c 20 22 69 6e  ntf(&errMsg, "in
22460 64 65 78 20 27 25 71 27 22 2c 20 70 49 64 78 2d  dex '%q'", pIdx-
22470 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  >zName);.  }else
22480 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
22490 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
224a0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  j++){.      char
224b0 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 61 73   *zCol;.      as
224c0 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f  sert( pIdx->aiCo
224d0 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20  lumn[j]>=0 );.  
224e0 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
224f0 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f  >aCol[pIdx->aiCo
22500 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[j]].zName;.
22510 20 20 20 20 20 20 69 66 28 20 6a 20 29 20 73 71        if( j ) sq
22520 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
22530 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2c 20  end(&errMsg, ", 
22540 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", 2);.      sql
22550 69 74 65 33 58 50 72 69 6e 74 66 28 26 65 72 72  ite3XPrintf(&err
22560 4d 73 67 2c 20 22 25 73 2e 25 73 22 2c 20 70 54  Msg, "%s.%s", pT
22570 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  ab->zName, zCol)
22580 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 45  ;.    }.  }.  zE
22590 72 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41  rr = sqlite3StrA
225a0 63 63 75 6d 46 69 6e 69 73 68 28 26 65 72 72 4d  ccumFinish(&errM
225b0 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 48 61  sg);.  sqlite3Ha
225c0 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
225d0 72 73 65 2c 20 0a 20 20 20 20 49 73 50 72 69 6d  rse, .    IsPrim
225e0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
225f0 29 20 3f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ) ? SQLITE_CONST
22600 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59  RAINT_PRIMARYKEY
22610 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
22620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
22630 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
22640 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e  T_UNIQUE,.    on
22650 45 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f  Error, zErr, P4_
22660 44 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73  DYNAMIC, P5_Cons
22670 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d  traintUnique);.}
22680 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  .../*.** Code an
22690 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20   OP_Halt due to 
226a0 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64  non-unique rowid
226b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
226c0 33 52 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74  3RowidConstraint
226d0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
226e0 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
226f0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
22700 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
22710 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f  /* Conflict reso
22720 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
22730 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
22740 62 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  b       /* The t
22750 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6e 6f  able with the no
22760 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 20 2a  n-unique rowid *
22770 2f 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d  / .){.  char *zM
22780 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  sg;.  int rc;.  
22790 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e  if( pTab->iPKey>
227a0 3d 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d  =0 ){.    zMsg =
227b0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
227c0 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e  pParse->db, "%s.
227d0 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
227e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
227f0 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
22800 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b  ->aCol[pTab->iPK
22810 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ey].zName);.    
22820 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
22830 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45  TRAINT_PRIMARYKE
22840 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
22850 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
22860 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
22870 2c 20 22 25 73 2e 72 6f 77 69 64 22 2c 20 70 54  , "%s.rowid", pT
22880 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
22890 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
228a0 54 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20  TRAINT_ROWID;.  
228b0 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43  }.  sqlite3HaltC
228c0 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
228d0 2c 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a  , rc, onError, z
228e0 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c  Msg, P4_DYNAMIC,
228f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22900 20 20 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73           P5_Cons
22910 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d  traintUnique);.}
22920 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
22930 20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75   see if pIndex u
22940 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  ses the collatin
22950 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
22960 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
22970 65 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64  e if it does and
22980 20 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65   false if it doe
22990 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  s not..*/.#ifnde
229a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
229b0 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74  INDEX.static int
229c0 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
229d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
229e0 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  l, Index *pIndex
229f0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
22a00 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29  sert( zColl!=0 )
22a10 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
22a20 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Index->nColumn; 
22a30 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
22a40 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78  char *z = pIndex
22a50 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
22a60 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c   assert( z!=0 ||
22a70 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
22a80 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66  n[i]<0 );.    if
22a90 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ( pIndex->aiColu
22aa0 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73  mn[i]>=0 && 0==s
22ab0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
22ac0 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
22ad0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
22ae0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
22af0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
22b00 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
22b10 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74  ndices of pTab t
22b20 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  hat use the coll
22b30 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
22b40 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c  Coll..** If pCol
22b50 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
22b60 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
22b70 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e  of pTab..*/.#ifn
22b80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22b90 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
22ba0 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65  oid reindexTable
22bb0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
22bc0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61  Table *pTab, cha
22bd0 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b  r const *zColl){
22be0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
22bf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
22c00 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
22c10 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
22c20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78  */..  for(pIndex
22c30 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
22c40 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49  Index; pIndex=pI
22c50 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  ndex->pNext){.  
22c60 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c    if( zColl==0 |
22c70 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  | collationMatch
22c80 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20  (zColl, pIndex) 
22c90 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  ){.      int iDb
22ca0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
22cb0 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
22cc0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
22cd0 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
22ce0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
22cf0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
22d00 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
22d10 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
22d20 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
22d30 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
22d40 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
22d50 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
22d60 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ces of all table
22d70 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
22d80 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20  es where the.** 
22d90 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20  indices use the 
22da0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
22db0 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43  ce pColl.  If pC
22dc0 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
22dd0 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64  mpute.** all ind
22de0 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e  ices everywhere.
22df0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
22e00 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
22e10 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
22e20 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72  dexDatabases(Par
22e30 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72  se *pParse, char
22e40 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a   const *zColl){.
22e50 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
22e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22e70 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   A single databa
22e80 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ea0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
22eb0 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
22ec0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
22ed0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
22ee0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
22ef0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
22f00 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20    HashElem *k;  
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22f20 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
22f30 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20  r tables in pDb 
22f40 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
22f50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22f60 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
22f70 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a  he database */..
22f80 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22f90 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
22fa0 74 65 78 65 73 28 64 62 29 20 29 3b 20 20 2f 2a  texes(db) );  /*
22fb0 20 4e 65 65 64 65 64 20 66 6f 72 20 73 63 68 65   Needed for sche
22fc0 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 66  ma access */.  f
22fd0 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62  or(iDb=0, pDb=db
22fe0 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e  ->aDb; iDb<db->n
22ff0 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b  Db; iDb++, pDb++
23000 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
23010 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72  Db!=0 );.    for
23020 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (k=sqliteHashFir
23030 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61  st(&pDb->pSchema
23040 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20  ->tblHash);  k; 
23050 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  k=sqliteHashNext
23060 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62  (k)){.      pTab
23070 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74   = (Table*)sqlit
23080 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20  eHashData(k);.  
23090 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65      reindexTable
230a0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a  (pParse, pTab, z
230b0 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Coll);.    }.  }
230c0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
230d0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
230e0 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63  or the REINDEX c
230f0 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  ommand..**.**   
23100 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20       REINDEX    
23110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23120 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20          -- 1.** 
23130 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
23140 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20  <collation>     
23150 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a            -- 2.*
23160 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
23170 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
23180 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33  tablename>  -- 3
23190 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
231a0 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  EX  ?<database>.
231b0 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d  ?<indexname>  --
231c0 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20   4.**.** Form 1 
231d0 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63  causes all indic
231e0 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68  es in all attach
231f0 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20  ed databases to 
23200 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46  be rebuilt..** F
23210 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61  orm 2 rebuilds a
23220 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
23230 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  l databases that
23240 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a   use the named.*
23250 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  * collating func
23260 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61  tion.  Forms 3 a
23270 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65  nd 4 rebuild the
23280 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20   named index or 
23290 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61  all.** indices a
232a0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
232b0 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a  he named table..
232c0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
232d0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76  E_OMIT_REINDEX.v
232e0 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64  oid sqlite3Reind
232f0 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
23300 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c  , Token *pName1,
23310 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b   Token *pName2){
23320 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
23330 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
23340 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
23350 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64  ence to be reind
23360 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  exed, or NULL */
23370 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
23380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23390 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c  * Name of a tabl
233a0 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e or index */.  
233b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
233c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
233d0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
233e0 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ase */.  Table *
233f0 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
23400 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
23410 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
23420 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
23430 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
23440 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73   /* An index ass
23450 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61  ociated with pTa
23460 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  b */.  int iDb; 
23470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23480 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
23490 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
234a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
234b0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
234c0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
234d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
234e0 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65   Token *pObjName
234f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
23500 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
23510 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65  e or index to be
23520 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20   reindexed */.. 
23530 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
23540 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
23550 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
23560 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
23570 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e   message.  ** an
23580 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65  d code in pParse
23590 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
235a0 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
235b0 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
235c0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
235d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
235e0 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31   }..  if( pName1
235f0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64  ==0 ){.    reind
23600 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72  exDatabases(pPar
23610 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  se, 0);.    retu
23620 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  rn;.  }else if( 
23630 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29  NEVER(pName2==0)
23640 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30   || pName2->z==0
23650 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   ){.    char *zC
23660 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28  oll;.    assert(
23670 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20   pName1->z );.  
23680 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    zColl = sqlite
23690 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
236a0 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
236b0 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f  1);.    if( !zCo
236c0 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ll ) return;.   
236d0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
236e0 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
236f0 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20  ENC(db), zColl, 
23700 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  0);.    if( pCol
23710 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64  l ){.      reind
23720 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72  exDatabases(pPar
23730 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  se, zColl);.    
23740 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
23750 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  db, zColl);.    
23760 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
23770 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
23780 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  e(db, zColl);.  
23790 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
237a0 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
237b0 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
237c0 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b  me2, &pObjName);
237d0 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72  .  if( iDb<0 ) r
237e0 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c  eturn;.  z = sql
237f0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
23800 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b  n(db, pObjName);
23810 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
23820 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62  turn;.  zDb = db
23830 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
23840 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ame;.  pTab = sq
23850 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
23860 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66  b, z, zDb);.  if
23870 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65  ( pTab ){.    re
23880 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
23890 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20  e, pTab, 0);.   
238a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
238b0 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72  b, z);.    retur
238c0 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20  n;.  }.  pIndex 
238d0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
238e0 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a  ex(db, z, zDb);.
238f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
23900 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49  db, z);.  if( pI
23910 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
23920 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
23930 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
23940 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
23950 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
23960 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
23970 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  1);.    return;.
23980 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
23990 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
239a0 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66  nable to identif
239b0 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20  y the object to 
239c0 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a  be reindexed");.
239d0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
239e0 52 65 74 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f  Return a KeyInfo
239f0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
23a00 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
23a10 6f 72 20 74 68 65 20 67 69 76 65 6e 20 49 6e 64  or the given Ind
23a20 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ex..**.** The ca
23a30 6c 6c 65 72 20 73 68 6f 75 6c 64 20 69 6e 76 6f  ller should invo
23a40 6b 65 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  ke sqlite3KeyInf
23a50 6f 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  oUnref() on the 
23a60 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 0a  returned object.
23a70 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 66  ** when it has f
23a80 69 6e 69 73 68 65 64 20 75 73 69 6e 67 20 69 74  inished using it
23a90 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71  ..*/.KeyInfo *sq
23aa0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e  lite3KeyInfoOfIn
23ab0 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
23ac0 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  e, Index *pIdx){
23ad0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
23ae0 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f  nCol = pIdx->nCo
23af0 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 4b 65 79  lumn;.  int nKey
23b00 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   = pIdx->nKeyCol
23b10 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  ;.  KeyInfo *pKe
23b20 79 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  y;.  if( pParse-
23b30 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30  >nErr ) return 0
23b40 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 75 6e  ;.  if( pIdx->un
23b50 69 71 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20  iqNotNull ){.   
23b60 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b   pKey = sqlite3K
23b70 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72  eyInfoAlloc(pPar
23b80 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e 43  se->db, nKey, nC
23b90 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73  ol-nKey);.  }els
23ba0 65 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71  e{.    pKey = sq
23bb0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
23bc0 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 43  c(pParse->db, nC
23bd0 6f 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  ol, 0);.  }.  if
23be0 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73  ( pKey ){.    as
23bf0 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
23c00 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
23c10 70 4b 65 79 29 20 29 3b 0a 20 20 20 20 66 6f 72  pKey) );.    for
23c20 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
23c30 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  +){.      const 
23c40 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49  char *zColl = pI
23c50 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  dx->azColl[i];. 
23c60 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c       pKey->aColl
23c70 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3d 3d 73 71 6c  [i] = zColl==sql
23c80 69 74 65 33 53 74 72 42 49 4e 41 52 59 20 3f 20  ite3StrBINARY ? 
23c90 30 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  0 :.            
23ca0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
23cb0 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
23cc0 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b  (pParse, zColl);
23cd0 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f  .      pKey->aSo
23ce0 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64  rtOrder[i] = pId
23cf0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
23d00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
23d10 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
23d20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79        sqlite3Key
23d30 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 29 3b  InfoUnref(pKey);
23d40 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20 30 3b  .      pKey = 0;
23d50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
23d60 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a 23 69 66  urn pKey;.}..#if
23d70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23d80 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  _CTE./* .** This
23d90 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
23da0 6b 65 64 20 6f 6e 63 65 20 70 65 72 20 43 54 45  ked once per CTE
23db0 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
23dc0 68 69 6c 65 20 70 61 72 73 69 6e 67 20 61 20 0a  hile parsing a .
23dd0 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20  ** WITH clause. 
23de0 0a 2a 2f 0a 57 69 74 68 20 2a 73 71 6c 69 74 65  .*/.With *sqlite
23df0 33 57 69 74 68 41 64 64 28 0a 20 20 50 61 72 73  3WithAdd(.  Pars
23e00 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
23e10 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
23e20 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 69 74 68  ontext */.  With
23e30 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20   *pWith,        
23e40 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e 67 20      /* Existing 
23e50 57 49 54 48 20 63 6c 61 75 73 65 2c 20 6f 72 20  WITH clause, or 
23e60 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
23e70 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *pName,         
23e80 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
23e90 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20 2a 2f   common-table */
23ea0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 72  .  ExprList *pAr
23eb0 67 6c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4f 70  glist,     /* Op
23ec0 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 6e 61  tional column na
23ed0 6d 65 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20  me list for the 
23ee0 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63  table */.  Selec
23ef0 74 20 2a 70 51 75 65 72 79 20 20 20 20 20 20 20  t *pQuery       
23f00 20 20 20 2f 2a 20 51 75 65 72 79 20 75 73 65 64     /* Query used
23f10 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
23f20 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  he table */.){. 
23f30 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
23f40 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 57 69 74  Parse->db;.  Wit
23f50 68 20 2a 70 4e 65 77 3b 0a 20 20 63 68 61 72 20  h *pNew;.  char 
23f60 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 43 68  *zName;..  /* Ch
23f70 65 63 6b 20 74 68 61 74 20 74 68 65 20 43 54 45  eck that the CTE
23f80 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 20   name is unique 
23f90 77 69 74 68 69 6e 20 74 68 69 73 20 57 49 54 48  within this WITH
23fa0 20 63 6c 61 75 73 65 2e 20 49 66 0a 20 20 2a 2a   clause. If.  **
23fb0 20 6e 6f 74 2c 20 73 74 6f 72 65 20 61 6e 20 65   not, store an e
23fc0 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73  rror in the Pars
23fd0 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  e structure. */.
23fe0 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
23ff0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
24000 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
24010 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 26  );.  if( zName &
24020 26 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69  & pWith ){.    i
24030 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
24040 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65  0; i<pWith->nCte
24050 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
24060 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
24070 28 7a 4e 61 6d 65 2c 20 70 57 69 74 68 2d 3e 61  (zName, pWith->a
24080 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
24090 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
240a0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
240b0 20 22 64 75 70 6c 69 63 61 74 65 20 57 49 54 48   "duplicate WITH
240c0 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25 73 22   table name: %s"
240d0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
240e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
240f0 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20  f( pWith ){.    
24100 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
24110 6f 66 28 2a 70 57 69 74 68 29 20 2b 20 28 73 69  of(*pWith) + (si
24120 7a 65 6f 66 28 70 57 69 74 68 2d 3e 61 5b 31 5d  zeof(pWith->a[1]
24130 29 20 2a 20 70 57 69 74 68 2d 3e 6e 43 74 65 29  ) * pWith->nCte)
24140 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
24150 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
24160 2c 20 70 57 69 74 68 2c 20 6e 42 79 74 65 29 3b  , pWith, nByte);
24170 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
24180 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
24190 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
241a0 65 6f 66 28 2a 70 57 69 74 68 29 29 3b 0a 20 20  eof(*pWith));.  
241b0 7d 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65  }.  assert( (pNe
241c0 77 21 3d 30 20 26 26 20 7a 4e 61 6d 65 21 3d 30  w!=0 && zName!=0
241d0 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ) || db->mallocF
241e0 61 69 6c 65 64 20 29 3b 0a 0a 20 20 69 66 28 20  ailed );..  if( 
241f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
24200 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
24210 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
24220 2c 20 70 41 72 67 6c 69 73 74 29 3b 0a 20 20 20  , pArglist);.   
24230 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
24240 6c 65 74 65 28 64 62 2c 20 70 51 75 65 72 79 29  lete(db, pQuery)
24250 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
24260 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
24270 20 20 20 20 70 4e 65 77 20 3d 20 70 57 69 74 68      pNew = pWith
24280 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
24290 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74  New->a[pNew->nCt
242a0 65 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 51 75  e].pSelect = pQu
242b0 65 72 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ery;.    pNew->a
242c0 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 43 6f  [pNew->nCte].pCo
242d0 6c 73 20 3d 20 70 41 72 67 6c 69 73 74 3b 0a 20  ls = pArglist;. 
242e0 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
242f0 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20 3d 20 7a  >nCte].zName = z
24300 4e 61 6d 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Name;.    pNew->
24310 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 43  a[pNew->nCte].zC
24320 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70  teErr = 0;.    p
24330 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a 20 20 7d  New->nCte++;.  }
24340 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ..  return pNew;
24350 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
24360 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
24370 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20 70  he With object p
24380 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
24390 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
243a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74  .void sqlite3Wit
243b0 68 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  hDelete(sqlite3 
243c0 2a 64 62 2c 20 57 69 74 68 20 2a 70 57 69 74 68  *db, With *pWith
243d0 29 7b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29  ){.  if( pWith )
243e0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
243f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74   for(i=0; i<pWit
24400 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  h->nCte; i++){. 
24410 20 20 20 20 20 73 74 72 75 63 74 20 43 74 65 20       struct Cte 
24420 2a 70 43 74 65 20 3d 20 26 70 57 69 74 68 2d 3e  *pCte = &pWith->
24430 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[i];.      sqli
24440 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
24450 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 43 6f 6c  e(db, pCte->pCol
24460 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  s);.      sqlite
24470 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
24480 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 29  , pCte->pSelect)
24490 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
244a0 62 46 72 65 65 28 64 62 2c 20 70 43 74 65 2d 3e  bFree(db, pCte->
244b0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
244c0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
244d0 64 62 2c 20 70 57 69 74 68 29 3b 0a 20 20 7d 0a  db, pWith);.  }.
244e0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
244f0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
24500 5f 43 54 45 29 20 2a 2f 0a                       _CTE) */.