/ Hex Artifact Content
Login

Artifact 8b53aacc26944bb7fd9ab5ddeedecb4cc7c4b84df3a420cf6d2b8f772ad421df:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c40: 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1c50: 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44 69  vel==0 );  /* Di
1c60: 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65 6e  sables and re-en
1c70: 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a 20  ables match */. 
1c80: 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d 20     /* A minimum 
1c90: 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20 69 73  of one cursor is
1ca0: 20 72 65 71 75 69 72 65 64 20 69 66 20 61 75 74   required if aut
1cb0: 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75 73  oincrement is us
1cc0: 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20 74 69  ed.    *  See ti
1cd0: 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63 31 66  cket [a696379c1f
1ce0: 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69 66  08866] */.    if
1cf0: 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 21  ( pParse->pAinc!
1d00: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54  =0 && pParse->nT
1d10: 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d 3e  ab==0 ) pParse->
1d20: 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 73 71  nTab = 1;.    sq
1d30: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
1d40: 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b 0a 20  dy(v, pParse);. 
1d50: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
1d60: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
1d70: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65  else{.    pParse
1d80: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
1d90: 52 4f 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ROR;.  }.}../*.*
1da0: 2a 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72  * Run the parser
1db0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
1dc0: 74 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20  tor recursively 
1dd0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65  in order to gene
1de0: 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72  rate.** code for
1df0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
1e00: 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68  nt given onto th
1e10: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61  e end of the pPa
1e20: 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63  rse context.** c
1e30: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
1e40: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68  onstruction.  Wh
1e50: 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73  en the parser is
1e60: 20 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79   run recursively
1e70: 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68  .** this way, th
1e80: 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20  e final OP_Halt 
1e90: 69 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20  is not appended 
1ea0: 61 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61  and other initia
1eb0: 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  lization.** and 
1ec0: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65  finalization ste
1ed0: 70 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62  ps are omitted b
1ee0: 65 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65  ecause those are
1ef0: 20 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65   handling by the
1f00: 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61  .** outermost pa
1f10: 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20  rser..**.** Not 
1f20: 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65  everything is ne
1f30: 73 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61  stable.  This fa
1f40: 63 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e  cility is design
1f50: 65 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20  ed to permit.** 
1f60: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20  INSERT, UPDATE, 
1f70: 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61  and DELETE opera
1f80: 74 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51  tions against SQ
1f90: 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73  LITE_MASTER.  Us
1fa0: 65 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75  e.** care if you
1fb0: 20 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74   decide to try t
1fc0: 6f 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69  o use this routi
1fd0: 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ne for some othe
1fe0: 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76  r purposes..*/.v
1ff0: 6f 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65  oid sqlite3Neste
2000: 64 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50  dParse(Parse *pP
2010: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
2020: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
2030: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
2040: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63   char *zSql;.  c
2050: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
2060: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2070: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2080: 63 68 61 72 20 73 61 76 65 42 75 66 5b 50 41 52  char saveBuf[PAR
2090: 53 45 5f 54 41 49 4c 5f 53 5a 5d 3b 0a 0a 20 20  SE_TAIL_SZ];..  
20a0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
20b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
20c0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73  ert( pParse->nes
20d0: 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65  ted<10 );  /* Ne
20e0: 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c  sting should onl
20f0: 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20  y be of limited 
2100: 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74  depth */.  va_st
2110: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
2120: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
2130: 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a  e3VMPrintf(db, z
2140: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
2150: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
2160: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
2170: 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d  return;   /* A m
2180: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
2190: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  failed */.  }.  
21a0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b  pParse->nested++
21b0: 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42  ;.  memcpy(saveB
21c0: 75 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 28 70  uf, PARSE_TAIL(p
21d0: 50 61 72 73 65 29 2c 20 50 41 52 53 45 5f 54 41  Parse), PARSE_TA
21e0: 49 4c 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74  IL_SZ);.  memset
21f0: 28 50 41 52 53 45 5f 54 41 49 4c 28 70 50 61 72  (PARSE_TAIL(pPar
2200: 73 65 29 2c 20 30 2c 20 50 41 52 53 45 5f 54 41  se), 0, PARSE_TA
2210: 49 4c 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  IL_SZ);.  sqlite
2220: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
2230: 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73  e, zSql, &zErrMs
2240: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
2250: 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
2260: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2270: 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d  e(db, zSql);.  m
2280: 65 6d 63 70 79 28 50 41 52 53 45 5f 54 41 49 4c  emcpy(PARSE_TAIL
2290: 28 70 50 61 72 73 65 29 2c 20 73 61 76 65 42 75  (pParse), saveBu
22a0: 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a  f, PARSE_TAIL_SZ
22b0: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73  );.  pParse->nes
22c0: 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51  ted--;.}..#if SQ
22d0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
22e0: 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52  TICATION./*.** R
22f0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a 54  eturn TRUE if zT
2300: 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65  able is the name
2310: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 74   of the system t
2320: 61 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73  able that stores
2330: 20 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20   the.** list of 
2340: 75 73 65 72 73 20 61 6e 64 20 74 68 65 69 72 20  users and their 
2350: 61 63 63 65 73 73 20 63 72 65 64 65 6e 74 69 61  access credentia
2360: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
2370: 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28  e3UserAuthTable(
2380: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2390: 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  le){.  return sq
23a0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54  lite3_stricmp(zT
23b0: 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75 73  able, "sqlite_us
23c0: 65 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  er")==0;.}.#endi
23d0: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  f../*.** Locate 
23e0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
23f0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
2400: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
2410: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
2420: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
2430: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
2440: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
2450: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
2460: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2470: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
2480: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
2490: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
24a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
24b0: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
24c0: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
24d0: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
24e0: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
24f0: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
2500: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
2510: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
2520: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
2530: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
2540: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
2550: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
2560: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2570: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
2580: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
2590: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
25a0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
25b0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
25c0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
25d0: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
25e0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
25f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
2600: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2610: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
2620: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
2630: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
2640: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  ;..  /* All mute
2650: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2660: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2670: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2680: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
2690: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
26a0: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
26b0: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
26c0: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69 66  texes(db) );.#if
26d0: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
26e0: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f 2a  HENTICATION.  /*
26f0: 20 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e 20   Only the admin 
2700: 75 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20  user is allowed 
2710: 74 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  to know that the
2720: 20 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62   sqlite_user tab
2730: 6c 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20 2a  le.  ** exists *
2740: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68  /.  if( db->auth
2750: 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48  .authLevel<UAUTH
2760: 5f 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74 65  _Admin && sqlite
2770: 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 7a  3UserAuthTable(z
2780: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
2790: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
27a0: 6e 64 69 66 0a 20 20 77 68 69 6c 65 28 31 29 7b  ndif.  while(1){
27b0: 0a 20 20 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  .    for(i=OMIT_
27c0: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
27d0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
27e0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
27f0: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
2800: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
2810: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69 66  MAIN */.      if
2820: 28 20 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 7c  ( zDatabase==0 |
2830: 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  | sqlite3StrICmp
2840: 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e  (zDatabase, db->
2850: 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29  aDb[j].zDbSName)
2860: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
2870: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
2880: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
2890: 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  , j, 0) );.     
28a0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
28b0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b  shFind(&db->aDb[
28c0: 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  j].pSchema->tblH
28d0: 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ash, zName);.   
28e0: 20 20 20 20 20 69 66 28 20 70 20 29 20 72 65 74       if( p ) ret
28f0: 75 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20  urn p;.      }. 
2900: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4e 6f 74 20     }.    /* Not 
2910: 66 6f 75 6e 64 2e 20 20 49 66 20 74 68 65 20 6e  found.  If the n
2920: 61 6d 65 20 77 65 20 77 65 72 65 20 6c 6f 6f 6b  ame we were look
2930: 69 6e 67 20 66 6f 72 20 77 61 73 20 74 65 6d 70  ing for was temp
2940: 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20  .sqlite_master. 
2950: 20 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67     ** then chang
2960: 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 73 71  e the name to sq
2970: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
2980: 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
2990: 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
29a0: 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c  e3StrICmp(zName,
29b0: 20 4d 41 53 54 45 52 5f 4e 41 4d 45 29 21 3d 30   MASTER_NAME)!=0
29c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
29d0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
29e0: 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d  p(zDatabase, db-
29f0: 3e 61 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[1].zDbSName
2a00: 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
2a10: 20 20 7a 4e 61 6d 65 20 3d 20 54 45 4d 50 5f 4d    zName = TEMP_M
2a20: 41 53 54 45 52 5f 4e 41 4d 45 3b 0a 20 20 7d 0a  ASTER_NAME;.  }.
2a30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2a40: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
2a50: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
2a60: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
2a70: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
2a80: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
2a90: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
2aa0: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
2ab0: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
2ac0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
2ad0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
2ae0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
2af0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
2b00: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c  f not found.  Al
2b10: 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65  so leave an.** e
2b20: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
2b30: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
2b40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
2b50: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
2b60: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73  is routine and s
2b70: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2b80: 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
2b90: 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73  * routine leaves
2ba0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2bb0: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
2bc0: 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71  rMsg where.** sq
2bd0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29  lite3FindTable()
2be0: 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61   does not..*/.Ta
2bf0: 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  ble *sqlite3Loca
2c00: 74 65 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  teTable(.  Parse
2c10: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2c20: 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20    /* context in 
2c30: 77 68 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20  which to report 
2c40: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 33 32 20  errors */.  u32 
2c50: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2c60: 20 20 20 2f 2a 20 4c 4f 43 41 54 45 5f 56 49 45     /* LOCATE_VIE
2c70: 57 20 6f 72 20 4c 4f 43 41 54 45 5f 4e 4f 45 52  W or LOCATE_NOER
2c80: 52 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  R */.  const cha
2c90: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  r *zName,     /*
2ca0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
2cb0: 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  le we are lookin
2cc0: 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  g for */.  const
2cd0: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20   char *zDbase   
2ce0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2cf0: 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68   database.  Migh
2d00: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
2d10: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f    Table *p;..  /
2d20: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
2d30: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
2d40: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2d50: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
2d60: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
2d70: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
2d80: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
2d90: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
2da0: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
2db0: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
2dc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2dd0: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
2de0: 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
2df0: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  e->db, zName, zD
2e00: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
2e10: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
2e20: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 66 6c 61 67  har *zMsg = flag
2e30: 73 20 26 20 4c 4f 43 41 54 45 5f 56 49 45 57 20  s & LOCATE_VIEW 
2e40: 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22  ? "no such view"
2e50: 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c   : "no such tabl
2e60: 65 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e";.#ifndef SQLI
2e70: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2e80: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 73 71 6c  ABLE.    if( sql
2e90: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 70  ite3FindDbName(p
2ea0: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 44 62 61 73  Parse->db, zDbas
2eb0: 65 29 3c 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  e)<1 ){.      /*
2ec0: 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 74 68 65   If zName is the
2ed0: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
2ee0: 20 61 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   a table in the 
2ef0: 73 63 68 65 6d 61 20 63 72 65 61 74 65 64 20 75  schema created u
2f00: 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 43 52  sing.      ** CR
2f10: 45 41 54 45 2c 20 74 68 65 6e 20 63 68 65 63 6b  EATE, then check
2f20: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 69 73   to see if it is
2f30: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
2f40: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
2f50: 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20  at.      ** can 
2f60: 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20  be an eponymous 
2f70: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 2a  virtual table. *
2f80: 2f 0a 20 20 20 20 20 20 4d 6f 64 75 6c 65 20 2a  /.      Module *
2f90: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29  pMod = (Module*)
2fa0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2fb0: 26 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4d 6f  &pParse->db->aMo
2fc0: 64 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  dule, zName);.  
2fd0: 20 20 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20      if( pMod==0 
2fe0: 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  && sqlite3_strni
2ff0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67  cmp(zName, "prag
3000: 6d 61 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20  ma_", 7)==0 ){. 
3010: 20 20 20 20 20 20 20 70 4d 6f 64 20 3d 20 73 71         pMod = sq
3020: 6c 69 74 65 33 50 72 61 67 6d 61 56 74 61 62 52  lite3PragmaVtabR
3030: 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2d 3e  egister(pParse->
3040: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
3050: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4d    }.      if( pM
3060: 6f 64 20 26 26 20 73 71 6c 69 74 65 33 56 74 61  od && sqlite3Vta
3070: 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 49  bEponymousTableI
3080: 6e 69 74 28 70 50 61 72 73 65 2c 20 70 4d 6f 64  nit(pParse, pMod
3090: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
30a0: 75 72 6e 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61  urn pMod->pEpoTa
30b0: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
30c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
30d0: 28 66 6c 61 67 73 20 26 20 4c 4f 43 41 54 45 5f  (flags & LOCATE_
30e0: 4e 4f 45 52 52 29 3d 3d 30 20 29 7b 0a 20 20 20  NOERR)==0 ){.   
30f0: 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b     if( zDbase ){
3100: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3110: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3120: 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d   "%s: %s.%s", zM
3130: 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d  sg, zDbase, zNam
3140: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
3150: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3160: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3170: 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c   "%s: %s", zMsg,
3180: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
3190: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
31a0: 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
31b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
31c0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
31d0: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
31e0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 2a   identified by *
31f0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
3200: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
3210: 64 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  d sqlite3LocateT
3220: 61 62 6c 65 28 29 2e 20 54 68 65 20 64 69 66 66  able(). The diff
3230: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a  erence between.*
3240: 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  * sqlite3LocateT
3250: 61 62 6c 65 28 29 20 61 6e 64 20 74 68 69 73 20  able() and this 
3260: 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 61 74  function is that
3270: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
3280: 65 73 74 72 69 63 74 73 0a 2a 2a 20 74 68 65 20  estricts.** the 
3290: 73 65 61 72 63 68 20 74 6f 20 73 63 68 65 6d 61  search to schema
32a0: 20 28 70 2d 3e 70 53 63 68 65 6d 61 29 20 69 66   (p->pSchema) if
32b0: 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e   it is not NULL.
32c0: 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79 20   p->pSchema may 
32d0: 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  be.** non-NULL i
32e0: 66 20 69 74 20 69 73 20 70 61 72 74 20 6f 66 20  f it is part of 
32f0: 61 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65  a view or trigge
3300: 72 20 70 72 6f 67 72 61 6d 20 64 65 66 69 6e 69  r program defini
3310: 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c  tion. See.** sql
3320: 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 29  ite3FixSrcList()
3330: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
3340: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c  .Table *sqlite3L
3350: 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 0a  ocateTableItem(.
3360: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3370: 20 0a 20 20 75 33 32 20 66 6c 61 67 73 2c 0a 20   .  u32 flags,. 
3380: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
3390: 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e  item *p.){.  con
33a0: 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  st char *zDb;.  
33b0: 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65  assert( p->pSche
33c0: 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74  ma==0 || p->zDat
33d0: 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66  abase==0 );.  if
33e0: 28 20 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  ( p->pSchema ){.
33f0: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
3400: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
3410: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
3420: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
3430: 7a 44 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  zDb = pParse->db
3440: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
3450: 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ame;.  }else{.  
3460: 20 20 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61    zDb = p->zData
3470: 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  base;.  }.  retu
3480: 72 6e 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  rn sqlite3Locate
3490: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 66 6c  Table(pParse, fl
34a0: 61 67 73 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a  ags, p->zName, z
34b0: 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  Db);.}../*.** Lo
34c0: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
34d0: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
34e0: 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20  t describes .** 
34f0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
3500: 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  ex given the nam
3510: 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a  e of that index.
3520: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20  ** and the name 
3530: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
3540: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
3550: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75  e index..** Retu
3560: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
3570: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
3580: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
3590: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
35a0: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
35b0: 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74  e.** table and t
35c0: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
35d0: 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72  g index is retur
35e0: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
35f0: 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63  ng.** for duplic
3600: 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  ate index names 
3610: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
3620: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a  earch order is.*
3630: 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  * TEMP first, th
3640: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
3650: 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  y auxiliary data
3660: 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75  bases added.** u
3670: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
3680: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65  command..*/.Inde
3690: 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  x *sqlite3FindIn
36a0: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
36b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
36c0: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
36d0: 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  zDb){.  Index *p
36e0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
36f0: 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20   /* All mutexes 
3700: 61 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  are required for
3710: 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20   schema access. 
3720: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f   Make sure we ho
3730: 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73  ld them. */.  as
3740: 73 65 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20  sert( zDb!=0 || 
3750: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
3760: 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
3770: 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  );.  for(i=OMIT_
3780: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
3790: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  b; i++){.    int
37a0: 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31   j = (i<2) ? i^1
37b0: 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68   : i;  /* Search
37c0: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49   TEMP before MAI
37d0: 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20  N */.    Schema 
37e0: 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  *pSchema = db->a
37f0: 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  Db[j].pSchema;. 
3800: 20 20 20 61 73 73 65 72 74 28 20 70 53 63 68 65     assert( pSche
3810: 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44  ma );.    if( zD
3820: 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  b && sqlite3StrI
3830: 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62  Cmp(zDb, db->aDb
3840: 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29 20 29 20  [j].zDbSName) ) 
3850: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
3860: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
3870: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
3880: 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20   j, 0) );.    p 
3890: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
38a0: 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  d(&pSchema->idxH
38b0: 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ash, zName);.   
38c0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
38d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
38e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d  }../*.** Reclaim
38f0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64   the memory used
3900: 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a   by an index.*/.
3910: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
3920: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
3930: 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 23 69  b, Index *p){.#i
3940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3950: 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69  T_ANALYZE.  sqli
3960: 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61  te3DeleteIndexSa
3970: 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a 23 65  mples(db, p);.#e
3980: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78  ndif.  sqlite3Ex
3990: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
39a0: 70 50 61 72 74 49 64 78 57 68 65 72 65 29 3b 0a  pPartIdxWhere);.
39b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
39c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 61  tDelete(db, p->a
39d0: 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  ColExpr);.  sqli
39e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
39f0: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66 28  >zColAff);.  if(
3a00: 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20 29 20   p->isResized ) 
3a10: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3a20: 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e 61 7a 43  , (void *)p->azC
3a30: 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  oll);.#ifdef SQL
3a40: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
3a50: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 71 6c 69  _OR_STAT4.  sqli
3a60: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f  te3_free(p->aiRo
3a70: 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  wEst);.#endif.  
3a80: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3a90: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  , p);.}../*.** F
3aa0: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c  or the index cal
3ab0: 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69  led zIdxName whi
3ac0: 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  ch is found in t
3ad0: 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c  he database iDb,
3ae0: 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20  .** unlike that 
3af0: 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54  index from its T
3b00: 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65  able then remove
3b10: 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a   the index from.
3b20: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  ** the index has
3b30: 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65  h table and free
3b40: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75   all memory stru
3b50: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
3b60: 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  d.** with the in
3b70: 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  dex..*/.void sql
3b80: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
3b90: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  eteIndex(sqlite3
3ba0: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
3bb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e  onst char *zIdxN
3bc0: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
3bd0: 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20 2a 70  Index;.  Hash *p
3be0: 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28  Hash;..  assert(
3bf0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3c00: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3c10: 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d   0) );.  pHash =
3c20: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70   &db->aDb[iDb].p
3c30: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b  Schema->idxHash;
3c40: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
3c50: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  te3HashInsert(pH
3c60: 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30  ash, zIdxName, 0
3c70: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
3c80: 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69  pIndex) ){.    i
3c90: 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  f( pIndex->pTabl
3ca0: 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65  e->pIndex==pInde
3cb0: 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  x ){.      pInde
3cc0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
3cd0: 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  x = pIndex->pNex
3ce0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
3cf0: 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
3d00: 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61      /* Justifica
3d10: 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29  tion of ALWAYS()
3d20: 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d 75 73  ;  The index mus
3d30: 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69 73 74  t be on the list
3d40: 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64   of.      ** ind
3d50: 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ices. */.      p
3d60: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
3d70: 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  e->pIndex;.     
3d80: 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
3d90: 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70  ) && p->pNext!=p
3da0: 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e  Index ){ p = p->
3db0: 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20 20 69  pNext; }.      i
3dc0: 66 28 20 41 4c 57 41 59 53 28 70 20 26 26 20 70  f( ALWAYS(p && p
3dd0: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29  ->pNext==pIndex)
3de0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   ){.        p->p
3df0: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
3e00: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
3e10: 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65    }.    freeInde
3e20: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
3e30: 20 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67   }.  db->mDbFlag
3e40: 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65  s |= DBFLAG_Sche
3e50: 6d 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a  maChange;.}../*.
3e60: 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20  ** Look through 
3e70: 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e  the list of open
3e80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
3e90: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64  in db->aDb[] and
3ea0: 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20   if.** any have 
3eb0: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d  been closed, rem
3ec0: 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68  ove them from th
3ed0: 65 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63  e list.  Realloc
3ee0: 61 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61  ate the.** db->a
3ef0: 44 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74  Db[] structure t
3f00: 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65  o a smaller size
3f10: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  , if possible..*
3f20: 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68  *.** Entry 0 (th
3f30: 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73  e "main" databas
3f40: 65 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28  e) and entry 1 (
3f50: 74 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62  the "temp" datab
3f60: 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65  ase).** are neve
3f70: 72 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  r candidates for
3f80: 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64   being collapsed
3f90: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3fa0: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
3fb0: 65 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  eArray(sqlite3 *
3fc0: 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  db){.  int i, j;
3fd0: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
3fe0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3ff0: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
4000: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
4010: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
4020: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
4030: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4040: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 3b 0a  pDb->zDbSName);.
4050: 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e        pDb->zDbSN
4060: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ame = 0;.      c
4070: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
4080: 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20     if( j<i ){.  
4090: 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d      db->aDb[j] =
40a0: 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20   db->aDb[i];.   
40b0: 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a   }.    j++;.  }.
40c0: 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20    db->nDb = j;. 
40d0: 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20   if( db->nDb<=2 
40e0: 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e  && db->aDb!=db->
40f0: 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20  aDbStatic ){.   
4100: 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53   memcpy(db->aDbS
4110: 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20  tatic, db->aDb, 
4120: 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62  2*sizeof(db->aDb
4130: 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  [0]));.    sqlit
4140: 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d  e3DbFree(db, db-
4150: 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61  >aDb);.    db->a
4160: 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74  Db = db->aDbStat
4170: 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ic;.  }.}../*.**
4180: 20 52 65 73 65 74 20 74 68 65 20 73 63 68 65 6d   Reset the schem
4190: 61 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  a for the databa
41a0: 73 65 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e  se at index iDb.
41b0: 20 20 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65    Also reset the
41c0: 0a 2a 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e  .** TEMP schema.
41d0: 20 20 54 68 65 20 72 65 73 65 74 20 69 73 20 64    The reset is d
41e0: 65 66 65 72 72 65 64 20 69 66 20 64 62 2d 3e 6e  eferred if db->n
41f0: 53 63 68 65 6d 61 4c 6f 63 6b 20 69 73 20 6e 6f  SchemaLock is no
4200: 74 20 7a 65 72 6f 2e 0a 2a 2a 20 44 65 66 65 72  t zero..** Defer
4210: 72 65 64 20 72 65 73 65 74 73 20 6d 61 79 20 62  red resets may b
4220: 65 20 72 75 6e 20 62 79 20 63 61 6c 6c 69 6e 67  e run by calling
4230: 20 77 69 74 68 20 69 44 62 3c 30 2e 0a 2a 2f 0a   with iDb<0..*/.
4240: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
4250: 74 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74  tOneSchema(sqlit
4260: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29  e3 *db, int iDb)
4270: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
4280: 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
4290: 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62 3e 3d   );..  if( iDb>=
42a0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
42b0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
42c0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
42d0: 20 30 29 20 29 3b 0a 20 20 20 20 44 62 53 65 74   0) );.    DbSet
42e0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62  Property(db, iDb
42f0: 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64  , DB_ResetWanted
4300: 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70  );.    DbSetProp
4310: 65 72 74 79 28 64 62 2c 20 31 2c 20 44 42 5f 52  erty(db, 1, DB_R
4320: 65 73 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 7d  esetWanted);.  }
4330: 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68  ..  if( db->nSch
4340: 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  emaLock==0 ){.  
4350: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
4360: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
4370: 20 20 69 66 28 20 44 62 48 61 73 50 72 6f 70 65    if( DbHasPrope
4380: 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 52 65  rty(db, i, DB_Re
4390: 73 65 74 57 61 6e 74 65 64 29 20 29 7b 0a 20 20  setWanted) ){.  
43a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68        sqlite3Sch
43b0: 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62  emaClear(db->aDb
43c0: 5b 69 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20  [i].pSchema);.  
43d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
43e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61  }../*.** Erase a
43f0: 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d  ll schema inform
4400: 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20 61  ation from all a
4410: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
4420: 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20  s (including.** 
4430: 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65 6d 70  "main" and "temp
4440: 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ") for a single 
4450: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
4460: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
4470: 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65  ite3ResetAllSche
4480: 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28  masOfConnection(
4490: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
44a0: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
44b0: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
44c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
44d0: 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20  >nSchemaLock==0 
44e0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
44f0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
4500: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
4510: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
4520: 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 29  ( pDb->pSchema )
4530: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
4540: 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e  chemaClear(pDb->
4550: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
4560: 20 20 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61    }.  db->mDbFla
4570: 67 73 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63  gs &= ~DBFLAG_Sc
4580: 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 73 71  hemaChange;.  sq
4590: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
45a0: 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ist(db);.  sqlit
45b0: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
45c0: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  db);.  sqlite3Co
45d0: 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72  llapseDatabaseAr
45e0: 72 61 79 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ray(db);.}../*.*
45f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4600: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4610: 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a  commit occurs..*
4620: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
4630: 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
4640: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
4650: 7b 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73  {.  db->mDbFlags
4660: 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63 68 65   &= ~DBFLAG_Sche
4670: 6d 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a  maChange;.}../*.
4680: 2a 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79  ** Delete memory
4690: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
46a0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
46b0: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
46c0: 65 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65  ew (the.** Table
46d0: 2e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a  .aCol[] array)..
46e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
46f0: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
4700: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
4710: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
4720: 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20  int i;.  Column 
4730: 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28  *pCol;.  assert(
4740: 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20   pTable!=0 );.  
4750: 69 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62  if( (pCol = pTab
4760: 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a  le->aCol)!=0 ){.
4770: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
4780: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
4790: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
47a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
47b0: 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  b, pCol->zName);
47c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
47d0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  prDelete(db, pCo
47e0: 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->pDflt);.     
47f0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4800: 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b  b, pCol->zColl);
4810: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4820: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
4830: 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a  ble->aCol);.  }.
4840: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
4850: 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20  the memory data 
4860: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
4870: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
4880: 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20  iven.** Table.  
4890: 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
48a0: 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74  ade to disk by t
48b0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
48c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
48d0: 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65  just deletes the
48e0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e   data structure.
48f0: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e    It does not un
4900: 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c  link.** the tabl
4910: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
4920: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
4930: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
4940: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
4950: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
4960: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
4970: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
4980: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4990: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
49a0: 2a 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72 61  *.** The db para
49b0: 6d 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e 61  meter is optiona
49c0: 6c 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65 64  l.  It is needed
49d0: 20 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f 62   if the Table ob
49e0: 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e  ject .** contain
49f0: 73 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  s lookaside memo
4a00: 72 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a 65  ry.  (Table obje
4a10: 63 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d  cts in the schem
4a20: 61 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  a do not use.** 
4a30: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
4a40: 2c 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65 6d  , but some ephem
4a50: 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63  eral Table objec
4a60: 74 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a  ts do.)  Or the.
4a70: 2a 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72 20  ** db parameter 
4a80: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
4a90: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4aa0: 64 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65  d to measure the
4ab0: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20   memory.** used 
4ac0: 62 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  by the Table obj
4ad0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
4ae0: 6f 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  oid SQLITE_NOINL
4af0: 49 4e 45 20 64 65 6c 65 74 65 54 61 62 6c 65 28  INE deleteTable(
4b00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
4b10: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49  le *pTable){.  I
4b20: 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70  ndex *pIndex, *p
4b30: 4e 65 78 74 3b 0a 0a 23 69 66 64 65 66 20 53 51  Next;..#ifdef SQ
4b40: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
4b50: 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  Record the numbe
4b60: 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  r of outstanding
4b70: 20 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f 63   lookaside alloc
4b80: 61 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d 61  ations in schema
4b90: 20 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72 69   Tables.  ** pri
4ba0: 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20  or to doing any 
4bb0: 66 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f 6e  free() operation
4bc0: 73 2e 20 20 53 69 6e 63 65 20 73 63 68 65 6d 61  s.  Since schema
4bd0: 20 54 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 75   Tables do not u
4be0: 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64  se.  ** lookasid
4bf0: 65 2c 20 74 68 69 73 20 6e 75 6d 62 65 72 20 73  e, this number s
4c00: 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67 65  hould not change
4c10: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b  . */.  int nLook
4c20: 61 73 69 64 65 20 3d 20 30 3b 0a 20 20 69 66 28  aside = 0;.  if(
4c30: 20 64 62 20 26 26 20 28 70 54 61 62 6c 65 2d 3e   db && (pTable->
4c40: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
4c50: 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20  hemeral)==0 ){. 
4c60: 20 20 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20     nLookaside = 
4c70: 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65  sqlite3Lookaside
4c80: 55 73 65 64 28 64 62 2c 20 30 29 3b 0a 20 20 7d  Used(db, 0);.  }
4c90: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65  .#endif..  /* De
4ca0: 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  lete all indices
4cb0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4cc0: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a   this table. */.
4cd0: 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70    for(pIndex = p
4ce0: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
4cf0: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e  Index; pIndex=pN
4d00: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
4d10: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
4d20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
4d30: 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  dex->pSchema==pT
4d40: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 0a 20 20  able->pSchema.  
4d50: 20 20 20 20 20 20 20 7c 7c 20 28 49 73 56 69 72         || (IsVir
4d60: 74 75 61 6c 28 70 54 61 62 6c 65 29 20 26 26 20  tual(pTable) && 
4d70: 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 21  pIndex->idxType!
4d80: 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
4d90: 41 50 50 44 45 46 29 20 29 3b 0a 20 20 20 20 69  APPDEF) );.    i
4da0: 66 28 20 28 64 62 3d 3d 30 20 7c 7c 20 64 62 2d  f( (db==0 || db-
4db0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
4dc0: 29 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  ) && !IsVirtual(
4dd0: 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20  pTable) ){.     
4de0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
4df0: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20  Index->zName; . 
4e00: 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 20 28 20       TESTONLY ( 
4e10: 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20  Index *pOld = ) 
4e20: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
4e30: 74 28 0a 20 20 20 20 20 20 20 20 20 26 70 49 6e  t(.         &pIn
4e40: 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  dex->pSchema->id
4e50: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a  xHash, zName, 0.
4e60: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
4e70: 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20  ssert( db==0 || 
4e80: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
4e90: 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49  exHeld(db, 0, pI
4ea0: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29  ndex->pSchema) )
4eb0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4ec0: 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20  pOld==pIndex || 
4ed0: 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  pOld==0 );.    }
4ee0: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
4ef0: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
4f00: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
4f10: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74   foreign keys at
4f20: 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74  tached to this t
4f30: 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  able. */.  sqlit
4f40: 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70  e3FkDelete(db, p
4f50: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65  Table);..  /* De
4f60: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
4f70: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
4f80: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
4f90: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
4fa0: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
4fb0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4fc0: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
4fd0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
4fe0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43  e(db, pTable->zC
4ff0: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
5000: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
5010: 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
5020: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
5030: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
5040: 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b  pTable->pCheck);
5050: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5060: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
5070: 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43  E.  sqlite3VtabC
5080: 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29  lear(db, pTable)
5090: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
50a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
50b0: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  ble);..  /* Veri
50c0: 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61  fy that no looka
50d0: 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20  side memory was 
50e0: 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74  used by schema t
50f0: 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  ables */.  asser
5100: 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30  t( nLookaside==0
5110: 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d   || nLookaside==
5120: 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65  sqlite3Lookaside
5130: 55 73 65 64 28 64 62 2c 30 29 20 29 3b 0a 7d 0a  Used(db,0) );.}.
5140: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
5150: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
5160: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
5170: 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  le){.  /* Do not
5180: 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c   delete the tabl
5190: 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65  e until the refe
51a0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
51b0: 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69  hes zero. */.  i
51c0: 66 28 20 21 70 54 61 62 6c 65 20 29 20 72 65 74  f( !pTable ) ret
51d0: 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62  urn;.  if( ((!db
51e0: 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46   || db->pnBytesF
51f0: 72 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70  reed==0) && (--p
5200: 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66 29 3e  Table->nTabRef)>
5210: 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
5220: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
5230: 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Table);.}.../*.*
5240: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
5250: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
5260: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
5270: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
5280: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
5290: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
52a0: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
52b0: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
52c0: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
52d0: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
52e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
52f0: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
5300: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
5310: 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44  ble *p;.  Db *pD
5320: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  b;..  assert( db
5330: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
5340: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
5350: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
5360: 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a  rt( zTabName );.
5370: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5380: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
5390: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
53a0: 20 20 74 65 73 74 63 61 73 65 28 20 7a 54 61 62    testcase( zTab
53b0: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f  Name[0]==0 );  /
53c0: 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61  * Zero-length ta
53d0: 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c  ble names are al
53e0: 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d  lowed */.  pDb =
53f0: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
5400: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
5410: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
5420: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
5430: 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  zTabName, 0);.  
5440: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
5450: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d  le(db, p);.  db-
5460: 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46  >mDbFlags |= DBF
5470: 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
5480: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
5490: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
54a0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
54b0: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
54c0: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
54d0: 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  oken.  Space to 
54e0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
54f0: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f  d string.** is o
5500: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
5510: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
5520: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
5530: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
5540: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
5550: 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61  Any quotation ma
5560: 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22  rks (ex:  "name"
5570: 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d  , 'name', [name]
5580: 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61  , or `name`) tha
5590: 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68  t.** surround th
55a0: 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f  e body of the to
55b0: 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e  ken are removed.
55c0: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
55d0: 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69  e often just poi
55e0: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
55f0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
5600: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
5610: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
5620: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
5630: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
5640: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
5650: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
5660: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
5670: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
5680: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
5690: 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a  mToken(sqlite3 *
56a0: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
56b0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
56c0: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  ;.  if( pName ){
56d0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
56e0: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
56f0: 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e  , (char*)pName->
5700: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
5710: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
5720: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  (zName);.  }else
5730: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
5740: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
5750: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ame;.}../*.** Op
5760: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  en the sqlite_ma
5770: 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65  ster table store
5780: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75  d in database nu
5790: 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20  mber iDb for.** 
57a0: 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62  writing. The tab
57b0: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  le is opened usi
57c0: 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  ng cursor 0..*/.
57d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e  void sqlite3Open
57e0: 4d 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73  MasterTable(Pars
57f0: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *p, int iDb){.
5800: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
5810: 74 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20  te3GetVdbe(p);. 
5820: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
5830: 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52  k(p, iDb, MASTER
5840: 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53 54 45 52  _ROOT, 1, MASTER
5850: 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c 69 74 65  _NAME);.  sqlite
5860: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
5870: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
5880: 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  0, MASTER_ROOT, 
5890: 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70  iDb, 5);.  if( p
58a0: 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ->nTab==0 ){.   
58b0: 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20   p->nTab = 1;.  
58c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  }.}../*.** Param
58d0: 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74  eter zName point
58e0: 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69  s to a nul-termi
58f0: 6e 61 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e  nated buffer con
5900: 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
5910: 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73  .** of a databas
5920: 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  e ("main", "temp
5930: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
5940: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
5950: 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
5960: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 69  on returns the i
5970: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65  ndex of the name
5980: 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62  d database in db
5990: 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d  ->aDb[], or.** -
59a0: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
59b0: 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  b cannot be foun
59c0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
59d0: 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69  3FindDbName(sqli
59e0: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
59f0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
5a00: 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20  nt i = -1;      
5a10: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
5a20: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a  umber */.  if( z
5a30: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a  Name ){.    Db *
5a40: 70 44 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28  pDb;.    for(i=(
5a50: 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d  db->nDb-1), pDb=
5a60: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d  &db->aDb[i]; i>=
5a70: 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a  0; i--, pDb--){.
5a80: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
5a90: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 44 62  ite3_stricmp(pDb
5aa0: 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4e 61 6d  ->zDbSName, zNam
5ab0: 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  e) ) break;.    
5ac0: 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69 73 20 61    /* "main" is a
5ad0: 6c 77 61 79 73 20 61 6e 20 61 63 63 65 70 74 61  lways an accepta
5ae0: 62 6c 65 20 61 6c 69 61 73 20 66 6f 72 20 74 68  ble alias for th
5af0: 65 20 70 72 69 6d 61 72 79 20 64 61 74 61 62 61  e primary databa
5b00: 73 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  se.      ** even
5b10: 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20   if it has been 
5b20: 72 65 6e 61 6d 65 64 20 75 73 69 6e 67 20 53 51  renamed using SQ
5b30: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41  LITE_DBCONFIG_MA
5b40: 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a 20 20 20  INDBNAME. */.   
5b50: 20 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20 30     if( i==0 && 0
5b60: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
5b70: 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65 29  p("main", zName)
5b80: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
5b90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
5ba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
5bb0: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
5bc0: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
5bd0: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
5be0: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
5bf0: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
5c00: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
5c10: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
5c20: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
5c30: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
5c40: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
5c50: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
5c60: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
5c70: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
5c80: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  xist..*/.int sql
5c90: 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74  ite3FindDb(sqlit
5ca0: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
5cb0: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Name){.  int i; 
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ce0: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
5cf0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
5d00: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
5d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
5d20: 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68  me we are search
5d30: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61  ing for */.  zNa
5d40: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
5d50: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
5d60: 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69  ame);.  i = sqli
5d70: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
5d80: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
5d90: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
5da0: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ame);.  return i
5db0: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c  ;.}../* The tabl
5dc0: 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69  e or view or tri
5dd0: 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73  gger name is pas
5de0: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
5df0: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a  ine via tokens.*
5e00: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
5e10: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
5e20: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
5e30: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
5e40: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43  example:.**.** C
5e50: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
5e60: 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a  yyy (...);.** .*
5e70: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
5e80: 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e   set to "xxx" an
5e90: 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20  d pName2 "yyy". 
5ea0: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
5eb0: 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d if.** the tabl
5ec0: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
5ed0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
5ee0: 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  .e.:.**.** CREAT
5ef0: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
5f00: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  ;.**.** Then pNa
5f10: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
5f20: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
5f30: 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  s ""..**.** This
5f40: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
5f50: 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e  e *ppUnqual poin
5f60: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
5f70: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
5f80: 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20  1 or.** pName2) 
5f90: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
5fa0: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
5fb0: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64  e name.  The ind
5fc0: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ex of the.** dat
5fd0: 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72  abase "xxx" is r
5fe0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
5ff0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
6000: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
6010: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
6020: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
6030: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
6040: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
6050: 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me1,      /* The
6060: 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61   "xxx" in the na
6070: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20  me "xxx.yyy" or 
6080: 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  "xxx" */.  Token
6090: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f   *pName2,      /
60a0: 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74  * The "yyy" in t
60b0: 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79  he name "xxx.yyy
60c0: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70  " */.  Token **p
60d0: 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72  Unqual     /* Wr
60e0: 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66  ite the unqualif
60f0: 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ied object name 
6100: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
6110: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
6120: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
6130: 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  base holding the
6140: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
6150: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
6160: 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  e->db;..  assert
6170: 28 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b 0a 20  ( pName2!=0 );. 
6180: 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30   if( pName2->n>0
6190: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
61a0: 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20  init.busy ) {.  
61b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
61c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72  Msg(pParse, "cor
61d0: 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b  rupt database");
61e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
61f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e  ;.    }.    *pUn
6200: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20  qual = pName2;. 
6210: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
6220: 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65  FindDb(db, pName
6230: 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  1);.    if( iDb<
6240: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
6250: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6260: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  e, "unknown data
6270: 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31  base %T", pName1
6280: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
6290: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  -1;.    }.  }els
62a0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
62b0: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c  b->init.iDb==0 |
62c0: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 0a  | db->init.busy.
62d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
62e0: 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20  (db->mDbFlags & 
62f0: 44 42 46 4c 41 47 5f 56 61 63 75 75 6d 29 21 3d  DBFLAG_Vacuum)!=
6300: 30 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62  0);.    iDb = db
6310: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
6320: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
6330: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
6340: 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  iDb;.}../*.** Th
6350: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
6360: 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
6370: 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  he UTF-8 string 
6380: 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c  zName is a legal
6390: 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20  .** unqualified 
63a0: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73  name for a new s
63b0: 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61  chema object (ta
63c0: 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77  ble, index, view
63d0: 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e   or.** trigger).
63e0: 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c   All names are l
63f0: 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73  egal except thos
6400: 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  e that begin wit
6410: 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  h the string.** 
6420: 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70  "sqlite_" (in up
6430: 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69  per, lower or mi
6440: 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20  xed case). This 
6450: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  portion of the n
6460: 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72  amespace.** is r
6470: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
6480: 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74  rnal use..*/.int
6490: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a   sqlite3CheckObj
64a0: 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70  ectName(Parse *p
64b0: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
64c0: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
64d0: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
64e0: 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73  it.busy && pPars
64f0: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20  e->nested==0 .  
6500: 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61 72          && (pPar
6510: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
6520: 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
6530: 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ma)==0.         
6540: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
6550: 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  rNICmp(zName, "s
6560: 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20  qlite_", 7) ){. 
6570: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6580: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65  sg(pParse, "obje
6590: 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64  ct name reserved
65a0: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73   for internal us
65b0: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
65c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
65d0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
65e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
65f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6600: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
6610: 20 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62 6c   index of a tabl
6620: 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  e.*/.Index *sqli
6630: 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
6640: 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  ex(Table *pTab){
6650: 0a 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 66  .  Index *p;.  f
6660: 6f 72 28 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65  or(p=pTab->pInde
6670: 78 3b 20 70 20 26 26 20 21 49 73 50 72 69 6d 61  x; p && !IsPrima
6680: 72 79 4b 65 79 49 6e 64 65 78 28 70 29 3b 20 70  ryKeyIndex(p); p
6690: 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 72  =p->pNext){}.  r
66a0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
66b0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6c  * Return the col
66c0: 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64  umn of index pId
66d0: 78 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  x that correspon
66e0: 64 73 20 74 6f 20 74 61 62 6c 65 0a 2a 2a 20 63  ds to table.** c
66f0: 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20 52 65 74  olumn iCol.  Ret
6700: 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74 20 66 6f  urn -1 if not fo
6710: 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c 69  und..*/.i16 sqli
6720: 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
6730: 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 31  (Index *pIdx, i1
6740: 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69  6 iCol){.  int i
6750: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
6760: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
6770: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  +){.    if( iCol
6780: 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
6790: 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  [i] ) return i;.
67a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
67b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
67c0: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e  constructing a n
67d0: 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65  ew table represe
67e0: 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72  ntation in memor
67f0: 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74  y.  This is.** t
6800: 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65  he first of seve
6810: 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  ral action routi
6820: 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c  nes that get cal
6830: 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a  led in response.
6840: 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54  ** to a CREATE T
6850: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
6860: 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20   In particular, 
6870: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
6880: 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20  called.** after 
6890: 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43  seeing tokens "C
68a0: 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c  REATE" and "TABL
68b0: 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  E" and the table
68c0: 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d   name. The isTem
68d0: 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  p.** flag is tru
68e0: 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  e if the table s
68f0: 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
6900: 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
6910: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
6920: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20  e instead of in 
6930: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
6940: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  e file.  This is
6950: 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61   normally the ca
6960: 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22  se.** when the "
6970: 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52  TEMP" or "TEMPOR
6980: 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63  ARY" keyword occ
6990: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a  urs in between.*
69a0: 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42  * CREATE and TAB
69b0: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  LE..**.** The ne
69c0: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  w table record i
69d0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  s initialized an
69e0: 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d  d put in pParse-
69f0: 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41  >pNewTable..** A
6a00: 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52  s more of the CR
6a10: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
6a20: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20  ment is parsed, 
6a30: 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f  additional actio
6a40: 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69  n.** routines wi
6a50: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  ll be called to 
6a60: 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  add more informa
6a70: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63  tion to this rec
6a80: 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ord..** At the e
6a90: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
6aa0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
6ab0: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64  , the sqlite3End
6ac0: 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a  Table() routine.
6ad0: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ** is called to 
6ae0: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e  complete the con
6af0: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65  struction of the
6b00: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
6b10: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
6b20: 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20  e3StartTable(.  
6b30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
6b40: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
6b50: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
6b60: 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73  Name1,   /* Firs
6b70: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  t part of the na
6b80: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
6b90: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  or view */.  Tok
6ba0: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a  en *pName2,   /*
6bb0: 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
6bc0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
6bd0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
6be0: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
6bf0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
6c00: 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61  his is a TEMP ta
6c10: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ble */.  int isV
6c20: 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  iew,      /* Tru
6c30: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
6c40: 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  IEW */.  int isV
6c50: 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75  irtual,   /* Tru
6c60: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
6c70: 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a  IRTUAL table */.
6c80: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
6c90: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
6ca0: 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64   if table alread
6cb0: 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
6cc0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a   Table *pTable;.
6cd0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
6ce0: 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f  0; /* The name o
6cf0: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
6d00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
6d10: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
6d20: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
6d30: 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
6d40: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
6d50: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
6d60: 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ble in */.  Toke
6d70: 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  n *pName;    /* 
6d80: 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
6d90: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
6da0: 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66   create */..  if
6db0: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
6dc0: 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  && db->init.newT
6dd0: 6e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  num==1 ){.    /*
6de0: 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20   Special case:  
6df0: 50 61 72 73 69 6e 67 20 74 68 65 20 73 71 6c 69  Parsing the sqli
6e00: 74 65 5f 6d 61 73 74 65 72 20 6f 72 20 73 71 6c  te_master or sql
6e10: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
6e20: 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69 44  schema */.    iD
6e30: 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  b = db->init.iDb
6e40: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  ;.    zName = sq
6e50: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
6e60: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
6e70: 44 62 29 29 3b 0a 20 20 20 20 70 4e 61 6d 65 20  Db));.    pName 
6e80: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 65 6c 73  = pName1;.  }els
6e90: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  e{.    /* The co
6ea0: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20  mmon case */.   
6eb0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
6ec0: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
6ed0: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
6ee0: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
6ef0: 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
6f00: 6e 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  n;.    if( !OMIT
6f10: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
6f20: 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  p && pName2->n>0
6f30: 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20   && iDb!=1 ){.  
6f40: 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69      /* If creati
6f50: 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c  ng a temp table,
6f60: 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f   the name may no
6f70: 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20  t be qualified. 
6f80: 55 6e 6c 65 73 73 20 0a 20 20 20 20 20 20 2a 2a  Unless .      **
6f90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
6fa0: 6d 65 20 69 73 20 22 74 65 6d 70 22 20 61 6e 79  me is "temp" any
6fb0: 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73  way.  */.      s
6fc0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6fd0: 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72  Parse, "temporar
6fe0: 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73  y table name mus
6ff0: 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64  t be unqualified
7000: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
7010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7020: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
7030: 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31  isTemp ) iDb = 1
7040: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  ;.    zName = sq
7050: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
7060: 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
7070: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61   }.  pParse->sNa
7080: 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65  meToken = *pName
7090: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
70a0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
70b0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
70c0: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
70d0: 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
70e0: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65  ) ){.    goto be
70f0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7100: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69  .  }.  if( db->i
7110: 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54  nit.iDb==1 ) isT
7120: 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  emp = 1;.#ifndef
7130: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
7140: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73  HORIZATION.  ass
7150: 65 72 74 28 20 69 73 54 65 6d 70 3d 3d 30 20 7c  ert( isTemp==0 |
7160: 7c 20 69 73 54 65 6d 70 3d 3d 31 20 29 3b 0a 20  | isTemp==1 );. 
7170: 20 61 73 73 65 72 74 28 20 69 73 56 69 65 77 3d   assert( isView=
7180: 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d 31 20  =0 || isView==1 
7190: 29 3b 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69  );.  {.    stati
71a0: 63 20 63 6f 6e 73 74 20 75 38 20 61 43 6f 64 65  c const u8 aCode
71b0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 53 51  [] = {.       SQ
71c0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
71d0: 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45  E,.       SQLITE
71e0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42  _CREATE_TEMP_TAB
71f0: 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54  LE,.       SQLIT
7200: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 2c 0a 20  E_CREATE_VIEW,. 
7210: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45        SQLITE_CRE
7220: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 0a 20 20  ATE_TEMP_VIEW.  
7230: 20 20 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a    };.    char *z
7240: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
7250: 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
7260: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
7270: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
7280: 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
7290: 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29  MA_TABLE(isTemp)
72a0: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
72b0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
72c0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
72d0: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74  .    if( !isVirt
72e0: 75 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75  ual && sqlite3Au
72f0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
7300: 28 69 6e 74 29 61 43 6f 64 65 5b 69 73 54 65 6d  (int)aCode[isTem
7310: 70 2b 32 2a 69 73 56 69 65 77 5d 2c 0a 20 20 20  p+2*isView],.   
7320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7340: 20 20 20 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44      zName, 0, zD
7350: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
7360: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
7370: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  or;.    }.  }.#e
7380: 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ndif..  /* Make 
7390: 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62  sure the new tab
73a0: 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74  le name does not
73b0: 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e   collide with an
73c0: 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69   existing.  ** i
73d0: 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61  ndex or table na
73e0: 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  me in the same d
73f0: 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65 20  atabase.  Issue 
7400: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
7410: 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73   if.  ** it does
7420: 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20  . The exception 
7430: 69 73 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  is if the statem
7440: 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65 64  ent being parsed
7450: 20 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a   was passed.  **
7460: 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64   to an sqlite3_d
7470: 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61  eclare_vtab() ca
7480: 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ll. In that case
7490: 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   only the column
74a0: 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20   names.  ** and 
74b0: 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73  types will be us
74c0: 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20  ed, so there is 
74d0: 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20  no need to test 
74e0: 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20  for namespace.  
74f0: 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20  ** collisions.. 
7500: 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44 45   */.  if( !IN_DE
7510: 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20  CLARE_VTAB ){.  
7520: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
7530: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
7540: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  ame;.    if( SQL
7550: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
7560: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
7570: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
7580: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
7590: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  r;.    }.    pTa
75a0: 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ble = sqlite3Fin
75b0: 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
75c0: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
75d0: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  pTable ){.      
75e0: 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20  if( !noErr ){.  
75f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7600: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
7610: 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20  able %T already 
7620: 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b  exists", pName);
7630: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7640: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
7650: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
7660: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
7670: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
7680: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
7690: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
76a0: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62    }.      goto b
76b0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
76c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
76d0: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
76e0: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29  (db, zName, zDb)
76f0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
7700: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7710: 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
7720: 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20  lready an index 
7730: 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
7740: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  );.      goto be
7750: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7760: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54  .    }.  }..  pT
7770: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62  able = sqlite3Db
7780: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
7790: 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
77a0: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
77b0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
77c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
77d0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
77e0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
77f0: 42 4b 50 54 3b 0a 20 20 20 20 70 50 61 72 73 65  BKPT;.    pParse
7800: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
7810: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7820: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
7830: 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  le->zName = zNam
7840: 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b  e;.  pTable->iPK
7850: 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c  ey = -1;.  pTabl
7860: 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  e->pSchema = db-
7870: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
7880: 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 54 61  a;.  pTable->nTa
7890: 62 52 65 66 20 3d 20 31 3b 0a 23 69 66 64 65 66  bRef = 1;.#ifdef
78a0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
78b0: 52 4f 57 45 53 54 0a 20 20 70 54 61 62 6c 65 2d  ROWEST.  pTable-
78c0: 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71  >nRowLogEst = sq
78d0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 53 51 4c 49  lite3LogEst(SQLI
78e0: 54 45 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45 53  TE_DEFAULT_ROWES
78f0: 54 29 3b 0a 23 65 6c 73 65 0a 20 20 70 54 61 62  T);.#else.  pTab
7900: 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  le->nRowLogEst =
7910: 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
7920: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
7930: 28 31 30 34 38 35 37 36 29 20 29 3b 0a 23 65 6e  (1048576) );.#en
7940: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 50  dif.  assert( pP
7950: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
7960: 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =0 );.  pParse->
7970: 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62  pNewTable = pTab
7980: 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  le;..  /* If thi
7990: 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73  s is the magic s
79a0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
79b0: 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74  able used by aut
79c0: 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a  oincrement,.  **
79d0: 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70   then record a p
79e0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74  ointer to this t
79f0: 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  able in the main
7a00: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
7a10: 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ure.  ** so that
7a20: 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64   INSERT can find
7a30: 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c   the table easil
7a40: 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
7a50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
7a60: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20  INCREMENT.  if( 
7a70: 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20  !pParse->nested 
7a80: 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  && strcmp(zName,
7a90: 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
7aa0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  e")==0 ){.    as
7ab0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
7ac0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
7ad0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
7ae0: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
7af0: 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c  >pSeqTab = pTabl
7b00: 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
7b10: 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
7b20: 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68  ting the code th
7b30: 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74  at will insert t
7b40: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
7b50: 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51  into.  ** the SQ
7b60: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
7b70: 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74  e.  Note in part
7b80: 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d  icular that we m
7b90: 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a  ust go ahead.  *
7ba0: 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74  * and allocate t
7bb0: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
7bc0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65   for the table e
7bd0: 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72  ntry now.  Befor
7be0: 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41  e any.  ** PRIMA
7bf0: 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
7c00: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61   keywords are pa
7c10: 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79  rsed.  Those key
7c20: 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65  words will cause
7c30: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f  .  ** indices to
7c40: 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20   be created and 
7c50: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
7c60: 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72   must come befor
7c70: 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69  e the .  ** indi
7c80: 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ces.  Hence, the
7c90: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
7ca0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73  or the table mus
7cb0: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20  t be allocated. 
7cc0: 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   ** now..  */.  
7cd0: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
7ce0: 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74  sy && (v = sqlit
7cf0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
7d00: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))!=0 ){.    int
7d10: 20 61 64 64 72 31 3b 0a 20 20 20 20 69 6e 74 20   addr1;.    int 
7d20: 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20  fileFormat;.    
7d30: 69 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20  int reg1, reg2, 
7d40: 72 65 67 33 3b 0a 20 20 20 20 2f 2a 20 6e 75 6c  reg3;.    /* nul
7d50: 6c 52 6f 77 5b 5d 20 69 73 20 61 6e 20 4f 50 5f  lRow[] is an OP_
7d60: 52 65 63 6f 72 64 20 65 6e 63 6f 64 69 6e 67 20  Record encoding 
7d70: 6f 66 20 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e  of a row contain
7d80: 69 6e 67 20 35 20 4e 55 4c 4c 73 20 2a 2f 0a 20  ing 5 NULLs */. 
7d90: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
7da0: 63 68 61 72 20 6e 75 6c 6c 52 6f 77 5b 5d 20 3d  char nullRow[] =
7db0: 20 7b 20 36 2c 20 30 2c 20 30 2c 20 30 2c 20 30   { 6, 0, 0, 0, 0
7dc0: 2c 20 30 20 7d 3b 0a 20 20 20 20 73 71 6c 69 74  , 0 };.    sqlit
7dd0: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
7de0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
7df0: 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
7e00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
7e10: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
7e20: 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20   isVirtual ){.  
7e30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7e40: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67  ddOp0(v, OP_VBeg
7e50: 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  in);.    }.#endi
7e60: 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  f..    /* If the
7e70: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64   file format and
7e80: 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65   encoding in the
7e90: 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20 6e   database have n
7ea0: 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20  ot been set, .  
7eb0: 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f    ** set them no
7ec0: 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  w..    */.    re
7ed0: 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67  g1 = pParse->reg
7ee0: 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
7ef0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32  ->nMem;.    reg2
7f00: 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f   = pParse->regRo
7f10: 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ot = ++pParse->n
7f20: 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d 20  Mem;.    reg3 = 
7f30: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
7f40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7f50: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64  ddOp3(v, OP_Read
7f60: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65 67  Cookie, iDb, reg
7f70: 33 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  3, BTREE_FILE_FO
7f80: 52 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  RMAT);.    sqlit
7f90: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
7fa0: 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 61 64 64  v, iDb);.    add
7fb0: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
7fc0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
7fd0: 20 72 65 67 33 29 3b 20 56 64 62 65 43 6f 76 65   reg3); VdbeCove
7fe0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 66 69 6c  rage(v);.    fil
7ff0: 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66  eFormat = (db->f
8000: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65  lags & SQLITE_Le
8010: 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20  gacyFileFmt)!=0 
8020: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
8030: 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d      1 : SQLITE_M
8040: 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a  AX_FILE_FORMAT;.
8050: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8060: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
8070: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45  ookie, iDb, BTRE
8080: 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 66  E_FILE_FORMAT, f
8090: 69 6c 65 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  ileFormat);.    
80a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
80b0: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
80c0: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 54 45  e, iDb, BTREE_TE
80d0: 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20 45 4e 43  XT_ENCODING, ENC
80e0: 28 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  (db));.    sqlit
80f0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
8100: 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 20 20 2f  , addr1);..    /
8110: 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65 61  * This just crea
8120: 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64  tes a place-hold
8130: 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  er record in the
8140: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
8150: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  able..    ** The
8160: 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64 20   record created 
8170: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
8180: 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20   anything yet.  
8190: 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61  It will be repla
81a0: 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ced.    ** by th
81b0: 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20  e real entry in 
81c0: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 61  code generated a
81d0: 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  t sqlite3EndTabl
81e0: 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
81f0: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
8200: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
8210: 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74  s left in regist
8220: 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  er pParse->regRo
8230: 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  wid..    ** The 
8240: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
8250: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
8260: 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  e is left in reg
8270: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
8280: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  ..    ** The row
8290: 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  id and root page
82a0: 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20 61   number values a
82b0: 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  re needed by the
82c0: 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20 2a   code that.    *
82d0: 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  * sqlite3EndTabl
82e0: 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e  e will generate.
82f0: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  .    */.#if !def
8300: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
8310: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
8320: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
8330: 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
8340: 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69   if( isView || i
8350: 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20  sVirtual ){.    
8360: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8370: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
8380: 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20 20  r, 0, reg2);.   
8390: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
83a0: 20 20 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65    {.      pParse
83b0: 2d 3e 61 64 64 72 43 72 54 61 62 20 3d 0a 20 20  ->addrCrTab =.  
83c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
83d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
83e0: 72 65 61 74 65 42 74 72 65 65 2c 20 69 44 62 2c  reateBtree, iDb,
83f0: 20 72 65 67 32 2c 20 42 54 52 45 45 5f 49 4e 54   reg2, BTREE_INT
8400: 4b 45 59 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  KEY);.    }.    
8410: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
8420: 72 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  rTable(pParse, i
8430: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
8440: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8450: 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 72 65  _NewRowid, 0, re
8460: 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g1);.    sqlite3
8470: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
8480: 5f 42 6c 6f 62 2c 20 36 2c 20 72 65 67 33 2c 20  _Blob, 6, reg3, 
8490: 30 2c 20 6e 75 6c 6c 52 6f 77 2c 20 50 34 5f 53  0, nullRow, P4_S
84a0: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
84b0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
84c0: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72   OP_Insert, 0, r
84d0: 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  eg3, reg1);.    
84e0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
84f0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
8500: 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74  PEND);.    sqlit
8510: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
8520: 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a  OP_Close);.  }..
8530: 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e    /* Normal (non
8540: 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20  -error) return. 
8550: 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  */.  return;..  
8560: 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
8570: 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68  ccurs, we jump h
8580: 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62  ere */.begin_tab
8590: 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  le_error:.  sqli
85a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
85b0: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
85c0: 7d 0a 0a 2f 2a 20 53 65 74 20 70 72 6f 70 65 72  }../* Set proper
85d0: 74 69 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20  ties of a table 
85e0: 63 6f 6c 75 6d 6e 20 62 61 73 65 64 20 6f 6e 20  column based on 
85f0: 74 68 65 20 28 6d 61 67 69 63 61 6c 29 0a 2a 2a  the (magical).**
8600: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   name of the col
8610: 75 6d 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  umn..*/.#if SQLI
8620: 54 45 5f 45 4e 41 42 4c 45 5f 48 49 44 44 45 4e  TE_ENABLE_HIDDEN
8630: 5f 43 4f 4c 55 4d 4e 53 0a 76 6f 69 64 20 73 71  _COLUMNS.void sq
8640: 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65  lite3ColumnPrope
8650: 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 54 61  rtiesFromName(Ta
8660: 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f 6c 75 6d  ble *pTab, Colum
8670: 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20 69 66 28 20  n *pCol){.  if( 
8680: 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
8690: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 22 5f  (pCol->zName, "_
86a0: 5f 68 69 64 64 65 6e 5f 5f 22 2c 20 31 30 29 3d  _hidden__", 10)=
86b0: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e  =0 ){.    pCol->
86c0: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
86d0: 4c 41 47 5f 48 49 44 44 45 4e 3b 0a 20 20 7d 65  LAG_HIDDEN;.  }e
86e0: 6c 73 65 20 69 66 28 20 70 54 61 62 20 26 26 20  lse if( pTab && 
86f0: 70 43 6f 6c 21 3d 70 54 61 62 2d 3e 61 43 6f 6c  pCol!=pTab->aCol
8700: 20 26 26 20 28 70 43 6f 6c 5b 2d 31 5d 2e 63 6f   && (pCol[-1].co
8710: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
8720: 5f 48 49 44 44 45 4e 29 20 29 7b 0a 20 20 20 20  _HIDDEN) ){.    
8730: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
8740: 3d 20 54 46 5f 4f 4f 4f 48 69 64 64 65 6e 3b 0a  = TF_OOOHidden;.
8750: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
8760: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63  *.** Add a new c
8770: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62  olumn to the tab
8780: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
8790: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a  ng constructed..
87a0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
87b0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
87c0: 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ine once for eac
87d0: 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61  h column declara
87e0: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45  tion.** in a CRE
87f0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
8800: 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61  ent.  sqlite3Sta
8810: 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63  rtTable() gets c
8820: 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74  alled.** first t
8830: 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69  o get things goi
8840: 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72  ng.  Then this r
8850: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8860: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c   for each.** col
8870: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
8880: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61  ite3AddColumn(Pa
8890: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
88a0: 65 6e 20 2a 70 4e 61 6d 65 2c 20 54 6f 6b 65 6e  en *pName, Token
88b0: 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c   *pType){.  Tabl
88c0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
88d0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72   char *z;.  char
88e0: 20 2a 7a 54 79 70 65 3b 0a 20 20 43 6f 6c 75 6d   *zType;.  Colum
88f0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74  n *pCol;.  sqlit
8900: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
8910: 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  >db;.  if( (p = 
8920: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
8930: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
8940: 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e    if( p->nCol+1>
8950: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
8960: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
8970: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
8980: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8990: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
89a0: 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d   on %s", p->zNam
89b0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
89c0: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
89d0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
89e0: 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 70 54 79 70   pName->n + pTyp
89f0: 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20 20 69 66 28  e->n + 2);.  if(
8a00: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
8a10: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d    memcpy(z, pNam
8a20: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
8a30: 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20 3d  .  z[pName->n] =
8a40: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71   0;.  sqlite3Deq
8a50: 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69  uote(z);.  for(i
8a60: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
8a70: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
8a80: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 2c 20  ite3_stricmp(z, 
8a90: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
8aa0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
8ab0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8ac0: 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65  arse, "duplicate
8ad0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73   column name: %s
8ae0: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", z);.      sql
8af0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
8b00: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
8b10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
8b20: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
8b30: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
8b40: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
8b50: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
8b60: 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c  lloc(db,p->aCol,
8b70: 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65  (p->nCol+8)*size
8b80: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
8b90: 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30  .    if( aNew==0
8ba0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8bb0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
8bc0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
8bd0: 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20    }.    p->aCol 
8be0: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43  = aNew;.  }.  pC
8bf0: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
8c00: 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCol];.  memset
8c10: 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCol, 0, sizeof
8c20: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
8c30: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
8c40: 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  ;.  sqlite3Colum
8c50: 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e  nPropertiesFromN
8c60: 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a 20 0a  ame(p, pCol);. .
8c70: 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d    if( pType->n==
8c80: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
8c90: 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20  here is no type 
8ca0: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d  specified, colum
8cb0: 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61  ns have the defa
8cc0: 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 20  ult affinity.   
8cd0: 20 2a 2a 20 27 42 4c 4f 42 27 2e 20 2a 2f 0a 20   ** 'BLOB'. */. 
8ce0: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74     pCol->affinit
8cf0: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y = SQLITE_AFF_B
8d00: 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73  LOB;.    pCol->s
8d10: 7a 45 73 74 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  zEst = 1;.  }els
8d20: 65 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 7a  e{.    zType = z
8d30: 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   + sqlite3Strlen
8d40: 33 30 28 7a 29 20 2b 20 31 3b 0a 20 20 20 20 6d  30(z) + 1;.    m
8d50: 65 6d 63 70 79 28 7a 54 79 70 65 2c 20 70 54 79  emcpy(zType, pTy
8d60: 70 65 2d 3e 7a 2c 20 70 54 79 70 65 2d 3e 6e 29  pe->z, pType->n)
8d70: 3b 0a 20 20 20 20 7a 54 79 70 65 5b 70 54 79 70  ;.    zType[pTyp
8d80: 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 73  e->n] = 0;.    s
8d90: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 54  qlite3Dequote(zT
8da0: 79 70 65 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  ype);.    pCol->
8db0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
8dc0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
8dd0: 54 79 70 65 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45  Type, &pCol->szE
8de0: 73 74 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63  st);.    pCol->c
8df0: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
8e00: 41 47 5f 48 41 53 54 59 50 45 3b 0a 20 20 7d 0a  AG_HASTYPE;.  }.
8e10: 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 20 20 70    p->nCol++;.  p
8e20: 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e  Parse->constrain
8e30: 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b 0a 7d 0a 0a  tName.n = 0;.}..
8e40: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
8e50: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
8e60: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
8e70: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
8e80: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
8e90: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
8ea0: 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e  ement.  A "NOT N
8eb0: 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20  ULL" constraint 
8ec0: 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e  has.** been seen
8ed0: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54   on a column.  T
8ee0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
8ef0: 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61   the notNull fla
8f00: 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  g on.** the colu
8f10: 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  mn currently und
8f20: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
8f30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8f40: 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65  AddNotNull(Parse
8f50: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e   *pParse, int on
8f60: 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20  Error){.  Table 
8f70: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
8f80: 6f 6c 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  ol;.  p = pParse
8f90: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
8fa0: 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52  f( p==0 || NEVER
8fb0: 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65  (p->nCol<1) ) re
8fc0: 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26  turn;.  pCol = &
8fd0: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d  p->aCol[p->nCol-
8fe0: 31 5d 3b 0a 20 20 70 43 6f 6c 2d 3e 6e 6f 74 4e  1];.  pCol->notN
8ff0: 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  ull = (u8)onErro
9000: 72 3b 0a 20 20 70 2d 3e 74 61 62 46 6c 61 67 73  r;.  p->tabFlags
9010: 20 7c 3d 20 54 46 5f 48 61 73 4e 6f 74 4e 75 6c   |= TF_HasNotNul
9020: 6c 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  l;..  /* Set the
9030: 20 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 66 6c 61   uniqNotNull fla
9040: 67 20 6f 6e 20 61 6e 79 20 55 4e 49 51 55 45 20  g on any UNIQUE 
9050: 6f 72 20 50 4b 20 69 6e 64 65 78 65 73 20 61 6c  or PK indexes al
9060: 72 65 61 64 79 20 63 72 65 61 74 65 64 0a 20 20  ready created.  
9070: 2a 2a 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d  ** on this colum
9080: 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 6f  n.  */.  if( pCo
9090: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f  l->colFlags & CO
90a0: 4c 46 4c 41 47 5f 55 4e 49 51 55 45 20 29 7b 0a  LFLAG_UNIQUE ){.
90b0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
90c0: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d  .    for(pIdx=p-
90d0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
90e0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
90f0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9100: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31  pIdx->nKeyCol==1
9110: 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f   && pIdx->onErro
9120: 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20  r!=OE_None );.  
9130: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
9140: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 70 2d 3e 6e 43  Column[0]==p->nC
9150: 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  ol-1 ){.        
9160: 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  pIdx->uniqNotNul
9170: 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 1;.      }. 
9180: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
9190: 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d  * Scan the colum
91a0: 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70  n type name zTyp
91b0: 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29  e (length nType)
91c0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a   and return the.
91d0: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66  ** associated af
91e0: 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a  finity type..**.
91f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9200: 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65  does a case-inde
9210: 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f  pendent search o
9220: 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20  f zType for the 
9230: 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69  .** substrings i
9240: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
9250: 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66  table. If one of
9260: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
9270: 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65  is.** found, the
9280: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61   corresponding a
9290: 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72  ffinity is retur
92a0: 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f  ned. If zType co
92b0: 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74  ntains.** more t
92c0: 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  han one of the s
92d0: 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69  ubstrings, entri
92e0: 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f  es toward the to
92f0: 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62  p of .** the tab
9300: 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79  le take priority
9310: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
9320: 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42  f zType is 'BLOB
9330: 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45  INT', .** SQLITE
9340: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20  _AFF_INTEGER is 
9350: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
9360: 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20  Substring     | 
9370: 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d  Affinity.** ----
9380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
93a0: 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20  'INT'         | 
93b0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
93c0: 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20  ER.** 'CHAR'    
93d0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
93e0: 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20  _TEXT.** 'CLOB' 
93f0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
9400: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58  AFF_TEXT.** 'TEX
9410: 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  T'        | SQLI
9420: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
9430: 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53  BLOB'        | S
9440: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 0a 2a  QLITE_AFF_BLOB.*
9450: 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20  * 'REAL'        
9460: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
9470: 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20  L.** 'FLOA'     
9480: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
9490: 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20  REAL.** 'DOUB'  
94a0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
94b0: 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66  FF_REAL.**.** If
94c0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62   none of the sub
94d0: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61  strings in the a
94e0: 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66  bove table are f
94f0: 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ound,.** SQLITE_
9500: 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72  AFF_NUMERIC is r
9510: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72  eturned..*/.char
9520: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
9530: 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Type(const char 
9540: 2a 7a 49 6e 2c 20 75 38 20 2a 70 73 7a 45 73 74  *zIn, u8 *pszEst
9550: 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a  ){.  u32 h = 0;.
9560: 20 20 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c    char aff = SQL
9570: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
9580: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9590: 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Char = 0;..  ass
95a0: 65 72 74 28 20 7a 49 6e 21 3d 30 20 29 3b 0a 20  ert( zIn!=0 );. 
95b0: 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30 5d 20 29   while( zIn[0] )
95c0: 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29  {.    h = (h<<8)
95d0: 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72 54   + sqlite3UpperT
95e0: 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29 26 30 78  oLower[(*zIn)&0x
95f0: 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a  ff];.    zIn++;.
9600: 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27      if( h==(('c'
9610: 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b  <<24)+('h'<<16)+
9620: 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b  ('a'<<8)+'r') ){
9630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9640: 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66  CHAR */.      af
9650: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
9660: 45 58 54 3b 0a 20 20 20 20 20 20 7a 43 68 61 72  EXT;.      zChar
9670: 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d 65 6c 73   = zIn;.    }els
9680: 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c  e if( h==(('c'<<
9690: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
96a0: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20  o'<<8)+'b') ){  
96b0: 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a       /* CLOB */.
96c0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
96d0: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
96e0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
96f0: 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31  't'<<24)+('e'<<1
9700: 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29  6)+('x'<<8)+'t')
9710: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58   ){       /* TEX
9720: 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  T */.      aff =
9730: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
9740: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9750: 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27  h==(('b'<<24)+('
9760: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
9770: 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'b')          /
9780: 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * BLOB */.      
9790: 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54    && (aff==SQLIT
97a0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c  E_AFF_NUMERIC ||
97b0: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
97c0: 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  _REAL) ){.      
97d0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
97e0: 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 69 66 28  _BLOB;.      if(
97f0: 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20 29 20 7a   zIn[0]=='(' ) z
9800: 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23 69 66 6e  Char = zIn;.#ifn
9810: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9820: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
9830: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9840: 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c  (('r'<<24)+('e'<
9850: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c  <16)+('a'<<8)+'l
9860: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ')          /* R
9870: 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  EAL */.        &
9880: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
9890: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
98a0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
98b0: 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65  AFF_REAL;.    }e
98c0: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27  lse if( h==(('f'
98d0: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
98e0: 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20  ('o'<<8)+'a')   
98f0: 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a         /* FLOA *
9900: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
9910: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
9920: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
9930: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
9940: 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EAL;.    }else i
9950: 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29  f( h==(('d'<<24)
9960: 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c  +('o'<<16)+('u'<
9970: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
9980: 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20    /* DOUB */.   
9990: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
99a0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
99b0: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
99c0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
99d0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
99e0: 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46 46   if( (h&0x00FFFF
99f0: 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b  FF)==(('i'<<16)+
9a00: 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('n'<<8)+'t') ){
9a10: 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20      /* INT */.  
9a20: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9a30: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
9a40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9a50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 73  .  }..  /* If ps
9a60: 7a 45 73 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  zEst is not NULL
9a70: 2c 20 73 74 6f 72 65 20 61 6e 20 65 73 74 69 6d  , store an estim
9a80: 61 74 65 20 6f 66 20 74 68 65 20 66 69 65 6c 64  ate of the field
9a90: 20 73 69 7a 65 2e 20 20 54 68 65 0a 20 20 2a 2a   size.  The.  **
9aa0: 20 65 73 74 69 6d 61 74 65 20 69 73 20 73 63 61   estimate is sca
9ab0: 6c 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  led so that the 
9ac0: 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e 74 65 67  size of an integ
9ad0: 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a 20 20 69  er is 1.  */.  i
9ae0: 66 28 20 70 73 7a 45 73 74 20 29 7b 0a 20 20 20  f( pszEst ){.   
9af0: 20 2a 70 73 7a 45 73 74 20 3d 20 31 3b 20 20 20   *pszEst = 1;   
9b00: 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20  /* default size 
9b10: 69 73 20 61 70 70 72 6f 78 20 34 20 62 79 74 65  is approx 4 byte
9b20: 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66  s */.    if( aff
9b30: 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  <SQLITE_AFF_NUME
9b40: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28  RIC ){.      if(
9b50: 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20   zChar ){.      
9b60: 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30    while( zChar[0
9b70: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ] ){.          i
9b80: 66 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  f( sqlite3Isdigi
9b90: 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20  t(zChar[0]) ){. 
9ba0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76             int v
9bb0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
9bc0: 20 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33    sqlite3GetInt3
9bd0: 32 28 7a 43 68 61 72 2c 20 26 76 29 3b 0a 20 20  2(zChar, &v);.  
9be0: 20 20 20 20 20 20 20 20 20 20 76 20 3d 20 76 2f            v = v/
9bf0: 34 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20  4 + 1;.         
9c00: 20 20 20 69 66 28 20 76 3e 32 35 35 20 29 20 76     if( v>255 ) v
9c10: 20 3d 20 32 35 35 3b 0a 20 20 20 20 20 20 20 20   = 255;.        
9c20: 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 76 3b      *pszEst = v;
9c30: 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56 41 52   /* BLOB(k), VAR
9c40: 43 48 41 52 28 6b 29 2c 20 43 48 41 52 28 6b 29  CHAR(k), CHAR(k)
9c50: 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f   -> r=(k/4+1) */
9c60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
9c70: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
9c80: 20 20 20 20 20 20 20 20 20 20 7a 43 68 61 72 2b            zChar+
9c90: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
9ca0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9cb0: 20 20 2a 70 73 7a 45 73 74 20 3d 20 35 3b 20 20    *pszEst = 5;  
9cc0: 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20   /* BLOB, TEXT, 
9cd0: 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28 61 70  CLOB -> r=5  (ap
9ce0: 70 72 6f 78 20 32 30 20 62 79 74 65 73 29 2a 2f  prox 20 bytes)*/
9cf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9d00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b   }.  return aff;
9d10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78  .}../*.** The ex
9d20: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
9d30: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
9d40: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
9d50: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
9d60: 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65  .** of the table
9d70: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
9d80: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
9d90: 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c  *.** Default val
9da0: 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d  ue expressions m
9db0: 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e  ust be constant.
9dc0: 20 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70    Raise an excep
9dd0: 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20  tion if this.** 
9de0: 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e  is not the case.
9df0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9e00: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
9e10: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
9e20: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
9e30: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
9e40: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
9e50: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
9e60: 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c  sqlite3AddDefaul
9e70: 74 56 61 6c 75 65 28 0a 20 20 50 61 72 73 65 20  tValue(.  Parse 
9e80: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
9e90: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
9ea0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
9eb0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
9ec0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
9ed0: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  d expression of 
9ee0: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
9ef0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
9f00: 72 20 2a 7a 53 74 61 72 74 2c 20 20 20 20 20 20  r *zStart,      
9f10: 2f 2a 20 53 74 61 72 74 20 6f 66 20 74 68 65 20  /* Start of the 
9f20: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 74 65  default value te
9f30: 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  xt */.  const ch
9f40: 61 72 20 2a 7a 45 6e 64 20 20 20 20 20 20 20 20  ar *zEnd        
9f50: 20 2f 2a 20 46 69 72 73 74 20 63 68 61 72 61 63   /* First charac
9f60: 74 65 72 20 70 61 73 74 20 65 6e 64 20 6f 66 20  ter past end of 
9f70: 64 65 66 61 75 74 20 76 61 6c 75 65 20 74 65 78  defaut value tex
9f80: 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  t */.){.  Table 
9f90: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
9fa0: 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
9fb0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9fc0: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
9fd0: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
9fe0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20  !=0 ){.    pCol 
9ff0: 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  = &(p->aCol[p->n
a000: 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28  Col-1]);.    if(
a010: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
a020: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
a030: 6e 28 70 45 78 70 72 2c 20 64 62 2d 3e 69 6e 69  n(pExpr, db->ini
a040: 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20  t.busy) ){.     
a050: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a060: 28 70 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c  (pParse, "defaul
a070: 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d  t value of colum
a080: 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f  n [%s] is not co
a090: 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20  nstant",.       
a0a0: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b     pCol->zName);
a0b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a0c0: 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70    /* A copy of p
a0d0: 45 78 70 72 20 69 73 20 75 73 65 64 20 69 6e 73  Expr is used ins
a0e0: 74 65 61 64 20 6f 66 20 74 68 65 20 6f 72 69 67  tead of the orig
a0f0: 69 6e 61 6c 2c 20 61 73 20 70 45 78 70 72 20 63  inal, as pExpr c
a100: 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
a110: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 70 6f 69   tokens that poi
a120: 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d  nt to volatile m
a130: 65 6d 6f 72 79 2e 09 0a 20 20 20 20 20 20 2a 2f  emory...      */
a140: 0a 20 20 20 20 20 20 45 78 70 72 20 78 3b 0a 20  .      Expr x;. 
a150: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
a160: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d  Delete(db, pCol-
a170: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 6d  >pDflt);.      m
a180: 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69 7a  emset(&x, 0, siz
a190: 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20 20 78  eof(x));.      x
a1a0: 2e 6f 70 20 3d 20 54 4b 5f 53 50 41 4e 3b 0a 20  .op = TK_SPAN;. 
a1b0: 20 20 20 20 20 78 2e 75 2e 7a 54 6f 6b 65 6e 20       x.u.zToken 
a1c0: 3d 20 73 71 6c 69 74 65 33 44 62 53 70 61 6e 44  = sqlite3DbSpanD
a1d0: 75 70 28 64 62 2c 20 7a 53 74 61 72 74 2c 20 7a  up(db, zStart, z
a1e0: 45 6e 64 29 3b 0a 20 20 20 20 20 20 78 2e 70 4c  End);.      x.pL
a1f0: 65 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  eft = pExpr;.   
a200: 20 20 20 78 2e 66 6c 61 67 73 20 3d 20 45 50 5f     x.flags = EP_
a210: 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 43 6f 6c  Skip;.      pCol
a220: 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65  ->pDflt = sqlite
a230: 33 45 78 70 72 44 75 70 28 64 62 2c 20 26 78 2c  3ExprDup(db, &x,
a240: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
a250: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
a260: 62 46 72 65 65 28 64 62 2c 20 78 2e 75 2e 7a 54  bFree(db, x.u.zT
a270: 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  oken);.    }.  }
a280: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
a290: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
a2a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77 61  .}../*.** Backwa
a2b0: 72 64 73 20 43 6f 6d 70 61 74 69 62 69 6c 69 74  rds Compatibilit
a2c0: 79 20 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20 48  y Hack:.** .** H
a2d0: 69 73 74 6f 72 69 63 61 6c 20 76 65 72 73 69 6f  istorical versio
a2e0: 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 63 63  ns of SQLite acc
a2f0: 65 70 74 65 64 20 73 74 72 69 6e 67 73 20 61 73  epted strings as
a300: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e   column names in
a310: 0a 2a 2a 20 69 6e 64 65 78 65 73 20 61 6e 64 20  .** indexes and 
a320: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
a330: 74 72 61 69 6e 74 73 20 61 6e 64 20 69 6e 20 55  traints and in U
a340: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
a350: 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  s.  Example:.**.
a360: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
a370: 42 4c 45 20 78 79 7a 28 61 2c 62 2c 63 2c 64 2c  BLE xyz(a,b,c,d,
a380: 65 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 27 61  e,PRIMARY KEY('a
a390: 27 29 2c 55 4e 49 51 55 45 28 27 62 27 2c 27 63  '),UNIQUE('b','c
a3a0: 27 20 43 4f 4c 4c 41 54 45 20 74 72 69 6d 29 0a  ' COLLATE trim).
a3b0: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 49 4e  **     CREATE IN
a3c0: 44 45 58 20 61 62 63 20 4f 4e 20 78 79 7a 28 27  DEX abc ON xyz('
a3d0: 63 27 2c 27 64 27 20 44 45 53 43 2c 27 65 27 20  c','d' DESC,'e' 
a3e0: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 44  COLLATE nocase D
a3f0: 45 53 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ESC);.**.** This
a400: 20 69 73 20 67 6f 6f 66 79 2e 20 20 42 75 74 20   is goofy.  But 
a410: 74 6f 20 70 72 65 73 65 72 76 65 20 62 61 63 6b  to preserve back
a420: 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
a430: 69 74 79 20 77 65 20 63 6f 6e 74 69 6e 75 65 20  ity we continue 
a440: 74 6f 0a 2a 2a 20 61 63 63 65 70 74 20 69 74 2e  to.** accept it.
a450: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64    This routine d
a460: 6f 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  oes the necessar
a470: 79 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 20 20 49  y conversion.  I
a480: 74 20 63 6f 6e 76 65 72 74 73 0a 2a 2a 20 74 68  t converts.** th
a490: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 67 69 76  e expression giv
a4a0: 65 6e 20 69 6e 20 69 74 73 20 61 72 67 75 6d 65  en in its argume
a4b0: 6e 74 20 66 72 6f 6d 20 61 20 54 4b 5f 53 54 52  nt from a TK_STR
a4c0: 49 4e 47 20 69 6e 74 6f 20 61 20 54 4b 5f 49 44  ING into a TK_ID
a4d0: 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72 65  .** if the expre
a4e0: 73 73 69 6f 6e 20 69 73 20 6a 75 73 74 20 61 20  ssion is just a 
a4f0: 54 4b 5f 53 54 52 49 4e 47 20 77 69 74 68 20 61  TK_STRING with a
a500: 6e 20 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c 41  n optional COLLA
a510: 54 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 49 66  TE clause..** If
a520: 20 74 68 65 20 65 70 78 72 65 73 73 69 6f 6e 20   the epxression 
a530: 69 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65  is anything othe
a540: 72 20 74 68 61 6e 20 54 4b 5f 53 54 52 49 4e 47  r than TK_STRING
a550: 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  , the expression
a560: 20 69 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64   is.** unchanged
a570: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a580: 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f   sqlite3StringTo
a590: 49 64 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  Id(Expr *p){.  i
a5a0: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  f( p->op==TK_STR
a5b0: 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 6f 70  ING ){.    p->op
a5c0: 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c 73   = TK_ID;.  }els
a5d0: 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  e if( p->op==TK_
a5e0: 43 4f 4c 4c 41 54 45 20 26 26 20 70 2d 3e 70 4c  COLLATE && p->pL
a5f0: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49  eft->op==TK_STRI
a600: 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 65  NG ){.    p->pLe
a610: 66 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a  ft->op = TK_ID;.
a620: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73    }.}../*.** Des
a630: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
a640: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
a650: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
a660: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
a670: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
a680: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
a690: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
a6a0: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
a6b0: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
a6c0: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
a6d0: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
a6e0: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
a6f0: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
a700: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
a710: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
a720: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
a730: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
a740: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
a750: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
a760: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
a770: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
a780: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
a790: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
a7a0: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
a7b0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
a7c0: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
a7d0: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
a7e0: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
a7f0: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
a800: 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65  s the rowid.  Se
a810: 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65  t the Table.iPKe
a820: 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  y.** field of th
a830: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
a840: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
a850: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
a860: 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
a870: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e  MARY KEY column.
a880: 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73    Table.iPKey is
a890: 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68   set to -1 if th
a8a0: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54  ere is.** no INT
a8b0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
a8c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b  ..**.** If the k
a8d0: 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54  ey is not an INT
a8e0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
a8f0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
a900: 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20  unique.** index 
a910: 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f  for the key.  No
a920: 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
a930: 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52  d for INTEGER PR
a940: 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76  IMARY KEYs..*/.v
a950: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72  oid sqlite3AddPr
a960: 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73  imaryKey(.  Pars
a970: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
a980: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
a990: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
a9a0: 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  pList,  /* List 
a9b0: 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74  of field names t
a9c0: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
a9d0: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
a9e0: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
a9f0: 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e  o with a uniquen
aa00: 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ess conflict */.
aa10: 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20    int autoInc,  
aa20: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
aa30: 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  he AUTOINCREMENT
aa40: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
aa50: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
aa60: 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51  tOrder     /* SQ
aa70: 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53  LITE_SO_ASC or S
aa80: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f  QLITE_SO_DESC */
aa90: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
aaa0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
aab0: 54 61 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20  Table;.  Column 
aac0: 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  *pCol = 0;.  int
aad0: 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20   iCol = -1, i;. 
aae0: 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69 66   int nTerm;.  if
aaf0: 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f  ( pTab==0 ) goto
ab00: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
ab10: 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  t;.  if( pTab->t
ab20: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73  abFlags & TF_Has
ab30: 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20  PrimaryKey ){.  
ab40: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
ab50: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
ab60: 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68   "table \"%s\" h
ab70: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
ab80: 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70   primary key", p
ab90: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
aba0: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
abb0: 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54  y_exit;.  }.  pT
abc0: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
abd0: 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79  TF_HasPrimaryKey
abe0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
abf0: 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
ac00: 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20  Tab->nCol - 1;. 
ac10: 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d     pCol = &pTab-
ac20: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20  >aCol[iCol];.   
ac30: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
ac40: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b  |= COLFLAG_PRIMK
ac50: 45 59 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20  EY;.    nTerm = 
ac60: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
ac70: 6e 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e  nTerm = pList->n
ac80: 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Expr;.    for(i=
ac90: 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29  0; i<nTerm; i++)
aca0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  {.      Expr *pC
acb0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
acc0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c  prSkipCollate(pL
acd0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
ace0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
acf0: 70 43 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  pCExpr!=0 );.   
ad00: 20 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67     sqlite3String
ad10: 54 6f 49 64 28 70 43 45 78 70 72 29 3b 0a 20 20  ToId(pCExpr);.  
ad20: 20 20 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e      if( pCExpr->
ad30: 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20  op==TK_ID ){.   
ad40: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
ad50: 2a 7a 43 4e 61 6d 65 20 3d 20 70 43 45 78 70 72  *zCName = pCExpr
ad60: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
ad70: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
ad80: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
ad90: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
ada0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
adb0: 74 72 49 43 6d 70 28 7a 43 4e 61 6d 65 2c 20 70  trICmp(zCName, p
adc0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
add0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
ade0: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
adf0: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
ae00: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ];.            p
ae10: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col->colFlags |=
ae20: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
ae30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
ae40: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
ae50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ae60: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
ae70: 66 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26  f( nTerm==1.   &
ae80: 26 20 70 43 6f 6c 0a 20 20 20 26 26 20 73 71 6c  & pCol.   && sql
ae90: 69 74 65 33 53 74 72 49 43 6d 70 28 73 71 6c 69  ite3StrICmp(sqli
aea0: 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43  te3ColumnType(pC
aeb0: 6f 6c 2c 22 22 29 2c 20 22 49 4e 54 45 47 45 52  ol,""), "INTEGER
aec0: 22 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72 74  ")==0.   && sort
aed0: 4f 72 64 65 72 21 3d 53 51 4c 49 54 45 5f 53 4f  Order!=SQLITE_SO
aee0: 5f 44 45 53 43 0a 20 20 29 7b 0a 20 20 20 20 70  _DESC.  ){.    p
aef0: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f  Tab->iPKey = iCo
af00: 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79  l;.    pTab->key
af10: 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72  Conf = (u8)onErr
af20: 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  or;.    assert( 
af30: 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75  autoInc==0 || au
af40: 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  toInc==1 );.    
af50: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
af60: 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74  = autoInc*TF_Aut
af70: 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 20 20  oincrement;.    
af80: 69 66 28 20 70 4c 69 73 74 20 29 20 70 50 61 72  if( pList ) pPar
af90: 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72  se->iPkSortOrder
afa0: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73   = pList->a[0].s
afb0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 65 6c 73  ortOrder;.  }els
afc0: 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b  e if( autoInc ){
afd0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
afe0: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
aff0: 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  NT.    sqlite3Er
b000: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
b010: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73  AUTOINCREMENT is
b020: 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e   only allowed on
b030: 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e   an ".       "IN
b040: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
b050: 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  Y");.#endif.  }e
b060: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
b070: 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72  CreateIndex(pPar
b080: 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69  se, 0, 0, 0, pLi
b090: 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a  st, onError, 0,.
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0b0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 6f             0, so
b0c0: 72 74 4f 72 64 65 72 2c 20 30 2c 20 53 51 4c 49  rtOrder, 0, SQLI
b0d0: 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41  TE_IDXTYPE_PRIMA
b0e0: 52 59 4b 45 59 29 3b 0a 20 20 20 20 70 4c 69 73  RYKEY);.    pLis
b0f0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d  t = 0;.  }..prim
b100: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20  ary_key_exit:.  
b110: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
b120: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
b130: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  , pList);.  retu
b140: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rn;.}../*.** Add
b150: 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e   a new CHECK con
b160: 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74  straint to the t
b170: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
b180: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
b190: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
b1a0: 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72  e3AddCheckConstr
b1b0: 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
b1c0: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
b1d0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
b1e0: 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78    Expr *pCheckEx
b1f0: 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b  pr  /* The check
b200: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29   expression */.)
b210: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
b220: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61  _OMIT_CHECK.  Ta
b230: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
b240: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
b250: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b260: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
b270: 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43   pTab && !IN_DEC
b280: 4c 41 52 45 5f 56 54 41 42 0a 20 20 20 26 26 20  LARE_VTAB.   && 
b290: 21 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52  !sqlite3BtreeIsR
b2a0: 65 61 64 6f 6e 6c 79 28 64 62 2d 3e 61 44 62 5b  eadonly(db->aDb[
b2b0: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e 70 42  db->init.iDb].pB
b2c0: 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 61 62  t).  ){.    pTab
b2d0: 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74  ->pCheck = sqlit
b2e0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
b2f0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70  (pParse, pTab->p
b300: 43 68 65 63 6b 2c 20 70 43 68 65 63 6b 45 78 70  Check, pCheckExp
b310: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72  r);.    if( pPar
b320: 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61  se->constraintNa
b330: 6d 65 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73 71  me.n ){.      sq
b340: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
b350: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 54 61  Name(pParse, pTa
b360: 62 2d 3e 70 43 68 65 63 6b 2c 20 26 70 50 61 72  b->pCheck, &pPar
b370: 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61  se->constraintNa
b380: 6d 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  me, 1);.    }.  
b390: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
b3a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
b3b0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
b3c0: 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a  b, pCheckExpr);.
b3d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
b3e0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
b3f0: 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  unction of the m
b400: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72  ost recently par
b410: 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  sed table column
b420: 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53  .** to the CollS
b430: 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69  eq given..*/.voi
b440: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c  d sqlite3AddColl
b450: 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70  ateType(Parse *p
b460: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  Parse, Token *pT
b470: 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a  oken){.  Table *
b480: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
b490: 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20  ar *zColl;      
b4a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f          /* Dequo
b4b0: 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c  ted name of coll
b4c0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a  ation sequence *
b4d0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
b4e0: 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ..  if( (p = pPa
b4f0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
b500: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
b510: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
b520: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
b530: 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  zColl = sqlit
b540: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
b550: 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69  db, pToken);.  i
b560: 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75  f( !zColl ) retu
b570: 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  rn;..  if( sqlit
b580: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
b590: 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29  pParse, zColl) )
b5a0: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
b5b0: 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  x;.    sqlite3Db
b5c0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  Free(db, p->aCol
b5d0: 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  [i].zColl);.    
b5e0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c  p->aCol[i].zColl
b5f0: 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20   = zColl;.  .   
b600: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
b610: 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61 73  n is declared as
b620: 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59   "<name> PRIMARY
b630: 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79   KEY COLLATE <ty
b640: 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65  pe>",.    ** the
b650: 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68  n an index may h
b660: 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64  ave been created
b670: 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20   on this column 
b680: 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a  before the.    *
b690: 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65  * collation type
b6a0: 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72   was added. Corr
b6b0: 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20 69  ect this if it i
b6c0: 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20  s the case..    
b6d0: 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  */.    for(pIdx=
b6e0: 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
b6f0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
b700: 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t){.      assert
b710: 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d  ( pIdx->nKeyCol=
b720: 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =1 );.      if( 
b730: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
b740: 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==i ){.        
b750: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20  pIdx->azColl[0] 
b760: 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  = p->aCol[i].zCo
b770: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
b780: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
b790: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
b7a0: 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a   zColl);.  }.}..
b7b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b7c0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
b7d0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
b7e0: 63 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ce for database 
b7f0: 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65  native text.** e
b800: 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69  ncoding identifi
b810: 65 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67  ed by the string
b820: 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e   zName, length n
b830: 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Name..**.** If t
b840: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
b850: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
b860: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
b870: 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62  , or not availab
b880: 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  le.** in the dat
b890: 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63  abase native enc
b8a0: 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61  oding, the colla
b8b0: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20  tion factory is 
b8c0: 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65  invoked to.** re
b8d0: 71 75 65 73 74 20 69 74 2e 20 49 66 20 74 68 65  quest it. If the
b8e0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
b8f0: 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ry does not supp
b900: 6c 79 20 73 75 63 68 20 61 20 73 65 71 75 65 6e  ly such a sequen
b910: 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  ce,.** and the s
b920: 65 71 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c  equence is avail
b930: 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20  able in another 
b940: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74  text encoding, t
b950: 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72  hen that is.** r
b960: 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e  eturned instead.
b970: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72  .**.** If no ver
b980: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71  sions of the req
b990: 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  uested collation
b9a0: 73 20 73 65 71 75 65 6e 63 65 20 61 72 65 20 61  s sequence are a
b9b0: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20  vailable, or.** 
b9c0: 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63  another error oc
b9d0: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
b9e0: 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72  turned and an er
b9f0: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74  ror message writ
ba00: 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72  ten into.** pPar
ba10: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
ba20: 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72 61 70  outine is a wrap
ba30: 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
ba40: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e  e3FindCollSeq().
ba50: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
ba60: 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f  * invokes the co
ba70: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
ba80: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c  if the named col
ba90: 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  lation cannot be
baa0: 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65   found.** and ge
bab0: 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72  nerates an error
bac0: 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   message..**.** 
bad0: 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65  See also: sqlite
bae0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20  3FindCollSeq(), 
baf0: 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65  sqlite3GetCollSe
bb00: 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a  q().*/.CollSeq *
bb10: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
bb20: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
bb30: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
bb40: 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65  zName){.  sqlite
bb50: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
bb60: 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45  db;.  u8 enc = E
bb70: 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69  NC(db);.  u8 ini
bb80: 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74  tbusy = db->init
bb90: 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71  .busy;.  CollSeq
bba0: 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c   *pColl;..  pCol
bbb0: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
bbc0: 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20  ollSeq(db, enc, 
bbd0: 7a 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29  zName, initbusy)
bbe0: 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73  ;.  if( !initbus
bbf0: 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20  y && (!pColl || 
bc00: 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b  !pColl->xCmp) ){
bc10: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
bc20: 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70  ite3GetCollSeq(p
bc30: 50 61 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c  Parse, enc, pCol
bc40: 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a  l, zName);.  }..
bc50: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
bc60: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
bc70: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
bc80: 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  l increment the 
bc90: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a  schema cookie..*
bca0: 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20  *.** The schema 
bcb0: 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74  cookie is used t
bcc0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e  o determine when
bcd0: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
bce0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
bcf0: 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20  changes.  After 
bd00: 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e  each schema chan
bd10: 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  ge, the cookie v
bd20: 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  alue.** changes.
bd30: 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73    When a process
bd40: 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65   first reads the
bd50: 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72   schema it recor
bd60: 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65  ds the.** cookie
bd70: 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77  .  Thereafter, w
bd80: 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20  henever it goes 
bd90: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
bda0: 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68  tabase,.** it ch
bdb0: 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  ecks the cookie 
bdc0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
bdd0: 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20   schema has not 
bde0: 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65  changed.** since
bdf0: 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61   it was last rea
be00: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c  d..**.** This pl
be10: 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65  an is not comple
be20: 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f  tely bullet-proo
be30: 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62  f.  It is possib
be40: 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63  le for.** the sc
be50: 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d  hema to change m
be60: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e  ultiple times an
be70: 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65  d for the cookie
be80: 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61   to be.** set ba
be90: 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75  ck to prior valu
bea0: 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63  e.  But schema c
beb0: 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65  hanges are infre
bec0: 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65  quent.** and the
bed0: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
bee0: 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65  hitting the same
bef0: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73   cookie value is
bf00: 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63   only.** 1 chanc
bf10: 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77  e in 2^32.  So w
bf20: 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68  e're safe enough
bf30: 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e  ..**.** IMPLEMEN
bf40: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 33 34 32  TATION-OF: R-342
bf50: 33 30 2d 35 36 30 34 39 20 53 51 4c 69 74 65 20  30-56049 SQLite 
bf60: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69 6e  automatically in
bf70: 63 72 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20  crements.** the 
bf80: 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 77  schema-version w
bf90: 68 65 6e 65 76 65 72 20 74 68 65 20 73 63 68 65  henever the sche
bfa0: 6d 61 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a 76  ma changes..*/.v
bfb0: 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67  oid sqlite3Chang
bfc0: 65 43 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70  eCookie(Parse *p
bfd0: 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
bfe0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
bff0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
c000: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
c010: 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
c020: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
c030: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
c040: 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  , 0) );.  sqlite
c050: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
c060: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
c070: 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56  , BTREE_SCHEMA_V
c080: 45 52 53 49 4f 4e 2c 20 0a 20 20 20 20 20 20 20  ERSION, .       
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d               db-
c0a0: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
c0b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
c0c0: 2b 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65  +1);.}../*.** Me
c0d0: 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72  asure the number
c0e0: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e   of characters n
c0f0: 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20  eeded to output 
c100: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65  the given.** ide
c110: 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75  ntifier.  The nu
c120: 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e  mber returned in
c130: 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65  cludes any quote
c140: 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f  s used.** but do
c150: 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74  es not include t
c160: 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74  he null terminat
c170: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73  or..**.** The es
c180: 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72  timate is conser
c190: 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68  vative.  It migh
c1a0: 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 74  t be larger that
c1b0: 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c   what is.** real
c1c0: 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  ly needed..*/.st
c1d0: 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65  atic int identLe
c1e0: 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  ngth(const char 
c1f0: 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *z){.  int n;.  
c200: 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b  for(n=0; *z; n++
c210: 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , z++){.    if( 
c220: 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20  *z=='"' ){ n++; 
c230: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
c240: 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   + 2;.}../*.** T
c250: 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74  he first paramet
c260: 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
c270: 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75 66  to an output buf
c280: 66 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  fer. The second 
c290: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
c2a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
c2b0: 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 63 6f   integer that co
c2c0: 6e 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73 65  ntains the offse
c2d0: 74 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f  t at.** which to
c2e0: 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20   write into the 
c2f0: 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54  output buffer. T
c300: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70  his function cop
c310: 69 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74  ies the.** nul-t
c320: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
c330: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
c340: 68 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74  he third paramet
c350: 65 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e 74  er, zSignedIdent
c360: 2c 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65 63  ,.** to the spec
c370: 69 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e 20  ified offset in 
c380: 74 68 65 20 62 75 66 66 65 72 20 61 6e 64 20 75  the buffer and u
c390: 70 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f 20  pdates *pIdx to 
c3a0: 72 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  refer.** to the 
c3b0: 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72  first byte after
c3c0: 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 77   the last byte w
c3d0: 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72 65  ritten before re
c3e0: 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20  turning..** .** 
c3f0: 49 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53  If the string zS
c400: 69 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73 69  ignedIdent consi
c410: 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
c420: 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a  alpha-numeric.**
c430: 20 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f 65   characters, doe
c440: 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68  s not begin with
c450: 20 61 20 64 69 67 69 74 20 61 6e 64 20 69 73 20   a digit and is 
c460: 6e 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f  not an SQL keywo
c470: 72 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69  rd,.** then it i
c480: 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20  s copied to the 
c490: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 65 78  output buffer ex
c4a0: 61 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e 20  actly as it is. 
c4b0: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74  Otherwise,.** it
c4c0: 20 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e 67   is quoted using
c4d0: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a   double-quotes..
c4e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
c4f0: 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c  dentPut(char *z,
c500: 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72   int *pIdx, char
c510: 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b   *zSignedIdent){
c520: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
c530: 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69   *zIdent = (unsi
c540: 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e  gned char*)zSign
c550: 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69  edIdent;.  int i
c560: 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a  , j, needQuote;.
c570: 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20    i = *pIdx;..  
c580: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
c590: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  j]; j++){.    if
c5a0: 28 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75  ( !sqlite3Isalnu
c5b0: 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20  m(zIdent[j]) && 
c5c0: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29  zIdent[j]!='_' )
c5d0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65   break;.  }.  ne
c5e0: 65 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65  edQuote = sqlite
c5f0: 33 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b  3Isdigit(zIdent[
c600: 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0]).            
c610: 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72  || sqlite3Keywor
c620: 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29  dCode(zIdent, j)
c630: 21 3d 54 4b 5f 49 44 0a 20 20 20 20 20 20 20 20  !=TK_ID.        
c640: 20 20 20 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d      || zIdent[j]
c650: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
c660: 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28 20  || j==0;..  if( 
c670: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
c680: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28  +] = '"';.  for(
c690: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
c6a0: 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d  j++){.    z[i++]
c6b0: 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20   = zIdent[j];.  
c6c0: 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d    if( zIdent[j]=
c6d0: 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  ='"' ) z[i++] = 
c6e0: 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  '"';.  }.  if( n
c6f0: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
c700: 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20  ] = '"';.  z[i] 
c710: 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69  = 0;.  *pIdx = i
c720: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
c730: 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42  ate a CREATE TAB
c740: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70  LE statement app
c750: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
c760: 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e   given.** table.
c770: 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64    Memory to hold
c780: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
c790: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62   statement is ob
c7a0: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73  tained.** from s
c7b0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
c7c0: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
c7d0: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
c7e0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
c7f0: 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54  ic char *createT
c800: 61 62 6c 65 53 74 6d 74 28 73 71 6c 69 74 65 33  ableStmt(sqlite3
c810: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b   *db, Table *p){
c820: 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a  .  int i, k, n;.
c830: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
c840: 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53   char *zSep, *zS
c850: 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f  ep2, *zEnd;.  Co
c860: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20  lumn *pCol;.  n 
c870: 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20  = 0;.  for(pCol 
c880: 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  = p->aCol, i=0; 
c890: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
c8a0: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b  pCol++){.    n +
c8b0: 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43  = identLength(pC
c8c0: 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a  ol->zName) + 5;.
c8d0: 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74    }.  n += ident
c8e0: 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29  Length(p->zName)
c8f0: 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 20  ;.  if( n<50 ){ 
c900: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a  .    zSep = "";.
c910: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b      zSep2 = ",";
c920: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b  .    zEnd = ")";
c930: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53  .  }else{.    zS
c940: 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20  ep = "\n  ";.   
c950: 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22   zSep2 = ",\n  "
c960: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e  ;.    zEnd = "\n
c970: 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33  )";.  }.  n += 3
c980: 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20  5 + 6*p->nCol;. 
c990: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
c9a0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e  DbMallocRaw(0, n
c9b0: 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d  );.  if( zStmt==
c9c0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
c9d0: 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
c9e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
c9f0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
ca00: 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52  tf(n, zStmt, "CR
ca10: 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20  EATE TABLE ");. 
ca20: 20 6b 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   k = sqlite3Strl
ca30: 65 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69  en30(zStmt);.  i
ca40: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
ca50: 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  k, p->zName);.  
ca60: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27  zStmt[k++] = '('
ca70: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e  ;.  for(pCol=p->
ca80: 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e  aCol, i=0; i<p->
ca90: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
caa0: 2b 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  +){.    static c
cab0: 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73  onst char * cons
cac0: 74 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20  t azType[] = {. 
cad0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
cae0: 5f 41 46 46 5f 42 4c 4f 42 20 20 20 20 2a 2f 20  _AFF_BLOB    */ 
caf0: 22 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  "",.        /* S
cb00: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20  QLITE_AFF_TEXT  
cb10: 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20    */ " TEXT",.  
cb20: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
cb30: 41 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22  AFF_NUMERIC */ "
cb40: 20 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f   NUM",.        /
cb50: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  * SQLITE_AFF_INT
cb60: 45 47 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a  EGER */ " INT",.
cb70: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
cb80: 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f  E_AFF_REAL    */
cb90: 20 22 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a   " REAL".    };.
cba0: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
cbb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
cbc0: 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  pe;..    sqlite3
cbd0: 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26  _snprintf(n-k, &
cbe0: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b  zStmt[k], zSep);
cbf0: 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65  .    k += sqlite
cc00: 33 53 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74  3Strlen30(&zStmt
cc10: 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d  [k]);.    zSep =
cc20: 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e   zSep2;.    iden
cc30: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
cc40: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
cc50: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
cc60: 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f  affinity-SQLITE_
cc70: 41 46 46 5f 42 4c 4f 42 20 3e 3d 20 30 20 29 3b  AFF_BLOB >= 0 );
cc80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f  .    assert( pCo
cc90: 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49  l->affinity-SQLI
cca0: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3c 20 41 72  TE_AFF_BLOB < Ar
ccb0: 72 61 79 53 69 7a 65 28 61 7a 54 79 70 65 29 20  raySize(azType) 
ccc0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
ccd0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
cce0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
ccf0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
cd00: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
cd10: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
cd20: 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  T );.    testcas
cd30: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
cd40: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  y==SQLITE_AFF_NU
cd50: 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 74 65 73  MERIC );.    tes
cd60: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
cd70: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
cd80: 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20  F_INTEGER );.   
cd90: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
cda0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
cdb0: 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20  E_AFF_REAL );.  
cdc0: 20 20 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 61    .    zType = a
cdd0: 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69  zType[pCol->affi
cde0: 6e 69 74 79 20 2d 20 53 51 4c 49 54 45 5f 41 46  nity - SQLITE_AF
cdf0: 46 5f 42 4c 4f 42 5d 3b 0a 20 20 20 20 6c 65 6e  F_BLOB];.    len
ce00: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
ce10: 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 61  30(zType);.    a
ce20: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66  ssert( pCol->aff
ce30: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
ce40: 46 5f 42 4c 4f 42 20 0a 20 20 20 20 20 20 20 20  F_BLOB .        
ce50: 20 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66      || pCol->aff
ce60: 69 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33 41 66  inity==sqlite3Af
ce70: 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65  finityType(zType
ce80: 2c 20 30 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63  , 0) );.    memc
ce90: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54  py(&zStmt[k], zT
cea0: 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b  ype, len);.    k
ceb0: 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73   += len;.    ass
cec0: 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d  ert( k<=n );.  }
ced0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
cee0: 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b  ntf(n-k, &zStmt[
cef0: 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b  k], "%s", zEnd);
cf00: 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b  .  return zStmt;
cf10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65  .}../*.** Resize
cf20: 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   an Index object
cf30: 20 74 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d   to hold N colum
cf40: 6e 73 20 74 6f 74 61 6c 2e 20 20 52 65 74 75 72  ns total.  Retur
cf50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
cf60: 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 53 51  n success and SQ
cf70: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e  LITE_NOMEM on an
cf80: 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73   OOM error..*/.s
cf90: 74 61 74 69 63 20 69 6e 74 20 72 65 73 69 7a 65  tatic int resize
cfa0: 49 6e 64 65 78 4f 62 6a 65 63 74 28 73 71 6c 69  IndexObject(sqli
cfb0: 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a  te3 *db, Index *
cfc0: 70 49 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  pIdx, int N){.  
cfd0: 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20  char *zExtra;.  
cfe0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28  int nByte;.  if(
cff0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
d000: 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  N ) return SQLIT
d010: 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
d020: 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d  pIdx->isResized=
d030: 3d 30 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20  =0 );.  nByte = 
d040: 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b  (sizeof(char*) +
d050: 20 73 69 7a 65 6f 66 28 69 31 36 29 20 2b 20 31   sizeof(i16) + 1
d060: 29 2a 4e 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20  )*N;.  zExtra = 
d070: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
d080: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
d090: 20 20 69 66 28 20 7a 45 78 74 72 61 3d 3d 30 20    if( zExtra==0 
d0a0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
d0b0: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65  NOMEM_BKPT;.  me
d0c0: 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64  mcpy(zExtra, pId
d0d0: 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f  x->azColl, sizeo
d0e0: 66 28 63 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e  f(char*)*pIdx->n
d0f0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d  Column);.  pIdx-
d100: 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74  >azColl = (const
d110: 20 63 68 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a   char**)zExtra;.
d120: 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65    zExtra += size
d130: 6f 66 28 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d  of(char*)*N;.  m
d140: 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49  emcpy(zExtra, pI
d150: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69  dx->aiColumn, si
d160: 7a 65 6f 66 28 69 31 36 29 2a 70 49 64 78 2d 3e  zeof(i16)*pIdx->
d170: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78  nColumn);.  pIdx
d180: 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31  ->aiColumn = (i1
d190: 36 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78  6*)zExtra;.  zEx
d1a0: 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31  tra += sizeof(i1
d1b0: 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a  6)*N;.  memcpy(z
d1c0: 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f  Extra, pIdx->aSo
d1d0: 72 74 4f 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e  rtOrder, pIdx->n
d1e0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d  Column);.  pIdx-
d1f0: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
d200: 38 2a 29 7a 45 78 74 72 61 3b 0a 20 20 70 49 64  8*)zExtra;.  pId
d210: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a  x->nColumn = N;.
d220: 20 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65    pIdx->isResize
d230: 64 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  d = 1;.  return 
d240: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d250: 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
d260: 20 74 6f 74 61 6c 20 72 6f 77 20 77 69 64 74 68   total row width
d270: 20 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f   for a table..*/
d280: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 73 74  .static void est
d290: 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28  imateTableWidth(
d2a0: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
d2b0: 75 6e 73 69 67 6e 65 64 20 77 54 61 62 6c 65 20  unsigned wTable 
d2c0: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  = 0;.  const Col
d2d0: 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20  umn *pTabCol;.  
d2e0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70  int i;.  for(i=p
d2f0: 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43  Tab->nCol, pTabC
d300: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
d310: 3e 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c  >0; i--, pTabCol
d320: 2b 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c 65 20  ++){.    wTable 
d330: 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73  += pTabCol->szEs
d340: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  t;.  }.  if( pTa
d350: 62 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77 54 61  b->iPKey<0 ) wTa
d360: 62 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73  ble++;.  pTab->s
d370: 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65  zTabRow = sqlite
d380: 33 4c 6f 67 45 73 74 28 77 54 61 62 6c 65 2a 34  3LogEst(wTable*4
d390: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  );.}../*.** Esti
d3a0: 6d 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65  mate the average
d3b0: 20 73 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 66   size of a row f
d3c0: 6f 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a  or an index..*/.
d3d0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69  static void esti
d3e0: 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 49  mateIndexWidth(I
d3f0: 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75  ndex *pIdx){.  u
d400: 6e 73 69 67 6e 65 64 20 77 49 6e 64 65 78 20 3d  nsigned wIndex =
d410: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63   0;.  int i;.  c
d420: 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  onst Column *aCo
d430: 6c 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  l = pIdx->pTable
d440: 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d  ->aCol;.  for(i=
d450: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; i<pIdx->nColu
d460: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31  mn; i++){.    i1
d470: 36 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  6 x = pIdx->aiCo
d480: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73  lumn[i];.    ass
d490: 65 72 74 28 20 78 3c 70 49 64 78 2d 3e 70 54 61  ert( x<pIdx->pTa
d4a0: 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  ble->nCol );.   
d4b0: 20 77 49 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f   wIndex += x<0 ?
d4c0: 20 31 20 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e   1 : aCol[pIdx->
d4d0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45  aiColumn[i]].szE
d4e0: 73 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e  st;.  }.  pIdx->
d4f0: 73 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c 69 74  szIdxRow = sqlit
d500: 65 33 4c 6f 67 45 73 74 28 77 49 6e 64 65 78 2a  e3LogEst(wIndex*
d510: 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  4);.}../* Return
d520: 20 74 72 75 65 20 69 66 20 76 61 6c 75 65 20 78   true if value x
d530: 20 69 73 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66   is found any of
d540: 20 74 68 65 20 66 69 72 73 74 20 6e 43 6f 6c 20   the first nCol 
d550: 65 6e 74 72 69 65 73 20 6f 66 20 61 69 43 6f 6c  entries of aiCol
d560: 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  [].*/.static int
d570: 20 68 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74   hasColumn(const
d580: 20 69 31 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74   i16 *aiCol, int
d590: 20 6e 43 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20   nCol, int x){. 
d5a0: 20 77 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e   while( nCol-- >
d5b0: 20 30 20 29 20 69 66 28 20 78 3d 3d 2a 28 61 69   0 ) if( x==*(ai
d5c0: 43 6f 6c 2b 2b 29 20 29 20 72 65 74 75 72 6e 20  Col++) ) return 
d5d0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
d5e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
d5f0: 74 69 6e 65 20 72 75 6e 73 20 61 74 20 74 68 65  tine runs at the
d600: 20 65 6e 64 20 6f 66 20 70 61 72 73 69 6e 67 20   end of parsing 
d610: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
d620: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a  tatement that.**
d630: 20 68 61 73 20 61 20 57 49 54 48 4f 55 54 20 52   has a WITHOUT R
d640: 4f 57 49 44 20 63 6c 61 75 73 65 2e 20 20 54 68  OWID clause.  Th
d650: 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
d660: 75 74 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76  utine is to conv
d670: 65 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65  ert both.** inte
d680: 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 61 74 61  rnal schema data
d690: 20 73 74 72 75 63 74 75 72 65 73 20 61 6e 64 20   structures and 
d6a0: 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 56 44  the generated VD
d6b0: 42 45 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20  BE code so that 
d6c0: 74 68 65 79 0a 2a 2a 20 61 72 65 20 61 70 70 72  they.** are appr
d6d0: 6f 70 72 69 61 74 65 20 66 6f 72 20 61 20 57 49  opriate for a WI
d6e0: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
d6f0: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 72  e instead of a r
d700: 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43  owid table..** C
d710: 68 61 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a  hanges include:.
d720: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 53  **.**     (1)  S
d730: 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  et all columns o
d740: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
d750: 59 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  Y schema object 
d760: 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a  to be NOT NULL..
d770: 2a 2a 20 20 20 20 20 28 32 29 20 20 43 6f 6e 76  **     (2)  Conv
d780: 65 72 74 20 50 33 20 70 61 72 61 6d 65 74 65 72  ert P3 parameter
d790: 20 6f 66 20 74 68 65 20 4f 50 5f 43 72 65 61 74   of the OP_Creat
d7a0: 65 42 74 72 65 65 20 66 72 6f 6d 20 42 54 52 45  eBtree from BTRE
d7b0: 45 5f 49 4e 54 4b 45 59 20 0a 2a 2a 20 20 20 20  E_INTKEY .**    
d7c0: 20 20 20 20 20 20 69 6e 74 6f 20 42 54 52 45 45        into BTREE
d7d0: 5f 42 4c 4f 42 4b 45 59 2e 0a 2a 2a 20 20 20 20  _BLOBKEY..**    
d7e0: 20 28 33 29 20 20 42 79 70 61 73 73 20 74 68 65   (3)  Bypass the
d7f0: 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65   creation of the
d800: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
d810: 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20  able entry.**   
d820: 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 50         for the P
d830: 52 49 4d 41 52 59 20 4b 45 59 20 61 73 20 74 68  RIMARY KEY as th
d840: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  e primary key in
d850: 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20  dex is now.**   
d860: 20 20 20 20 20 20 20 69 64 65 6e 74 69 66 69 65         identifie
d870: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 5f  d by the sqlite_
d880: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74  master table ent
d890: 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ry of the table 
d8a0: 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28  itself..**     (
d8b0: 34 29 20 20 53 65 74 20 74 68 65 20 49 6e 64 65  4)  Set the Inde
d8c0: 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65 20 50 52  x.tnum of the PR
d8d0: 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20  IMARY KEY Index 
d8e0: 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a  object in the.**
d8f0: 20 20 20 20 20 20 20 20 20 20 73 63 68 65 6d 61            schema
d900: 20 74 6f 20 74 68 65 20 72 6f 6f 74 70 61 67 65   to the rootpage
d910: 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74   from the main t
d920: 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 35 29  able..**     (5)
d930: 20 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20    Add all table 
d940: 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50  columns to the P
d950: 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78  RIMARY KEY Index
d960: 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20 20 20   object.**      
d970: 20 20 20 20 73 6f 20 74 68 61 74 20 74 68 65 20      so that the 
d980: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 61  PRIMARY KEY is a
d990: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
d9a0: 20 20 54 68 65 20 73 75 72 70 6c 75 73 0a 2a 2a    The surplus.**
d9b0: 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
d9c0: 73 20 61 72 65 20 70 61 72 74 20 6f 66 20 4b 65  s are part of Ke
d9d0: 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20  yInfo.nAllField 
d9e0: 61 6e 64 20 61 72 65 20 6e 6f 74 20 75 73 65 64  and are not used
d9f0: 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20   for.**         
da00: 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b   sorting or look
da10: 75 70 20 6f 72 20 75 6e 69 71 75 65 6e 65 73 73  up or uniqueness
da20: 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20 20   checks..**     
da30: 28 36 29 20 20 52 65 70 6c 61 63 65 20 74 68 65  (6)  Replace the
da40: 20 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20 61   rowid tail on a
da50: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
da60: 20 67 65 6e 65 72 61 74 65 64 20 55 4e 49 51 55   generated UNIQU
da70: 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e  E.**          in
da80: 64 69 63 65 73 20 77 69 74 68 20 74 68 65 20 50  dices with the P
da90: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
daa0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 76 69  ns..**.** For vi
dab0: 72 74 75 61 6c 20 74 61 62 6c 65 73 2c 20 6f 6e  rtual tables, on
dac0: 6c 79 20 28 31 29 20 69 73 20 70 65 72 66 6f 72  ly (1) is perfor
dad0: 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  med..*/.static v
dae0: 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f 57 69 74  oid convertToWit
daf0: 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 50  houtRowidTable(P
db00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
db10: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e  ble *pTab){.  In
db20: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e 64  dex *pIdx;.  Ind
db30: 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20 6e  ex *pPk;.  int n
db40: 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  Pk;.  int i, j;.
db50: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
db60: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
db70: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
db80: 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 4d 61 72  pVdbe;..  /* Mar
db90: 6b 20 65 76 65 72 79 20 50 52 49 4d 41 52 59 20  k every PRIMARY 
dba0: 4b 45 59 20 63 6f 6c 75 6d 6e 20 61 73 20 4e 4f  KEY column as NO
dbb0: 54 20 4e 55 4c 4c 20 28 65 78 63 65 70 74 20 66  T NULL (except f
dbc0: 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  or imposter tabl
dbd0: 65 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es).  */.  if( !
dbe0: 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65  db->init.imposte
dbf0: 72 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 6f  rTable ){.    fo
dc00: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
dc10: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
dc20: 20 69 66 28 20 28 70 54 61 62 2d 3e 61 43 6f 6c   if( (pTab->aCol
dc30: 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43  [i].colFlags & C
dc40: 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21  OLFLAG_PRIMKEY)!
dc50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  =0 ){.        pT
dc60: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e  ab->aCol[i].notN
dc70: 75 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ull = OE_Abort;.
dc80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
dc90: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 6d 61  }..  /* The rema
dca0: 69 6e 69 6e 67 20 74 72 61 6e 73 66 6f 72 6d 61  ining transforma
dcb0: 74 69 6f 6e 73 20 6f 6e 6c 79 20 61 70 70 6c 79  tions only apply
dcc0: 20 74 6f 20 62 2d 74 72 65 65 20 74 61 62 6c 65   to b-tree table
dcd0: 73 2c 20 6e 6f 74 20 74 6f 0a 20 20 2a 2a 20 76  s, not to.  ** v
dce0: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f  irtual tables */
dcf0: 0a 20 20 69 66 28 20 49 4e 5f 44 45 43 4c 41 52  .  if( IN_DECLAR
dd00: 45 5f 56 54 41 42 20 29 20 72 65 74 75 72 6e 3b  E_VTAB ) return;
dd10: 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74  ..  /* Convert t
dd20: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 6f 66  he P3 operand of
dd30: 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 42 74   the OP_CreateBt
dd40: 72 65 65 20 6f 70 63 6f 64 65 20 66 72 6f 6d 20  ree opcode from 
dd50: 42 54 52 45 45 5f 49 4e 54 4b 45 59 0a 20 20 2a  BTREE_INTKEY.  *
dd60: 2a 20 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c 4f  * into BTREE_BLO
dd70: 42 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BKEY..  */.  if(
dd80: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54   pParse->addrCrT
dd90: 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
dda0: 28 20 76 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ( v );.    sqlit
ddb0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
ddc0: 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72  , pParse->addrCr
ddd0: 54 61 62 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b  Tab, BTREE_BLOBK
dde0: 45 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  EY);.  }..  /* L
ddf0: 6f 63 61 74 65 20 74 68 65 20 50 52 49 4d 41 52  ocate the PRIMAR
de00: 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f 72  Y KEY index.  Or
de10: 2c 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20  , if this table 
de20: 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  was originally. 
de30: 20 2a 2a 20 61 6e 20 49 4e 54 45 47 45 52 20 50   ** an INTEGER P
de40: 52 49 4d 41 52 59 20 4b 45 59 20 74 61 62 6c 65  RIMARY KEY table
de50: 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 50  , create a new P
de60: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
de70: 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  . .  */.  if( pT
de80: 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a  ab->iPKey>=0 ){.
de90: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
dea0: 69 73 74 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 69  ist;.    Token i
deb0: 70 6b 54 6f 6b 65 6e 3b 0a 20 20 20 20 73 71 6c  pkToken;.    sql
dec0: 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 69  ite3TokenInit(&i
ded0: 70 6b 54 6f 6b 65 6e 2c 20 70 54 61 62 2d 3e 61  pkToken, pTab->a
dee0: 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d  Col[pTab->iPKey]
def0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69  .zName);.    pLi
df00: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
df10: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
df20: 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  e, 0, .         
df30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
df40: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
df50: 5f 49 44 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c 20  _ID, &ipkToken, 
df60: 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  0));.    if( pLi
df70: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
df80: 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e      pList->a[0].
df90: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 50 61 72  sortOrder = pPar
dfa0: 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72  se->iPkSortOrder
dfb0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
dfc0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
dfd0: 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 73 71 6c  =pTab );.    sql
dfe0: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
dff0: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
e000: 20 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65   pList, pTab->ke
e010: 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20  yConf, 0, 0, 0, 
e020: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
e030: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
e040: 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59  _IDXTYPE_PRIMARY
e050: 4b 45 59 29 3b 0a 20 20 20 20 69 66 28 20 64 62  KEY);.    if( db
e060: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e070: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b   return;.    pPk
e080: 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
e090: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
e0a0: 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
e0b0: 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
e0c0: 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65      pPk = sqlite
e0d0: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
e0e0: 28 70 54 61 62 29 3b 0a 0a 20 20 20 20 2f 2a 0a  (pTab);..    /*.
e0f0: 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 61 6c      ** Remove al
e100: 6c 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75  l redundant colu
e110: 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 50 52 49  mns from the PRI
e120: 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 20 65  MARY KEY.  For e
e130: 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67 65 0a 20  xample, change. 
e140: 20 20 20 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b     ** "PRIMARY K
e150: 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c 62 2c 63  EY(a,b,a,b,c,b,c
e160: 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73 74 20 22  ,d)" into just "
e170: 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c  PRIMARY KEY(a,b,
e180: 63 2c 64 29 22 2e 20 20 4c 61 74 65 72 0a 20 20  c,d)".  Later.  
e190: 20 20 2a 2a 20 63 6f 64 65 20 61 73 73 75 6d 65    ** code assume
e1a0: 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  s the PRIMARY KE
e1b0: 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 65  Y contains no re
e1c0: 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a  peated columns..
e1d0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
e1e0: 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65  =j=1; i<pPk->nKe
e1f0: 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
e200: 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28    if( hasColumn(
e210: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a  pPk->aiColumn, j
e220: 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
e230: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  i]) ){.        p
e240: 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20  Pk->nColumn--;. 
e250: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e260: 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d      pPk->aiColum
e270: 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e 61 69  n[j++] = pPk->ai
e280: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
e290: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 6b   }.    }.    pPk
e2a0: 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b 0a 20  ->nKeyCol = j;. 
e2b0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 6b   }.  assert( pPk
e2c0: 21 3d 30 20 29 3b 0a 20 20 70 50 6b 2d 3e 69 73  !=0 );.  pPk->is
e2d0: 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20  Covering = 1;.  
e2e0: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d  if( !db->init.im
e2f0: 70 6f 73 74 65 72 54 61 62 6c 65 20 29 20 70 50  posterTable ) pP
e300: 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d  k->uniqNotNull =
e310: 20 31 3b 0a 20 20 6e 50 6b 20 3d 20 70 50 6b 2d   1;.  nPk = pPk-
e320: 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f 2a 20  >nKeyCol;..  /* 
e330: 42 79 70 61 73 73 20 74 68 65 20 63 72 65 61 74  Bypass the creat
e340: 69 6f 6e 20 6f 66 20 74 68 65 20 50 52 49 4d 41  ion of the PRIMA
e350: 52 59 20 4b 45 59 20 62 74 72 65 65 20 61 6e 64  RY KEY btree and
e360: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
e370: 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 65 6e  er.  ** table en
e380: 74 72 79 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c  try. This is onl
e390: 79 20 72 65 71 75 69 72 65 64 20 69 66 20 63 75  y required if cu
e3a0: 72 72 65 6e 74 6c 79 20 67 65 6e 65 72 61 74 69  rrently generati
e3b0: 6e 67 20 56 44 42 45 0a 20 20 2a 2a 20 63 6f 64  ng VDBE.  ** cod
e3c0: 65 20 66 6f 72 20 61 20 43 52 45 41 54 45 20 54  e for a CREATE T
e3d0: 41 42 4c 45 20 28 6e 6f 74 20 77 68 65 6e 20 70  ABLE (not when p
e3e0: 61 72 73 69 6e 67 20 6f 6e 65 20 61 73 20 70 61  arsing one as pa
e3f0: 72 74 20 6f 66 20 72 65 61 64 69 6e 67 0a 20 20  rt of reading.  
e400: 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 73 63  ** a database sc
e410: 68 65 6d 61 29 2e 20 20 2a 2f 0a 20 20 69 66 28  hema).  */.  if(
e420: 20 76 20 26 26 20 70 50 6b 2d 3e 74 6e 75 6d 3e   v && pPk->tnum>
e430: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
e440: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
e450: 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
e460: 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65  VdbeChangeOpcode
e470: 28 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d 2c 20 4f  (v, pPk->tnum, O
e480: 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d 0a 0a 20 20  P_Goto);.  }..  
e490: 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
e4a0: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
e4b0: 4b 45 59 20 69 73 20 74 68 65 20 74 61 62 6c 65  KEY is the table
e4c0: 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20   root page */.  
e4d0: 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62  pPk->tnum = pTab
e4e0: 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70  ->tnum;..  /* Up
e4f0: 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  date the in-memo
e500: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
e510: 6e 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45 20  n of all UNIQUE 
e520: 69 6e 64 69 63 65 73 20 62 79 20 63 6f 6e 76 65  indices by conve
e530: 72 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  rting.  ** the f
e540: 69 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d  inal rowid colum
e550: 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  n into one or mo
e560: 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  re columns of th
e570: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20  e PRIMARY KEY.. 
e580: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70   */.  for(pIdx=p
e590: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
e5a0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
e5b0: 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  ext){.    int n;
e5c0: 0a 20 20 20 20 69 66 28 20 49 73 50 72 69 6d 61  .    if( IsPrima
e5d0: 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
e5e0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
e5f0: 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50   for(i=n=0; i<nP
e600: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  k; i++){.      i
e610: 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49  f( !hasColumn(pI
e620: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49  dx->aiColumn, pI
e630: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b  dx->nKeyCol, pPk
e640: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29  ->aiColumn[i]) )
e650: 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20   n++;.    }.    
e660: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
e670: 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20    /* This index 
e680: 69 73 20 61 20 73 75 70 65 72 73 65 74 20 6f 66  is a superset of
e690: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
e6a0: 20 2a 2f 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   */.      pIdx->
e6b0: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e  nColumn = pIdx->
e6c0: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63  nKeyCol;.      c
e6d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
e6e0: 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64     if( resizeInd
e6f0: 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 49 64  exObject(db, pId
e700: 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  x, pIdx->nKeyCol
e710: 2b 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  +n) ) return;.  
e720: 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64    for(i=0, j=pId
e730: 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50  x->nKeyCol; i<nP
e740: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  k; i++){.      i
e750: 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49  f( !hasColumn(pI
e760: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49  dx->aiColumn, pI
e770: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b  dx->nKeyCol, pPk
e780: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29  ->aiColumn[i]) )
e790: 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  {.        pIdx->
e7a0: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50  aiColumn[j] = pP
e7b0: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  k->aiColumn[i];.
e7c0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
e7d0: 43 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61  Coll[j] = pPk->a
e7e0: 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zColl[i];.      
e7f0: 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    j++;.      }. 
e800: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
e810: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
e820: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20  pIdx->nKeyCol+n 
e830: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
e840: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20  Idx->nColumn>=j 
e850: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  );.  }..  /* Add
e860: 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d   all table colum
e870: 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52  ns to the PRIMAR
e880: 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f  Y KEY index.  */
e890: 0a 20 20 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d  .  if( nPk<pTab-
e8a0: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28  >nCol ){.    if(
e8b0: 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65   resizeIndexObje
e8c0: 63 74 28 64 62 2c 20 70 50 6b 2c 20 70 54 61 62  ct(db, pPk, pTab
e8d0: 2d 3e 6e 43 6f 6c 29 20 29 20 72 65 74 75 72 6e  ->nCol) ) return
e8e0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a  ;.    for(i=0, j
e8f0: 3d 6e 50 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  =nPk; i<pTab->nC
e900: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
e910: 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70  if( !hasColumn(p
e920: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c  Pk->aiColumn, j,
e930: 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61   i) ){.        a
e940: 73 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43  ssert( j<pPk->nC
e950: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20  olumn );.       
e960: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a   pPk->aiColumn[j
e970: 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70  ] = i;.        p
e980: 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20  Pk->azColl[j] = 
e990: 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
e9a0: 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  ;.        j++;. 
e9b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e9c0: 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e 43   assert( pPk->nC
e9d0: 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20 20  olumn==j );.    
e9e0: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
e9f0: 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c 73 65  ol==j );.  }else
ea00: 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75  {.    pPk->nColu
ea10: 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b  mn = pTab->nCol;
ea20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
ea30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
ea40: 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  lled to report t
ea50: 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61  he final ")" tha
ea60: 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20  t terminates.** 
ea70: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
ea80: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
ea90: 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74  The table struct
eaa0: 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61  ure that other a
eab0: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68  ction routines h
eac0: 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e  ave been buildin
ead0: 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  g.** is added to
eae0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61   the internal ha
eaf0: 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d  sh tables, assum
eb00: 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61  ing no errors ha
eb10: 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a  ve.** occurred..
eb20: 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66  **.** An entry f
eb30: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  or the table is 
eb40: 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74  made in the mast
eb50: 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b  er table on disk
eb60: 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73  , unless.** this
eb70: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
eb80: 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69  table or db->ini
eb90: 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e  t.busy==1.  When
eba0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
ebb0: 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65  1.** it means we
ebc0: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
ebd0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
ebe0: 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20  able because we 
ebf0: 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65  just.** connecte
ec00: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
ec10: 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  e or because the
ec20: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
ec30: 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65  able has.** rece
ec40: 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f  ntly changed, so
ec50: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
ec60: 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64  his table alread
ec70: 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74  y exists in.** t
ec80: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
ec90: 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e   table.  We do n
eca0: 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74  ot want to creat
ecb0: 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  e it again..**.*
ecc0: 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74  * If the pSelect
ecd0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
ece0: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
ecf0: 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
ed00: 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20  e.** was called 
ed10: 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c  to create a tabl
ed20: 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  e generated from
ed30: 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54   a .** "CREATE T
ed40: 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45  ABLE ... AS SELE
ed50: 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e  CT ..." statemen
ed60: 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e  t.  The column n
ed70: 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ames of.** the n
ed80: 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61  ew table will ma
ed90: 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73  tch the result s
eda0: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
edb0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
edc0: 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72  3EndTable(.  Par
edd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
ede0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
edf0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
ee00: 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20   *pCons,        
ee10: 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f     /* The ',' to
ee20: 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61  ken after the la
ee30: 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20  st column defn. 
ee40: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
ee50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
ee60: 54 68 65 20 27 29 27 20 62 65 66 6f 72 65 20 6f  The ')' before o
ee70: 70 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 43 52  ptions in the CR
ee80: 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20  EATE TABLE */.  
ee90: 75 38 20 74 61 62 4f 70 74 73 2c 20 20 20 20 20  u8 tabOpts,     
eea0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
eeb0: 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20   table options. 
eec0: 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20  Usually 0. */.  
eed0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
eee0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
eef0: 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45  t from a "CREATE
ef00: 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20   ... AS SELECT" 
ef10: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
ef20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ef30: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74 61 62    /* The new tab
ef40: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  le */.  sqlite3 
ef50: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
ef60: 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73  ; /* The databas
ef70: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
ef80: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
efa0: 61 74 61 62 61 73 65 20 69 6e 20 77 68 69 63 68  atabase in which
efb0: 20 74 68 65 20 74 61 62 6c 65 20 6c 69 76 65 73   the table lives
efc0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
efd0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
efe0: 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e  /* An implied in
eff0: 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
f000: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d   */..  if( pEnd=
f010: 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30  =0 && pSelect==0
f020: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
f030: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 64    }.  assert( !d
f040: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f050: 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  );.  p = pParse-
f060: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
f070: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
f080: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
f090: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
f0a0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
f0b0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
f0c0: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
f0d0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72  qlite_master" or
f0e0: 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61   "sqlite_temp_ma
f0f0: 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74  ster" table on t
f100: 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f  he disk..  ** So
f110: 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f   do not write to
f120: 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e   the disk again.
f130: 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f    Extract the ro
f140: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  ot page number. 
f150: 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c   ** for the tabl
f160: 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69  e from the db->i
f170: 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  nit.newTnum fiel
f180: 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75  d.  (The page nu
f190: 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  mber.  ** should
f1a0: 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74   have been put t
f1b0: 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69  here by the sqli
f1c0: 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65  teOpenCb routine
f1d0: 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  .).  **.  ** If 
f1e0: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
f1f0: 6d 62 65 72 20 69 73 20 31 2c 20 74 68 61 74 20  mber is 1, that 
f200: 6d 65 61 6e 73 20 74 68 69 73 20 69 73 20 74 68  means this is th
f210: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a  e sqlite_master.
f220: 20 20 2a 2a 20 74 61 62 6c 65 20 69 74 73 65 6c    ** table itsel
f230: 66 2e 20 20 53 6f 20 6d 61 72 6b 20 69 74 20 72  f.  So mark it r
f240: 65 61 64 2d 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a 20  ead-only..  */. 
f250: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
f260: 73 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  sy ){.    if( pS
f270: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73  elect ){.      s
f280: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f290: 50 61 72 73 65 2c 20 22 22 29 3b 0a 20 20 20 20  Parse, "");.    
f2a0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
f2b0: 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62      p->tnum = db
f2c0: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a  ->init.newTnum;.
f2d0: 20 20 20 20 69 66 28 20 70 2d 3e 74 6e 75 6d 3d      if( p->tnum=
f2e0: 3d 31 20 29 20 70 2d 3e 74 61 62 46 6c 61 67 73  =1 ) p->tabFlags
f2f0: 20 7c 3d 20 54 46 5f 52 65 61 64 6f 6e 6c 79 3b   |= TF_Readonly;
f300: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69  .  }..  /* Speci
f310: 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  al processing fo
f320: 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
f330: 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20  Tables */.  if( 
f340: 74 61 62 4f 70 74 73 20 26 20 54 46 5f 57 69 74  tabOpts & TF_Wit
f350: 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20 20  houtRowid ){.   
f360: 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67   if( (p->tabFlag
f370: 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
f380: 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 73  ment) ){.      s
f390: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f3a0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
f3b0: 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20   "AUTOINCREMENT 
f3c0: 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 57  not allowed on W
f3d0: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
f3e0: 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74  les");.      ret
f3f0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
f400: 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20  f( (p->tabFlags 
f410: 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b  & TF_HasPrimaryK
f420: 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ey)==0 ){.      
f430: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f440: 70 50 61 72 73 65 2c 20 22 50 52 49 4d 41 52 59  pParse, "PRIMARY
f450: 20 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f 6e 20   KEY missing on 
f460: 74 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a 4e  table %s", p->zN
f470: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
f480: 0a 20 20 20 20 20 20 70 2d 3e 74 61 62 46 6c 61  .      p->tabFla
f490: 67 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75 74  gs |= TF_Without
f4a0: 52 6f 77 69 64 20 7c 20 54 46 5f 4e 6f 56 69 73  Rowid | TF_NoVis
f4b0: 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 20  ibleRowid;.     
f4c0: 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75   convertToWithou
f4d0: 74 52 6f 77 69 64 54 61 62 6c 65 28 70 50 61 72  tRowidTable(pPar
f4e0: 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  se, p);.    }.  
f4f0: 7d 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  }..  iDb = sqlit
f500: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
f510: 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b  db, p->pSchema);
f520: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
f530: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a  _OMIT_CHECK.  /*
f540: 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69   Resolve names i
f550: 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73  n all CHECK cons
f560: 74 72 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f  traint expressio
f570: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ns..  */.  if( p
f580: 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20  ->pCheck ){.    
f590: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
f5a0: 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72  lfReference(pPar
f5b0: 73 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65 63  se, p, NC_IsChec
f5c0: 6b 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29  k, 0, p->pCheck)
f5d0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
f5e0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
f5f0: 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a  OMIT_CHECK) */..
f600: 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68    /* Estimate th
f610: 65 20 61 76 65 72 61 67 65 20 72 6f 77 20 73 69  e average row si
f620: 7a 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ze for the table
f630: 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70   and for all imp
f640: 6c 69 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a  lied indices */.
f650: 20 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57    estimateTableW
f660: 69 64 74 68 28 70 29 3b 0a 20 20 66 6f 72 28 70  idth(p);.  for(p
f670: 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70  Idx=p->pIndex; p
f680: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
f690: 70 4e 65 78 74 29 7b 0a 20 20 20 20 65 73 74 69  pNext){.    esti
f6a0: 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70  mateIndexWidth(p
f6b0: 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Idx);.  }..  /* 
f6c0: 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  If not initializ
f6d0: 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ing, then create
f6e0: 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68   a record for th
f6f0: 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a  e new table.  **
f700: 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
f710: 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74  ASTER table of t
f720: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
f730: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69  *.  ** If this i
f740: 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61  s a TEMPORARY ta
f750: 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65  ble, write the e
f760: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75  ntry into the au
f770: 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c  xiliary.  ** fil
f780: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74  e instead of int
f790: 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
f7a0: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
f7b0: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
f7c0: 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  usy ){.    int n
f7d0: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  ;.    Vdbe *v;. 
f7e0: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20     char *zType; 
f7f0: 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20     /* "view" or 
f800: 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63  "table" */.    c
f810: 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f  har *zType2;   /
f820: 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42  * "VIEW" or "TAB
f830: 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  LE" */.    char 
f840: 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65  *zStmt;    /* Te
f850: 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
f860: 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45   TABLE or CREATE
f870: 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20   VIEW statement 
f880: 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  */..    v = sqli
f890: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
f8a0: 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  e);.    if( NEVE
f8b0: 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
f8c0: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ;..    sqlite3Vd
f8d0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
f8e0: 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  lose, 0);..    /
f8f0: 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69 61  * .    ** Initia
f900: 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20 74  lize zType for t
f910: 68 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20 74  he new view or t
f920: 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
f930: 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d   if( p->pSelect=
f940: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
f950: 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a   regular table *
f960: 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  /.      zType = 
f970: 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a  "table";.      z
f980: 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b  Type2 = "TABLE";
f990: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f9a0: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65  OMIT_VIEW.    }e
f9b0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
f9c0: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54  view */.      zT
f9d0: 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20  ype = "view";.  
f9e0: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49      zType2 = "VI
f9f0: 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EW";.#endif.    
fa00: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
fa10: 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41  s is a CREATE TA
fa20: 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54  BLE xx AS SELECT
fa30: 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68   ..., execute th
fa40: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  e SELECT.    ** 
fa50: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70  statement to pop
fa60: 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61  ulate the new ta
fa70: 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61  ble. The root-pa
fa80: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
fa90: 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62  e.    ** new tab
faa0: 6c 65 20 69 73 20 69 6e 20 72 65 67 69 73 74 65  le is in registe
fab0: 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  r pParse->regRoo
fac0: 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
fad0: 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54   Once the SELECT
fae0: 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20   has been coded 
faf0: 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  by sqlite3Select
fb00: 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20  (), it is in a. 
fb10: 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73     ** suitable s
fb20: 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f  tate to query fo
fb30: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
fb40: 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20  es and types to 
fb50: 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62  be used.    ** b
fb60: 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  y the new table.
fb70: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
fb80: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 77 72   shared-cache wr
fb90: 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  ite-lock is not 
fba0: 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69 74  required to writ
fbb0: 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62  e to the new tab
fbc0: 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20  le,.    ** as a 
fbd0: 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74  schema-lock must
fbe0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
fbf0: 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63  en obtained to c
fc00: 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a  reate it. Since.
fc10: 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d      ** a schema-
fc20: 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c  lock excludes al
fc30: 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  l other database
fc40: 20 75 73 65 72 73 2c 20 74 68 65 20 77 72 69 74   users, the writ
fc50: 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20  e-lock would.   
fc60: 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74   ** be redundant
fc70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
fc80: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
fc90: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
fca0: 74 3b 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74  t;    /* Where t
fcb0: 68 65 20 53 45 4c 45 43 54 20 73 68 6f 75 6c 64  he SELECT should
fcc0: 20 73 74 6f 72 65 20 72 65 73 75 6c 74 73 20 2a   store results *
fcd0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 59  /.      int regY
fce0: 69 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a 20 52  ield;       /* R
fcf0: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
fd00: 63 6f 2d 72 6f 75 74 69 6e 65 20 65 6e 74 72 79  co-routine entry
fd10: 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20  -point */.      
fd20: 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20  int addrTop;    
fd30: 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
fd40: 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a  e co-routine */.
fd50: 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63        int regRec
fd60: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72  ;         /* A r
fd70: 65 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65  ecord to be inse
fd80: 72 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20  rt into the new 
fd90: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69  table */.      i
fda0: 6e 74 20 72 65 67 52 6f 77 69 64 3b 20 20 20 20  nt regRowid;    
fdb0: 20 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20 74     /* Rowid of t
fdc0: 68 65 20 6e 65 78 74 20 72 6f 77 20 74 6f 20 69  he next row to i
fdd0: 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 20 20 69  nsert */.      i
fde0: 6e 74 20 61 64 64 72 49 6e 73 4c 6f 6f 70 3b 20  nt addrInsLoop; 
fdf0: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
fe00: 20 6c 6f 6f 70 20 66 6f 72 20 69 6e 73 65 72 74   loop for insert
fe10: 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20  ing rows */.    
fe20: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
fe30: 3b 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65  ;     /* A table
fe40: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
fe50: 74 68 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c  the SELECT resul
fe60: 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20 72 65 67  ts */..      reg
fe70: 59 69 65 6c 64 20 3d 20 2b 2b 70 50 61 72 73 65  Yield = ++pParse
fe80: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
fe90: 67 52 65 63 20 3d 20 2b 2b 70 50 61 72 73 65 2d  gRec = ++pParse-
fea0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
feb0: 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
fec0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73  ->nMem;.      as
fed0: 73 65 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61  sert(pParse->nTa
fee0: 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  b==1);.      sql
fef0: 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
ff00: 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
ff10: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ff20: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31   OP_OpenWrite, 1
ff30: 2c 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  , pParse->regRoo
ff40: 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  t, iDb);.      s
ff50: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
ff60: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49  P5(v, OPFLAG_P2I
ff70: 53 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61  SREG);.      pPa
ff80: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20  rse->nTab = 2;. 
ff90: 20 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73       addrTop = s
ffa0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
ffb0: 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20  tAddr(v) + 1;.  
ffc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ffd0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
ffe0: 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69  Coroutine, regYi
fff0: 65 6c 64 2c 20 30 2c 20 61 64 64 72 54 6f 70 29  eld, 0, addrTop)
10000 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
10010 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
10020 6e 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  n;.      pSelTab
10030 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
10040 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
10050 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  se, pSelect);.  
10060 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d      if( pSelTab=
10070 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
10080 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43     assert( p->aC
10090 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ol==0 );.      p
100a0 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
100b0 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d  ->nCol;.      p-
100c0 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >aCol = pSelTab-
100d0 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65  >aCol;.      pSe
100e0 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
100f0 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61        pSelTab->a
10100 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  Col = 0;.      s
10110 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
10120 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a  e(db, pSelTab);.
10130 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
10140 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
10150 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t, SRT_Coroutine
10160 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20  , regYield);.   
10170 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
10180 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
10190 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
101a0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
101b0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
101c0 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
101d0 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 59  oroutine(v, regY
101e0 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ield);.      sql
101f0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
10200 28 76 2c 20 61 64 64 72 54 6f 70 20 2d 20 31 29  (v, addrTop - 1)
10210 3b 0a 20 20 20 20 20 20 61 64 64 72 49 6e 73 4c  ;.      addrInsL
10220 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
10230 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
10240 65 6c 64 2c 20 64 65 73 74 2e 69 53 44 50 61 72  eld, dest.iSDPar
10250 6d 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  m);.      VdbeCo
10260 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
10270 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10280 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
10290 6f 72 64 2c 20 64 65 73 74 2e 69 53 64 73 74 2c  ord, dest.iSdst,
102a0 20 64 65 73 74 2e 6e 53 64 73 74 2c 20 72 65 67   dest.nSdst, reg
102b0 52 65 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Rec);.      sqli
102c0 74 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79  te3TableAffinity
102d0 28 76 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20  (v, p, 0);.     
102e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
102f0 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
10300 64 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 29 3b  d, 1, regRowid);
10310 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10320 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
10330 6e 73 65 72 74 2c 20 31 2c 20 72 65 67 52 65 63  nsert, 1, regRec
10340 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
10350 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
10360 74 6f 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f  to(v, addrInsLoo
10370 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
10380 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
10390 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20   addrInsLoop);. 
103a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
103b0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
103c0 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  se, 1);.    }.. 
103d0 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
103e0 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
103f0 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74  of the CREATE st
10400 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
10410 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
10420 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61      zStmt = crea
10430 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20  teTableStmt(db, 
10440 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
10450 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64       Token *pEnd
10460 32 20 3d 20 74 61 62 4f 70 74 73 20 3f 20 26 70  2 = tabOpts ? &p
10470 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
10480 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  n : pEnd;.      
10490 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 32 2d  n = (int)(pEnd2-
104a0 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61  >z - pParse->sNa
104b0 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20  meToken.z);.    
104c0 20 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b 30    if( pEnd2->z[0
104d0 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70 45  ]!=';' ) n += pE
104e0 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a 53  nd2->n;.      zS
104f0 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
10500 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20  intf(db, .      
10510 20 20 20 20 22 43 52 45 41 54 45 20 25 73 20 25      "CREATE %s %
10520 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c  .*s", zType2, n,
10530 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
10540 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20  ken.z.      );. 
10550 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73     }..    /* A s
10560 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f  lot for the reco
10570 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  rd has already b
10580 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  een allocated in
10590 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c   the .    ** SQL
105a0 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
105b0 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20  .  We just need 
105c0 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73  to update that s
105d0 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20  lot with all.   
105e0 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   ** the informat
105f0 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63  ion we've collec
10600 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
10610 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
10620 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
10630 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22   "UPDATE %Q.%s "
10640 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74  .         "SET t
10650 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25  ype='%s', name=%
10660 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20  Q, tbl_name=%Q, 
10670 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71  rootpage=#%d, sq
10680 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57  l=%Q ".       "W
10690 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c  HERE rowid=#%d",
106a0 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
106b0 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41  Db].zDbSName, MA
106c0 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 20  STER_NAME,.     
106d0 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d   zType,.      p-
106e0 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d  >zName,.      p-
106f0 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50  >zName,.      pP
10700 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20  arse->regRoot,. 
10710 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20       zStmt,.    
10720 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77    pParse->regRow
10730 69 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  id.    );.    sq
10740 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
10750 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  zStmt);.    sqli
10760 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
10770 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23  pParse, iDb);..#
10780 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10790 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
107a0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
107b0 20 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20   see if we need 
107c0 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c  to create an sql
107d0 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
107e0 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65  le for.    ** ke
107f0 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61  eping track of a
10800 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79  utoincrement key
10810 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
10820 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26  ( (p->tabFlags &
10830 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e   TF_Autoincremen
10840 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 44  t)!=0 ){.      D
10850 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
10860 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 61 73  b[iDb];.      as
10870 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
10880 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
10890 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
108a0 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
108b0 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29  ma->pSeqTab==0 )
108c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
108d0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
108e0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  rse,.          "
108f0 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e  CREATE TABLE %Q.
10900 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28  sqlite_sequence(
10910 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20  name,seq)",.    
10920 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e        pDb->zDbSN
10930 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ame.        );. 
10940 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
10950 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61  dif..    /* Repa
10960 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74  rse everything t
10970 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74  o update our int
10980 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63  ernal data struc
10990 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c  tures */.    sql
109a0 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
109b0 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c  SchemaOp(v, iDb,
109c0 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
109d0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
109e0 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41 4e  tbl_name='%q' AN
109f0 44 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72  D type!='trigger
10a00 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  '", p->zName));.
10a10 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74    }...  /* Add t
10a20 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  he table to the 
10a30 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
10a40 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
10a50 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
10a60 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
10a70 73 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  sy ){.    Table 
10a80 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d  *pOld;.    Schem
10a90 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e  a *pSchema = p->
10aa0 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73  pSchema;.    ass
10ab0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
10ac0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
10ad0 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  iDb, 0) );.    p
10ae0 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
10af0 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61  hInsert(&pSchema
10b00 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e  ->tblHash, p->zN
10b10 61 6d 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  ame, p);.    if(
10b20 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61   pOld ){.      a
10b30 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29  ssert( p==pOld )
10b40 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
10b50 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e  t have failed in
10b60 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28  side HashInsert(
10b70 29 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ) */.      sqlit
10b80 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
10b90 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
10ba0 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
10bb0 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20  pNewTable = 0;. 
10bc0 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20     db->mDbFlags 
10bd0 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61  |= DBFLAG_Schema
10be0 43 68 61 6e 67 65 3b 0a 0a 23 69 66 6e 64 65 66  Change;..#ifndef
10bf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54   SQLITE_OMIT_ALT
10c00 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ERTABLE.    if( 
10c10 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  !p->pSelect ){. 
10c20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
10c30 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
10c40 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 73  char *)pParse->s
10c50 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20  NameToken.z;.   
10c60 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20     int nName;.  
10c70 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 65      assert( !pSe
10c80 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26  lect && pCons &&
10c90 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69   pEnd );.      i
10ca0 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29  f( pCons->z==0 )
10cb0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73 20  {.        pCons 
10cc0 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  = pEnd;.      }.
10cd0 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69        nName = (i
10ce0 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72 20  nt)((const char 
10cf0 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61  *)pCons->z - zNa
10d00 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  me);.      p->ad
10d10 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20  dColOffset = 13 
10d20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61  + sqlite3Utf8Cha
10d30 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  rLen(zName, nNam
10d40 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
10d50 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
10d60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
10d70 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
10d80 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
10d90 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
10da0 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49   create a new VI
10db0 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  EW.*/.void sqlit
10dc0 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  e3CreateView(.  
10dd0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10de0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
10df0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
10e00 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
10e10 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
10e20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
10e30 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
10e40 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
10e50 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e1,     /* The t
10e60 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
10e70 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
10e80 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
10e90 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
10ea0 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
10eb0 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
10ec0 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 45   the view */.  E
10ed0 78 70 72 4c 69 73 74 20 2a 70 43 4e 61 6d 65 73  xprList *pCNames
10ee0 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 6c 69  , /* Optional li
10ef0 73 74 20 6f 66 20 76 69 65 77 20 63 6f 6c 75 6d  st of view colum
10f00 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 53 65 6c  n names */.  Sel
10f10 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
10f20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74  /* A SELECT stat
10f30 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20  ement that will 
10f40 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76  become the new v
10f50 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
10f60 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  emp,        /* T
10f70 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52  RUE for a TEMPOR
10f80 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  ARY view */.  in
10f90 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20  t noErr         
10fa0 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72   /* Suppress err
10fb0 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56  or messages if V
10fc0 49 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73  IEW already exis
10fd0 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
10fe0 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *p;.  int n;.  
10ff0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
11000 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44   Token sEnd;.  D
11010 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54  bFixer sFix;.  T
11020 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
11030 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71  .  int iDb;.  sq
11040 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
11050 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
11060 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b  Parse->nVar>0 ){
11070 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
11080 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61  rMsg(pParse, "pa
11090 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74  rameters are not
110a0 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77   allowed in view
110b0 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72  s");.    goto cr
110c0 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a  eate_view_fail;.
110d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61    }.  sqlite3Sta
110e0 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  rtTable(pParse, 
110f0 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
11100 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f  isTemp, 1, 0, no
11110 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  Err);.  p = pPar
11120 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
11130 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
11140 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
11150 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69   create_view_fai
11160 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50  l;.  sqlite3TwoP
11170 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
11180 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
11190 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d  &pName);.  iDb =
111a0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
111b0 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63  Index(db, p->pSc
111c0 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  hema);.  sqlite3
111d0 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
111e0 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65  Parse, iDb, "vie
111f0 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  w", pName);.  if
11200 28 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65  ( sqlite3FixSele
11210 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63  ct(&sFix, pSelec
11220 74 29 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65  t) ) goto create
11230 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f  _view_fail;..  /
11240 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  * Make a copy of
11250 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45   the entire SELE
11260 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
11270 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69  t defines the vi
11280 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69  ew..  ** This wi
11290 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65  ll force all the
112a0 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61   Expr.token.z va
112b0 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d  lues to be dynam
112c0 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  ically.  ** allo
112d0 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61  cated rather tha
112e0 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69  n point to the i
112f0 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68  nput string - wh
11300 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  ich means that. 
11310 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65   ** they will pe
11320 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20  rsist after the 
11330 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f  current sqlite3_
11340 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75  exec() call retu
11350 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  rns..  */.  p->p
11360 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
11370 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53  SelectDup(db, pS
11380 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f 52  elect, EXPRDUP_R
11390 45 44 55 43 45 29 3b 0a 20 20 70 2d 3e 70 43 68  EDUCE);.  p->pCh
113a0 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eck = sqlite3Exp
113b0 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 43 4e  rListDup(db, pCN
113c0 61 6d 65 73 2c 20 45 58 50 52 44 55 50 5f 52 45  ames, EXPRDUP_RE
113d0 44 55 43 45 29 3b 0a 20 20 69 66 28 20 64 62 2d  DUCE);.  if( db-
113e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
113f0 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77  goto create_view
11400 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  _fail;..  /* Loc
11410 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
11420 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73  he CREATE VIEW s
11430 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20  tatement.  Make 
11440 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20  sEnd point to.  
11450 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f  ** the end..  */
11460 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65  .  sEnd = pParse
11470 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20  ->sLastToken;.  
11480 61 73 73 65 72 74 28 20 73 45 6e 64 2e 7a 5b 30  assert( sEnd.z[0
11490 5d 21 3d 30 20 7c 7c 20 73 45 6e 64 2e 6e 3d 3d  ]!=0 || sEnd.n==
114a0 30 20 29 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e  0 );.  if( sEnd.
114b0 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20  z[0]!=';' ){.   
114c0 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e   sEnd.z += sEnd.
114d0 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20  n;.  }.  sEnd.n 
114e0 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29  = 0;.  n = (int)
114f0 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e  (sEnd.z - pBegin
11500 2d 3e 7a 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ->z);.  assert( 
11510 6e 3e 30 20 29 3b 0a 20 20 7a 20 3d 20 70 42 65  n>0 );.  z = pBe
11520 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28  gin->z;.  while(
11530 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
11540 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20  z[n-1]) ){ n--; 
11550 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b  }.  sEnd.z = &z[
11560 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d  n-1];.  sEnd.n =
11570 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71   1;..  /* Use sq
11580 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
11590 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20  to add the view 
115a0 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  to the SQLITE_MA
115b0 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20  STER table */.  
115c0 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
115d0 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64  pParse, 0, &sEnd
115e0 2c 20 30 2c 20 30 29 3b 0a 0a 63 72 65 61 74 65  , 0, 0);..create
115f0 5f 76 69 65 77 5f 66 61 69 6c 3a 0a 20 20 73 71  _view_fail:.  sq
11600 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
11610 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e(db, pSelect);.
11620 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
11630 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 4e 61  tDelete(db, pCNa
11640 6d 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  mes);.  return;.
11650 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11660 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
11670 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
11680 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
11690 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
116a0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
116b0 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ABLE)./*.** The 
116c0 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
116d0 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79  pTable is really
116e0 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69   a VIEW.  Fill i
116f0 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a  n the names of.*
11700 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  * the columns of
11710 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65   the view in the
11720 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72   pTable structur
11730 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
11740 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f  umber.** of erro
11750 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  rs.  If an error
11760 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61   is seen leave a
11770 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
11780 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
11790 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
117a0 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
117b0 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ames(Parse *pPar
117c0 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  se, Table *pTabl
117d0 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65  e){.  Table *pSe
117e0 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b  lTab;   /* A fak
117f0 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69  e table from whi
11800 63 68 20 77 65 20 67 65 74 20 74 68 65 20 72 65  ch we get the re
11810 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65  sult set */.  Se
11820 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20  lect *pSel;     
11830 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53  /* Copy of the S
11840 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65  ELECT that imple
11850 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a  ments the view *
11860 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  /.  int nErr = 0
11870 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
11880 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e  of errors encoun
11890 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  tered */.  int n
118a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
118b0 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64  Temporarily hold
118c0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
118d0 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64  cursors assigned
118e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
118f0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
11900 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
11910 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c  nection for mall
11920 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a 23 69 66  oc errors */.#if
11930 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11940 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 09 0a 20  _VIRTUALTABLE.. 
11950 20 69 6e 74 20 72 63 3b 0a 23 65 6e 64 69 66 0a   int rc;.#endif.
11960 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11970 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
11980 4e 0a 20 20 73 71 6c 69 74 65 33 5f 78 61 75 74  N.  sqlite3_xaut
11990 68 20 78 41 75 74 68 3b 20 20 20 20 20 20 20 2f  h xAuth;       /
119a0 2a 20 53 61 76 65 64 20 78 41 75 74 68 20 70 6f  * Saved xAuth po
119b0 69 6e 74 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a  inter */.#endif.
119c0 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
119d0 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  e );..#ifndef SQ
119e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
119f0 4c 54 41 42 4c 45 0a 20 20 64 62 2d 3e 6e 53 63  LTABLE.  db->nSc
11a00 68 65 6d 61 4c 6f 63 6b 2b 2b 3b 0a 20 20 72 63  hemaLock++;.  rc
11a10 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 43 61   = sqlite3VtabCa
11a20 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65  llConnect(pParse
11a30 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 64 62 2d  , pTable);.  db-
11a40 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 2d 2d 3b 0a  >nSchemaLock--;.
11a50 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
11a60 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
11a70 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
11a80 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30  able) ) return 0
11a90 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ;.#endif..#ifnde
11aa0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
11ab0 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69  EW.  /* A positi
11ac0 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68  ve nCol means th
11ad0 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20  e columns names 
11ae0 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72  for this view ar
11af0 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b  e.  ** already k
11b00 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nown..  */.  if(
11b10 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20   pTable->nCol>0 
11b20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
11b30 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * A negative nCo
11b40 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d  l is a special m
11b50 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68  arker meaning th
11b60 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e  at we are curren
11b70 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20  tly.  ** trying 
11b80 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63  to compute the c
11b90 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66  olumn names.  If
11ba0 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72   we enter this r
11bb0 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a  outine with.  **
11bc0 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   a negative nCol
11bd0 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f  , it means two o
11be0 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72  r more views for
11bf0 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74  m a loop, like t
11c00 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
11c10 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f     CREATE VIEW o
11c20 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  ne AS SELECT * F
11c30 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20  ROM two;.  **   
11c40 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77    CREATE VIEW tw
11c50 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  o AS SELECT * FR
11c60 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a  OM one;.  **.  *
11c70 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20  * Actually, the 
11c80 65 72 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e  error above is n
11c90 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f 72 20  ow caught prior 
11ca0 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73  to reaching this
11cb0 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74   point..  ** But
11cc0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
11cd0 65 73 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70  est is still imp
11ce0 6f 72 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65  ortant as it doe
11cf0 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69  s come up.  ** i
11d00 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  n the following:
11d10 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20  .  ** .  **     
11d20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69  CREATE TABLE mai
11d30 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20  n.ex1(a);.  **  
11d40 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 56     CREATE TEMP V
11d50 49 45 57 20 65 78 31 20 41 53 20 53 45 4c 45 43  IEW ex1 AS SELEC
11d60 54 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20  T a FROM ex1;.  
11d70 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  **     SELECT * 
11d80 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20  FROM temp.ex1;. 
11d90 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
11da0 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ->nCol<0 ){.    
11db0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
11dc0 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73  pParse, "view %s
11dd0 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64   is circularly d
11de0 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d  efined", pTable-
11df0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
11e00 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 1;.  }.  ass
11e10 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ert( pTable->nCo
11e20 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  l>=0 );..  /* If
11e30 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
11e40 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65  , it means we ne
11e50 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
11e60 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20  e table names.. 
11e70 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
11e80 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
11e90 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
11ea0 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64  ct() will expand
11eb0 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c   any.  ** "*" el
11ec0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65  ements in the re
11ed0 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65  sults set of the
11ee0 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61   view and will a
11ef0 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20  ssign cursors.  
11f00 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e  ** to the elemen
11f10 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ts of the FROM c
11f20 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64  lause.  But we d
11f30 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65  o not want these
11f40 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f   changes.  ** to
11f50 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20   be permanent.  
11f60 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  So the computati
11f70 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20  on is done on a 
11f80 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
11f90 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  CT.  ** statemen
11fa0 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
11fb0 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20  he view..  */.  
11fc0 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
11fd0 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65  pSelect );.  pSe
11fe0 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  l = sqlite3Selec
11ff0 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d  tDup(db, pTable-
12000 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
12010 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20  if( pSel ){.    
12020 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  n = pParse->nTab
12030 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63  ;.    sqlite3Src
12040 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
12050 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e  s(pParse, pSel->
12060 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62 6c  pSrc);.    pTabl
12070 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20  e->nCol = -1;.  
12080 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
12090 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 23 69 66 6e  bDisable++;.#ifn
120a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
120b0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
120c0 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41    xAuth = db->xA
120d0 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75  uth;.    db->xAu
120e0 74 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c  th = 0;.    pSel
120f0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
12100 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
12110 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20  Parse, pSel);.  
12120 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41    db->xAuth = xA
12130 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70  uth;.#else.    p
12140 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
12150 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
12160 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b  t(pParse, pSel);
12170 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72  .#endif.    pPar
12180 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20  se->nTab = n;.  
12190 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 70 43    if( pTable->pC
121a0 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  heck ){.      /*
121b0 20 43 52 45 41 54 45 20 56 49 45 57 20 6e 61 6d   CREATE VIEW nam
121c0 65 28 61 72 67 6c 69 73 74 29 20 41 53 20 2e 2e  e(arglist) AS ..
121d0 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e  ..      ** The n
121e0 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75  ames of the colu
121f0 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
12200 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 0a   are taken from.
12210 20 20 20 20 20 20 2a 2a 20 61 72 67 6c 69 73 74        ** arglist
12220 20 77 68 69 63 68 20 69 73 20 73 74 6f 72 65 64   which is stored
12230 20 69 6e 20 70 54 61 62 6c 65 2d 3e 70 43 68 65   in pTable->pChe
12240 63 6b 2e 20 20 54 68 65 20 70 43 68 65 63 6b 20  ck.  The pCheck 
12250 66 69 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20 6e  field.      ** n
12260 6f 72 6d 61 6c 6c 79 20 68 6f 6c 64 73 20 43 48  ormally holds CH
12270 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ECK constraints 
12280 6f 6e 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74  on an ordinary t
12290 61 62 6c 65 2c 20 62 75 74 20 66 6f 72 0a 20 20  able, but for.  
122a0 20 20 20 20 2a 2a 20 61 20 56 49 45 57 20 69 74      ** a VIEW it
122b0 20 68 6f 6c 64 73 20 74 68 65 20 6c 69 73 74 20   holds the list 
122c0 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  of column names.
122d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
122e0 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
122f0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
12300 65 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63  e, pTable->pChec
12310 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  k, .            
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12330 20 20 20 20 20 26 70 54 61 62 6c 65 2d 3e 6e 43       &pTable->nC
12340 6f 6c 2c 20 26 70 54 61 62 6c 65 2d 3e 61 43 6f  ol, &pTable->aCo
12350 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  l);.      if( db
12360 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
12370 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61  0 .       && pPa
12380 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 0a 20 20 20  rse->nErr==0.   
12390 20 20 20 20 26 26 20 70 54 61 62 6c 65 2d 3e 6e      && pTable->n
123a0 43 6f 6c 3d 3d 70 53 65 6c 2d 3e 70 45 4c 69 73  Col==pSel->pELis
123b0 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 29  t->nExpr.      )
123c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
123d0 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e  3SelectAddColumn
123e0 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
123f0 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 2c  (pParse, pTable,
12400 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   pSel);.      }.
12410 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53      }else if( pS
12420 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20 2f  elTab ){.      /
12430 2a 20 43 52 45 41 54 45 20 56 49 45 57 20 6e 61  * CREATE VIEW na
12440 6d 65 20 41 53 2e 2e 2e 20 20 77 69 74 68 6f 75  me AS...  withou
12450 74 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 6c 69  t an argument li
12460 73 74 2e 20 20 43 6f 6e 73 74 72 75 63 74 0a 20  st.  Construct. 
12470 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75       ** the colu
12480 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68  mn names from th
12490 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
124a0 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
124b0 74 68 65 20 76 69 65 77 2e 0a 20 20 20 20 20 20  the view..      
124c0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
124d0 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30   pTable->aCol==0
124e0 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65   );.      pTable
124f0 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
12500 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54  ->nCol;.      pT
12510 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65  able->aCol = pSe
12520 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
12530 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
12540 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  = 0;.      pSelT
12550 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
12560 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
12570 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
12580 6c 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c 65  ld(db, 0, pTable
12590 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
125a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
125b0 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
125c0 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20  .      nErr++;. 
125d0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
125e0 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
125f0 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 73 71  pSelTab);.    sq
12600 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
12610 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20  e(db, pSel);.   
12620 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
12630 44 69 73 61 62 6c 65 2d 2d 3b 0a 20 20 7d 20 65  Disable--;.  } e
12640 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b  lse {.    nErr++
12650 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e  ;.  }.  pTable->
12660 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 46  pSchema->schemaF
12670 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73  lags |= DB_Unres
12680 65 74 56 69 65 77 73 3b 0a 23 65 6e 64 69 66 20  etViews;.#endif 
12690 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
126a0 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  IEW */.  return 
126b0 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66  nErr;  .}.#endif
126c0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
126d0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
126e0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
126f0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
12700 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  BLE) */..#ifndef
12710 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
12720 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  W./*.** Clear th
12730 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
12740 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69  rom every VIEW i
12750 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a  n database idx..
12760 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
12770 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
12780 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  l(sqlite3 *db, i
12790 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45  nt idx){.  HashE
127a0 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74  lem *i;.  assert
127b0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
127c0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78  utexHeld(db, idx
127d0 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44  , 0) );.  if( !D
127e0 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
127f0 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
12800 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b  Views) ) return;
12810 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48  .  for(i=sqliteH
12820 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44  ashFirst(&db->aD
12830 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[idx].pSchema->
12840 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71  tblHash); i;i=sq
12850 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
12860 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
12870 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
12880 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(i);.    if( p
12890 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
128a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
128b0 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64  eteColumnNames(d
128c0 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
128d0 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  pTab->aCol = 0;.
128e0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
128f0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
12900 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
12910 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
12920 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23  resetViews);.}.#
12930 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71  else.# define sq
12940 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
12950 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20  (A,B).#endif /* 
12960 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
12970 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
12980 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
12990 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74  ed by the VDBE t
129a0 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74  o adjust the int
129b0 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
129c0 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77  used by SQLite w
129d0 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61  hen the btree la
129e0 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c  yer moves a tabl
129f0 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65  e root page. The
12a00 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  .** root-page of
12a10 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
12a20 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44  x in database iD
12a30 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72  b has changed fr
12a40 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69  om iFrom.** to i
12a50 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74  To..**.** Ticket
12a60 20 23 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d   #1728:  The sym
12a70 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20  bol table might 
12a80 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e  still contain in
12a90 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20  formation.** on 
12aa0 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e  tables and/or in
12ab0 64 69 63 65 73 20 74 68 61 74 20 61 72 65 20 74  dices that are t
12ac0 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  he process of be
12ad0 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20  ing deleted..** 
12ae0 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63  If you are unluc
12af0 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  ky, one of those
12b00 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73   deleted indices
12b10 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74   or tables might
12b20 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d  .** have the sam
12b30 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65  e rootpage numbe
12b40 72 20 61 73 20 74 68 65 20 72 65 61 6c 20 74 61  r as the real ta
12b50 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61  ble or index tha
12b60 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f  t is.** being mo
12b70 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e  ved.  So we cann
12b80 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e  ot stop searchin
12b90 67 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73  g after the firs
12ba0 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61  t match .** beca
12bb0 75 73 65 20 74 68 65 20 66 69 72 73 74 20 6d 61  use the first ma
12bc0 74 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72  tch might be for
12bd0 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65   one of the dele
12be0 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f  ted indices.** o
12bf0 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74  r tables and not
12c00 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
12c10 20 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c   that is actuall
12c20 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a  y being moved..*
12c30 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e  * We must contin
12c40 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ue looping until
12c50 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20   all tables and 
12c60 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20  indices with.** 
12c70 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20  rootpage==iFrom 
12c80 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72  have been conver
12c90 74 65 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f  ted to have a ro
12ca0 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a  otpage of iTo.**
12cb0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
12cc0 63 65 72 74 61 69 6e 20 74 68 61 74 20 77 65 20  certain that we 
12cd0 67 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e  got the right on
12ce0 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
12cf0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
12d00 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65  CUUM.void sqlite
12d10 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73  3RootPageMoved(s
12d20 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
12d30 69 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  iDb, int iFrom, 
12d40 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68  int iTo){.  Hash
12d50 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48  Elem *pElem;.  H
12d60 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62  ash *pHash;.  Db
12d70 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74   *pDb;..  assert
12d80 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
12d90 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
12da0 2c 20 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20  , 0) );.  pDb = 
12db0 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
12dc0 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70   pHash = &pDb->p
12dd0 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b  Schema->tblHash;
12de0 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
12df0 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61  iteHashFirst(pHa
12e00 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
12e10 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
12e20 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
12e30 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
12e40 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
12e50 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
12e60 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a  >tnum==iFrom ){.
12e70 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d        pTab->tnum
12e80 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20   = iTo;.    }.  
12e90 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62  }.  pHash = &pDb
12ea0 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
12eb0 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  sh;.  for(pElem=
12ec0 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
12ed0 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
12ee0 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
12ef0 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
12f00 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73   Index *pIdx = s
12f10 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
12f20 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49  lem);.    if( pI
12f30 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  dx->tnum==iFrom 
12f40 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74  ){.      pIdx->t
12f50 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d  num = iTo;.    }
12f60 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
12f70 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20  *.** Write code 
12f80 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62  to erase the tab
12f90 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
12fa0 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61  e iTable from da
12fb0 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41  tabase iDb..** A
12fc0 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74  lso write code t
12fd0 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c  o modify the sql
12fe0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
12ff0 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63   and internal sc
13000 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f  hema.** if a roo
13010 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65  t-page of anothe
13020 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64  r table is moved
13030 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61   by the btree-la
13040 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72  yer whilst.** er
13050 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68  asing iTable (th
13060 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69  is can happen wi
13070 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  th an auto-vacuu
13080 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20  m database)..*/ 
13090 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
130a0 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72  troyRootPage(Par
130b0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
130c0 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29  iTable, int iDb)
130d0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
130e0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
130f0 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d  rse);.  int r1 =
13100 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
13110 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  eg(pParse);.  as
13120 73 65 72 74 28 20 69 54 61 62 6c 65 3e 31 20 29  sert( iTable>1 )
13130 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
13140 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73 74  ddOp3(v, OP_Dest
13150 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c  roy, iTable, r1,
13160 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
13170 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
13180 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
13190 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
131a0 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  /* OP_Destroy
131b0 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e   stores an in in
131c0 74 65 67 65 72 20 72 31 2e 20 49 66 20 74 68 69  teger r1. If thi
131d0 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69  s integer.  ** i
131e0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
131f0 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
13200 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
13210 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a   table moved to.
13220 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54    ** location iT
13230 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  able. The follow
13240 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65  ing code modifie
13250 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  s the sqlite_mas
13260 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a  ter table to.  *
13270 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a  * reflect this..
13280 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23    **.  ** The "#
13290 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53 51 4c 20  NNN" in the SQL 
132a0 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e  is a special con
132b0 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73  stant that means
132c0 20 77 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a   whatever value.
132d0 20 20 2a 2a 20 69 73 20 69 6e 20 72 65 67 69 73    ** is in regis
132e0 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72  ter NNN.  See gr
132f0 61 6d 6d 61 72 20 72 75 6c 65 73 20 61 73 73 6f  ammar rules asso
13300 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
13310 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 2a 2a  TK_REGISTER.  **
13320 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64 69 74   token for addit
13330 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
13340 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  n..  */.  sqlite
13350 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
13360 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41  rse, .     "UPDA
13370 54 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f  TE %Q.%s SET roo
13380 74 70 61 67 65 3d 25 64 20 57 48 45 52 45 20 23  tpage=%d WHERE #
13390 25 64 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d  %d AND rootpage=
133a0 23 25 64 22 2c 0a 20 20 20 20 20 70 50 61 72 73  #%d",.     pPars
133b0 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
133c0 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52  zDbSName, MASTER
133d0 5f 4e 41 4d 45 2c 20 69 54 61 62 6c 65 2c 20 72  _NAME, iTable, r
133e0 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20  1, r1);.#endif. 
133f0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
13400 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
13410 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  1);.}../*.** Wri
13420 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20  te VDBE code to 
13430 65 72 61 73 65 20 74 61 62 6c 65 20 70 54 61 62  erase table pTab
13440 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61   and all associa
13450 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64  ted indices on d
13460 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20  isk..** Code to 
13470 75 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74  update the sqlit
13480 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20  e_master tables 
13490 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  and internal sch
134a0 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a  ema definitions.
134b0 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f  ** in case a roo
134c0 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  t-page belonging
134d0 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   to another tabl
134e0 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
134f0 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a  e btree layer.**
13500 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28   is also added (
13510 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
13520 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63  with an auto-vac
13530 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  uum database)..*
13540 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
13550 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65  stroyTable(Parse
13560 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
13570 2a 70 54 61 62 29 7b 0a 20 20 2f 2a 20 49 66 20  *pTab){.  /* If 
13580 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
13590 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   be auto-vacuum 
135a0 63 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49  capable (if SQLI
135b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
135c0 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64  UM.  ** is not d
135d0 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74  efined), then it
135e0 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
135f0 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79   call OP_Destroy
13600 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62   on the.  ** tab
13610 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f  le and index roo
13620 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72  t-pages in order
13630 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
13640 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20  the numerically 
13650 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f  .  ** largest ro
13660 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ot-page number. 
13670 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20  This guarantees 
13680 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65  that none of the
13690 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a   root-pages.  **
136a0 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64   to be destroyed
136b0 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79   is relocated by
136c0 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44   an earlier OP_D
136d0 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20  estroy. i.e. if 
136e0 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  the.  ** followi
136f0 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20  ng were coded:. 
13700 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74   **.  ** OP_Dest
13710 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e  roy 4 0.  ** ...
13720 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
13730 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61   5 0.  **.  ** a
13740 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68  nd root page 5 h
13750 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68  appened to be th
13760 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
13770 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68  age number in th
13780 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c  e.  ** database,
13790 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20   then root page 
137a0 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64  5 would be moved
137b0 20 74 6f 20 70 61 67 65 20 34 20 62 79 20 74 68   to page 4 by th
137c0 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74  e .  ** "OP_Dest
137d0 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e  roy 4 0" opcode.
137e0 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   The subsequent 
137f0 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22  "OP_Destroy 5 0"
13800 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20   would hit.  ** 
13810 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65  a free-list page
13820 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ..  */.  int iTa
13830 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a  b = pTab->tnum;.
13840 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64    int iDestroyed
13850 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
13860 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  1 ){.    Index *
13870 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c  pIdx;.    int iL
13880 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20  argest = 0;..   
13890 20 69 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d   if( iDestroyed=
138a0 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74  =0 || iTab<iDest
138b0 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69  royed ){.      i
138c0 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a  Largest = iTab;.
138d0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49      }.    for(pI
138e0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
138f0 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
13900 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
13910 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d  int iIdx = pIdx-
13920 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73  >tnum;.      ass
13930 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65  ert( pIdx->pSche
13940 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
13950 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  a );.      if( (
13960 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c  iDestroyed==0 ||
13970 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65   (iIdx<iDestroye
13980 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72  d)) && iIdx>iLar
13990 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  gest ){.        
139a0 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b  iLargest = iIdx;
139b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
139c0 20 20 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d     if( iLargest=
139d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
139e0 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rn;.    }else{. 
139f0 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
13a00 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
13a10 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
13a20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
13a30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44        assert( iD
13a40 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72  b>=0 && iDb<pPar
13a50 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  se->db->nDb );. 
13a60 20 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74       destroyRoot
13a70 50 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61  Page(pParse, iLa
13a80 72 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20 20  rgest, iDb);.   
13a90 20 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20     iDestroyed = 
13aa0 69 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a  iLargest;.    }.
13ab0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d    }.}../*.** Rem
13ac0 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ove entries from
13ad0 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
13ae0 4e 20 74 61 62 6c 65 73 20 28 66 6f 72 20 4e 20  N tables (for N 
13af0 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61  in (1,2,3)).** a
13b00 66 74 65 72 20 61 20 44 52 4f 50 20 49 4e 44 45  fter a DROP INDE
13b10 58 20 6f 72 20 44 52 4f 50 20 54 41 42 4c 45 20  X or DROP TABLE 
13b20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  command..*/.stat
13b30 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43  ic void sqlite3C
13b40 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 0a  learStatTables(.
13b50 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
13b60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13b70 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
13b80 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20  */.  int iDb,   
13b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13ba0 68 65 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  he database numb
13bb0 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  er */.  const ch
13bc0 61 72 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f  ar *zType,     /
13bd0 2a 20 22 69 64 78 22 20 6f 72 20 22 74 62 6c 22  * "idx" or "tbl"
13be0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
13bf0 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20   *zName      /* 
13c00 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f 72  Name of index or
13c10 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69   table */.){.  i
13c20 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
13c30 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50  ar *zDbName = pP
13c40 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
13c50 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 66  b].zDbSName;.  f
13c60 6f 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b  or(i=1; i<=4; i+
13c70 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 61  +){.    char zTa
13c80 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74  b[24];.    sqlit
13c90 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
13ca0 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73  of(zTab),zTab,"s
13cb0 71 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69 29  qlite_stat%d",i)
13cc0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
13cd0 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
13ce0 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62  e->db, zTab, zDb
13cf0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73  Name) ){.      s
13d00 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
13d10 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
13d20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
13d30 51 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25 51  Q.%s WHERE %s=%Q
13d40 22 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e 61  ",.        zDbNa
13d50 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c  me, zTab, zType,
13d60 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a   zName.      );.
13d70 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
13d80 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
13d90 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65   to drop a table
13da0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
13db0 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 50  3CodeDropTable(P
13dc0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
13dd0 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69  ble *pTab, int i
13de0 44 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b  Db, int isView){
13df0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
13e00 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
13e10 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65  se->db;.  Trigge
13e20 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 44  r *pTrigger;.  D
13e30 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
13e40 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73  b[iDb];..  v = s
13e50 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
13e60 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
13e70 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   v!=0 );.  sqlit
13e80 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
13e90 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
13ea0 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
13eb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
13ec0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49  UALTABLE.  if( I
13ed0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
13ee0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
13ef0 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42  eAddOp0(v, OP_VB
13f00 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  egin);.  }.#endi
13f10 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  f..  /* Drop all
13f20 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69   triggers associ
13f30 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
13f40 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
13f50 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20  d. Code.  ** is 
13f60 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d  generated to rem
13f70 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ove entries from
13f80 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61   sqlite_master a
13f90 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74  nd/or.  ** sqlit
13fa0 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66  e_temp_master if
13fb0 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
13fc0 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c    pTrigger = sql
13fd0 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28  ite3TriggerList(
13fe0 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
13ff0 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72   while( pTrigger
14000 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
14010 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
14020 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
14030 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54 72   || .        pTr
14040 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
14050 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
14060 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ma );.    sqlite
14070 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28  3DropTriggerPtr(
14080 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  pParse, pTrigger
14090 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 20  );.    pTrigger 
140a0 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78  = pTrigger->pNex
140b0 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  t;.  }..#ifndef 
140c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
140d0 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52  INCREMENT.  /* R
140e0 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65  emove any entrie
140f0 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  s of the sqlite_
14100 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61  sequence table a
14110 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20  ssociated with. 
14120 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
14130 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69  ing dropped. Thi
14140 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65  s is done before
14150 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72   the table is dr
14160 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74 68  opped.  ** at th
14170 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69  e btree level, i
14180 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74  n case the sqlit
14190 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
141a0 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d   needs to.  ** m
141b0 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  ove as a result 
141c0 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e  of the drop (can
141d0 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
141e0 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20  vacuum mode)..  
141f0 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  */.  if( pTab->t
14200 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
14210 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20  oincrement ){.  
14220 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
14230 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
14240 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
14250 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
14260 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ce WHERE name=%Q
14270 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44  ",.      pDb->zD
14280 62 53 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e  bSName, pTab->zN
14290 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23  ame.    );.  }.#
142a0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70  endif..  /* Drop
142b0 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54   all SQLITE_MAST
142c0 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64  ER table and ind
142d0 65 78 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ex entries that 
142e0 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20 2a  refer to the.  *
142f0 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f  * table. The pro
14300 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20  gram name loops 
14310 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74  through the mast
14320 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c  er table and del
14330 65 74 65 73 0a 20 20 2a 2a 20 65 76 65 72 79 20  etes.  ** every 
14340 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73 20  row that refers 
14350 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68  to a table of th
14360 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  e same name as t
14370 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a  he one being.  *
14380 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67  * dropped. Trigg
14390 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20  ers are handled 
143a0 73 65 70 61 72 61 74 65 6c 79 20 62 65 63 61 75  separately becau
143b0 73 65 20 61 20 74 72 69 67 67 65 72 20 63 61 6e  se a trigger can
143c0 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64   be.  ** created
143d0 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74   in the temp dat
143e0 61 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72  abase that refer
143f0 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20  s to a table in 
14400 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 64 61 74  another.  ** dat
14410 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  abase..  */.  sq
14420 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
14430 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
14440 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
14450 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d  %s WHERE tbl_nam
14460 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27  e=%Q and type!='
14470 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20  trigger'",.     
14480 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20   pDb->zDbSName, 
14490 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70 54 61  MASTER_NAME, pTa
144a0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b->zName);.  if(
144b0 20 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56   !isView && !IsV
144c0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
144d0 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65      destroyTable
144e0 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
144f0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65    }..  /* Remove
14500 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
14510 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69   from SQLite's i
14520 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61  nternal schema a
14530 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74  nd modify.  ** t
14540 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
14550 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  ..  */.  if( IsV
14560 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
14570 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14580 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73  ddOp4(v, OP_VDes
14590 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c  troy, iDb, 0, 0,
145a0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
145b0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
145c0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
145d0 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20  DropTable, iDb, 
145e0 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  0, 0, pTab->zNam
145f0 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  e, 0);.  sqlite3
14600 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
14610 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c  rse, iDb);.  sql
14620 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
14630 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  db, iDb);.}../*.
14640 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14650 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  is called to do 
14660 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52  the work of a DR
14670 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  OP TABLE stateme
14680 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20  nt..** pName is 
14690 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
146a0 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70  table to be drop
146b0 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ped..*/.void sql
146c0 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61  ite3DropTable(Pa
146d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
146e0 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
146f0 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45   isView, int noE
14700 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  rr){.  Table *pT
14710 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ab;.  Vdbe *v;. 
14720 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
14730 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
14740 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d   iDb;..  if( db-
14750 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
14760 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
14770 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
14780 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
14790 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73  >nErr==0 );.  as
147a0 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
147b0 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 73 71  c==1 );.  if( sq
147c0 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
147d0 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65  pParse) ) goto e
147e0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
147f0 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62    if( noErr ) db
14800 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2b 2b 3b  ->suppressErr++;
14810 0a 20 20 61 73 73 65 72 74 28 20 69 73 56 69 65  .  assert( isVie
14820 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d  w==0 || isView==
14830 4c 4f 43 41 54 45 5f 56 49 45 57 20 29 3b 0a 20  LOCATE_VIEW );. 
14840 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
14850 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70  ocateTableItem(p
14860 50 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20 26  Parse, isView, &
14870 70 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20  pName->a[0]);.  
14880 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e  if( noErr ) db->
14890 73 75 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a  suppressErr--;..
148a0 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
148b0 0a 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29  .    if( noErr )
148c0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
148d0 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50  fyNamedSchema(pP
148e0 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  arse, pName->a[0
148f0 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
14900 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
14910 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44  _table;.  }.  iD
14920 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
14930 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
14940 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61  b->pSchema);.  a
14950 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
14960 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
14970 0a 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73  .  /* If pTab is
14980 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
14990 2c 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f  , call ViewGetCo
149a0 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65  lumnNames() to e
149b0 6e 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73  nsure.  ** it is
149c0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20   initialized..  
149d0 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
149e0 61 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c 69  al(pTab) && sqli
149f0 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
14a00 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
14a10 61 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ab) ){.    goto 
14a20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
14a30 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
14a40 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
14a50 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
14a60 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e  nt code;.    con
14a70 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
14a80 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
14a90 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
14aa0 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
14ab0 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  [iDb].zDbSName;.
14ac0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
14ad0 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69  zArg2 = 0;.    i
14ae0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
14af0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
14b00 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
14b10 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20   0, zDb)){.     
14b20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14b30 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
14b40 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
14b50 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
14b60 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
14b70 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
14b80 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
14b90 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  MP_VIEW;.      }
14ba0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
14bb0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
14bc0 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23  _VIEW;.      }.#
14bd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14be0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
14bf0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
14c00 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
14c10 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51  .      code = SQ
14c20 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45  LITE_DROP_VTABLE
14c30 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20  ;.      zArg2 = 
14c40 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
14c50 28 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f 64  (db, pTab)->pMod
14c60 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a  ->zName;.#endif.
14c70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14c80 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
14c90 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
14ca0 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
14cb0 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
14cc0 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
14cd0 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
14ce0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  = SQLITE_DROP_TA
14cf0 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
14d00 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
14d10 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
14d20 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e  se, code, pTab->
14d30 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44  zName, zArg2, zD
14d40 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
14d50 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14d60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14d70 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
14d80 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
14d90 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e  DELETE, pTab->zN
14da0 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
14db0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
14dc0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
14dd0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
14de0 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
14df0 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
14e00 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
14e10 20 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33   .    && sqlite3
14e20 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
14e30 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 74  Name, "sqlite_st
14e40 61 74 22 2c 20 31 31 29 21 3d 30 20 29 7b 0a 20  at", 11)!=0 ){. 
14e50 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14e60 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
14e70 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
14e80 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e  dropped", pTab->
14e90 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
14ea0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14eb0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
14ec0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
14ed0 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50    /* Ensure DROP
14ee0 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73   TABLE is not us
14ef0 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e  ed on a view, an
14f00 64 20 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e  d DROP VIEW is n
14f10 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20  ot used.  ** on 
14f20 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  a table..  */.  
14f30 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54  if( isView && pT
14f40 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
14f50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
14f60 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
14f70 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f  se DROP TABLE to
14f80 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73   delete table %s
14f90 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
14fa0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
14fb0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
14fc0 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
14fd0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
14fe0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
14ff0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
15000 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64  e DROP VIEW to d
15010 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20  elete view %s", 
15020 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
15030 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
15040 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  _table;.  }.#end
15050 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
15060 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
15070 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
15080 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
15090 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20  .  ** on disk.. 
150a0 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
150b0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
150c0 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
150d0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
150e0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
150f0 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20  se, 1, iDb);.   
15100 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61   sqlite3ClearSta
15110 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20  tTables(pParse, 
15120 69 44 62 2c 20 22 74 62 6c 22 2c 20 70 54 61 62  iDb, "tbl", pTab
15130 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
15140 6c 69 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65  lite3FkDropTable
15150 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20  (pParse, pName, 
15160 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
15170 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28  e3CodeDropTable(
15180 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44  pParse, pTab, iD
15190 62 2c 20 69 73 56 69 65 77 29 3b 0a 20 20 7d 0a  b, isView);.  }.
151a0 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65  .exit_drop_table
151b0 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
151c0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61  stDelete(db, pNa
151d0 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  me);.}../*.** Th
151e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
151f0 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
15200 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79   new foreign key
15210 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a   on the table.**
15220 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
15230 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
15240 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69  pFromCol determi
15250 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e  nes which column
15260 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72  s.** in the curr
15270 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20  ent table point 
15280 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  to the foreign k
15290 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c  ey.  If pFromCol
152a0 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e  ==0 then.** conn
152b0 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74  ect the key to t
152c0 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
152d0 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73  nserted.  pTo is
152e0 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20   the name of.** 
152f0 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72  the table referr
15300 65 64 20 74 6f 20 28 61 2e 6b 2e 61 20 74 68 65  ed to (a.k.a the
15310 20 22 70 61 72 65 6e 74 22 20 74 61 62 6c 65 29   "parent" table)
15320 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c  .  pToCol is a l
15330 69 73 74 0a 2a 2a 20 6f 66 20 74 61 62 6c 65 73  ist.** of tables
15340 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70   in the parent p
15350 54 6f 20 74 61 62 6c 65 2e 20 20 66 6c 61 67 73  To table.  flags
15360 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a   contains all.**
15370 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
15380 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  ut the conflict 
15390 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
153a0 69 74 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a  ithms specified.
153b0 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c  ** in the ON DEL
153c0 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61  ETE, ON UPDATE a
153d0 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61  nd ON INSERT cla
153e0 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46  uses..**.** An F
153f0 4b 65 79 20 73 74 72 75 63 74 75 72 65 20 69 73  Key structure is
15400 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64   created and add
15410 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
15420 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64  currently.** und
15430 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
15440 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70  in the pParse->p
15450 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a  NewTable field..
15460 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67  **.** The foreig
15470 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72  n key is set for
15480 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65   IMMEDIATE proce
15490 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71  ssing.  A subseq
154a0 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20  uent call.** to 
154b0 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
154c0 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63  ignKey() might c
154d0 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45  hange this to DE
154e0 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20  FERRED..*/.void 
154f0 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72  sqlite3CreateFor
15500 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65  eignKey(.  Parse
15510 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
15520 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
15530 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
15540 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20   *pFromCol,  /* 
15550 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20  Columns in this 
15560 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74  table that point
15570 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20   to other table 
15580 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c  */.  Token *pTo,
15590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
155a0 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74  e of the other t
155b0 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
155c0 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f  st *pToCol,    /
155d0 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  * Columns in the
155e0 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
155f0 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
15600 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69         /* Confli
15610 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
15620 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a  gorithms. */.){.
15630 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
15640 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e  pParse->db;.#ifn
15650 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15660 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b  FOREIGN_KEY.  FK
15670 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20  ey *pFKey = 0;. 
15680 20 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a   FKey *pNextTo;.
15690 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61    Table *p = pPa
156a0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
156b0 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69    int nByte;.  i
156c0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  nt i;.  int nCol
156d0 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20  ;.  char *z;..  
156e0 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29  assert( pTo!=0 )
156f0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
15700 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
15710 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
15720 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30   if( pFromCol==0
15730 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   ){.    int iCol
15740 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
15750 20 20 69 66 28 20 4e 45 56 45 52 28 69 43 6f 6c    if( NEVER(iCol
15760 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  <0) ) goto fk_en
15770 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f  d;.    if( pToCo
15780 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
15790 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  pr!=1 ){.      s
157a0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
157b0 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20  Parse, "foreign 
157c0 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20  key on %s".     
157d0 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66      " should ref
157e0 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20  erence only one 
157f0 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
15800 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d  %T",.         p-
15810 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
15820 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67  e, pTo);.      g
15830 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
15840 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a  }.    nCol = 1;.
15850 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43    }else if( pToC
15860 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45  ol && pToCol->nE
15870 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  xpr!=pFromCol->n
15880 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Expr ){.    sqli
15890 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
158a0 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d  se,.        "num
158b0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
158c0 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f  n foreign key do
158d0 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
158e0 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20   number of ".   
158f0 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e       "columns in
15900 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
15910 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74  table");.    got
15920 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73  o fk_end;.  }els
15930 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46  e{.    nCol = pF
15940 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20  romCol->nExpr;. 
15950 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a   }.  nByte = siz
15960 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e  eof(*pFKey) + (n
15970 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46  Col-1)*sizeof(pF
15980 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20  Key->aCol[0]) + 
15990 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66  pTo->n + 1;.  if
159a0 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
159b0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f  for(i=0; i<pToCo
159c0 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  l->nExpr; i++){.
159d0 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73        nByte += s
159e0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
159f0 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
15a00 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20  e) + 1;.    }.  
15a10 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69  }.  pFKey = sqli
15a20 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
15a30 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  db, nByte );.  i
15a40 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20  f( pFKey==0 ){. 
15a50 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
15a60 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72    }.  pFKey->pFr
15a70 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d  om = p;.  pFKey-
15a80 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e  >pNextFrom = p->
15a90 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68  pFKey;.  z = (ch
15aa0 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c  ar*)&pFKey->aCol
15ab0 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d  [nCol];.  pFKey-
15ac0 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63  >zTo = z;.  memc
15ad0 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54  py(z, pTo->z, pT
15ae0 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e  o->n);.  z[pTo->
15af0 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  n] = 0;.  sqlite
15b00 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a  3Dequote(z);.  z
15b10 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20   += pTo->n+1;.  
15b20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43  pFKey->nCol = nC
15b30 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43  ol;.  if( pFromC
15b40 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b  ol==0 ){.    pFK
15b50 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f  ey->aCol[0].iFro
15b60 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  m = p->nCol-1;. 
15b70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
15b80 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
15b90 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  ){.      int j;.
15ba0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
15bb0 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  <p->nCol; j++){.
15bc0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
15bd0 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43  te3StrICmp(p->aC
15be0 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72  ol[j].zName, pFr
15bf0 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
15c00 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
15c10 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69     pFKey->aCol[i
15c20 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20  ].iFrom = j;.   
15c30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15c50 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e        if( j>=p->
15c60 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
15c70 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15c80 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
15c90 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75     "unknown colu
15ca0 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72  mn \"%s\" in for
15cb0 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
15cc0 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  ion", .         
15cd0 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
15ce0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
15cf0 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
15d00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
15d10 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
15d20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
15d30 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
15d40 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
15d50 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e  trlen30(pToCol->
15d60 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
15d70 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69     pFKey->aCol[i
15d80 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20  ].zCol = z;.    
15d90 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43    memcpy(z, pToC
15da0 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  ol->a[i].zName, 
15db0 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d  n);.      z[n] =
15dc0 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e   0;.      z += n
15dd0 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  +1;.    }.  }.  
15de0 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
15df0 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e  d = 0;.  pFKey->
15e00 61 41 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38  aAction[0] = (u8
15e10 29 28 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b  )(flags & 0xff);
15e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
15e30 4e 20 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 20  N DELETE action 
15e40 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74  */.  pFKey->aAct
15e50 69 6f 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 66  ion[1] = (u8)((f
15e60 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78  lags >> 8 ) & 0x
15e70 66 66 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50  ff);    /* ON UP
15e80 44 41 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a  DATE action */..
15e90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15ea0 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
15eb0 28 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65  (db, 0, p->pSche
15ec0 6d 61 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f  ma) );.  pNextTo
15ed0 20 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74   = (FKey *)sqlit
15ee0 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d  e3HashInsert(&p-
15ef0 3e 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61  >pSchema->fkeyHa
15f00 73 68 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79  sh, .      pFKey
15f10 2d 3e 7a 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70  ->zTo, (void *)p
15f20 46 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66 28 20  FKey.  );.  if( 
15f30 70 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29  pNextTo==pFKey )
15f40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d  {.    sqlite3Oom
15f50 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 67  Fault(db);.    g
15f60 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a  oto fk_end;.  }.
15f70 20 20 69 66 28 20 70 4e 65 78 74 54 6f 20 29 7b    if( pNextTo ){
15f80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
15f90 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30  xtTo->pPrevTo==0
15fa0 20 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70   );.    pFKey->p
15fb0 4e 65 78 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f  NextTo = pNextTo
15fc0 3b 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70  ;.    pNextTo->p
15fd0 50 72 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a  PrevTo = pFKey;.
15fe0 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74    }..  /* Link t
15ff0 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74  he foreign key t
16000 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74  o the table as t
16010 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20  he last step..  
16020 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20  */.  p->pFKey = 
16030 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d  pFKey;.  pFKey =
16040 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73   0;..fk_end:.  s
16050 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
16060 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20   pFKey);.#endif 
16070 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
16080 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
16090 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  KEY) */.  sqlite
160a0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
160b0 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20  db, pFromCol);. 
160c0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
160d0 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f  Delete(db, pToCo
160e0 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  l);.}../*.** Thi
160f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
16100 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54  led when an INIT
16110 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20  IALLY IMMEDIATE 
16120 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  or INITIALLY DEF
16130 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20  ERRED.** clause 
16140 69 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20  is seen as part 
16150 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  of a foreign key
16160 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68   definition.  Th
16170 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20  e isDeferred.** 
16180 70 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66  parameter is 1 f
16190 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  or INITIALLY DEF
161a0 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20  ERRED and 0 for 
161b0 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
161c0 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61  ATE..** The beha
161d0 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74  vior of the most
161e0 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65   recently create
161f0 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  d foreign key is
16200 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63   adjusted.** acc
16210 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69  ordingly..*/.voi
16220 64 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f  d sqlite3DeferFo
16230 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a  reignKey(Parse *
16240 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65  pParse, int isDe
16250 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66  ferred){.#ifndef
16260 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
16270 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65  EIGN_KEY.  Table
16280 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a   *pTab;.  FKey *
16290 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54  pFKey;.  if( (pT
162a0 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
162b0 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70  wTable)==0 || (p
162c0 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b  FKey = pTab->pFK
162d0 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ey)==0 ) return;
162e0 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 65 66  .  assert( isDef
162f0 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65  erred==0 || isDe
16300 66 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20  ferred==1 ); /* 
16310 45 56 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31  EV: R-30323-2191
16320 37 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73  7 */.  pFKey->is
16330 44 65 66 65 72 72 65 64 20 3d 20 28 75 38 29 69  Deferred = (u8)i
16340 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69  sDeferred;.#endi
16350 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  f.}../*.** Gener
16360 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
16370 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66  ll erase and ref
16380 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e  ill index *pIdx.
16390 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65    This is.** use
163a0 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
163b0 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20  a newly created 
163c0 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f  index or to reco
163d0 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e  mpute the.** con
163e0 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  tent of an index
163f0 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20   in response to 
16400 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  a REINDEX comman
16410 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52  d..**.** if memR
16420 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  ootPage is not n
16430 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e  egative, it mean
16440 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78  s that the index
16450 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65   is newly.** cre
16460 61 74 65 64 2e 20 20 54 68 65 20 72 65 67 69 73  ated.  The regis
16470 74 65 72 20 73 70 65 63 69 66 69 65 64 20 62 79  ter specified by
16480 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e   memRootPage con
16490 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  tains the.** roo
164a0 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
164b0 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20   the index.  If 
164c0 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e  memRootPage is n
164d0 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a  egative, then.**
164e0 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61   the index alrea
164f0 64 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75  dy exists and mu
16500 73 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65  st be cleared be
16510 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c  fore being refil
16520 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72  led and.** the r
16530 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
16540 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
16550 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65  taken from pInde
16560 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74  x->tnum..*/.stat
16570 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52  ic void sqlite3R
16580 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65  efillIndex(Parse
16590 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
165a0 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d  *pIndex, int mem
165b0 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62  RootPage){.  Tab
165c0 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
165d0 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54  x->pTable;  /* T
165e0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
165f0 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
16600 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d  t iTab = pParse-
16610 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20  >nTab++;     /* 
16620 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65  Btree cursor use
16630 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  d for pTab */.  
16640 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73  int iIdx = pPars
16650 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
16660 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75  * Btree cursor u
16670 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a  sed for pIndex *
16680 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 65 72 3b  /.  int iSorter;
16690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166a0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65     /* Cursor ope
166b0 6e 65 64 20 62 79 20 4f 70 65 6e 53 6f 72 74 65  ned by OpenSorte
166c0 72 20 28 69 66 20 69 6e 20 75 73 65 29 20 2a 2f  r (if in use) */
166d0 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20  .  int addr1;   
166e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166f0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
16700 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20  top of loop */. 
16710 20 69 6e 74 20 61 64 64 72 32 3b 20 20 20 20 20   int addr2;     
16720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16730 2f 2a 20 41 64 64 72 65 73 73 20 74 6f 20 6a 75  /* Address to ju
16740 6d 70 20 74 6f 20 66 6f 72 20 6e 65 78 74 20 69  mp to for next i
16750 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  teration */.  in
16760 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  t tnum;         
16770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16780 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64  Root page of ind
16790 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ex */.  int iPar
167a0 74 49 64 78 4c 61 62 65 6c 3b 20 20 20 20 20 20  tIdxLabel;      
167b0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74         /* Jump t
167c0 6f 20 74 68 69 73 20 6c 61 62 65 6c 20 74 6f 20  o this label to 
167d0 73 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20  skip a row */.  
167e0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
167f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16800 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
16810 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61  into this virtua
16820 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b  l machine */.  K
16830 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20  eyInfo *pKey;   
16840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16850 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64   KeyInfo for ind
16860 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  ex */.  int regR
16870 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20  ecord;          
16880 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
16890 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d  er holding assem
168a0 62 6c 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72  bled index recor
168b0 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
168c0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
168d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
168e0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
168f0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20   */.  int iDb = 
16900 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
16910 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d  ndex(db, pIndex-
16920 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e  >pSchema);..#ifn
16930 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16940 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
16950 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
16960 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
16970 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e  ITE_REINDEX, pIn
16980 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20  dex->zName, 0,. 
16990 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
169a0 5d 2e 7a 44 62 53 4e 61 6d 65 20 29 20 29 7b 0a  ].zDbSName ) ){.
169b0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
169c0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71  #endif..  /* Req
169d0 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
169e0 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  k on the table t
169f0 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f  o perform this o
16a00 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  peration */.  sq
16a10 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
16a20 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
16a30 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d  ->tnum, 1, pTab-
16a40 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20  >zName);..  v = 
16a50 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
16a60 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
16a70 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
16a80 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d  f( memRootPage>=
16a90 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  0 ){.    tnum = 
16aa0 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d  memRootPage;.  }
16ab0 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d  else{.    tnum =
16ac0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20   pIndex->tnum;. 
16ad0 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69   }.  pKey = sqli
16ae0 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65  te3KeyInfoOfInde
16af0 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
16b00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
16b10 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  y!=0 || db->mall
16b20 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
16b30 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 0a 20 20 2f  se->nErr );..  /
16b40 2a 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65  * Open the sorte
16b50 72 20 63 75 72 73 6f 72 20 69 66 20 77 65 20 61  r cursor if we a
16b60 72 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a  re to use one. *
16b70 2f 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50  /.  iSorter = pP
16b80 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
16b90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16ba0 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  4(v, OP_SorterOp
16bb0 65 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20  en, iSorter, 0, 
16bc0 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c  pIndex->nKeyCol,
16bd0 20 28 63 68 61 72 2a 29 0a 20 20 20 20 20 20 20   (char*).       
16be0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
16bf0 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
16c00 4b 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Key), P4_KEYINFO
16c10 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  );..  /* Open th
16c20 65 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68  e table. Loop th
16c30 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f  rough all rows o
16c40 66 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e 73  f the table, ins
16c50 65 72 74 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a  erting index.  *
16c60 2a 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74  * records into t
16c70 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20  he sorter. */.  
16c80 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
16c90 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69  (pParse, iTab, i
16ca0 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
16cb0 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20  nRead);.  addr1 
16cc0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
16cd0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
16ce0 2c 20 69 54 61 62 2c 20 30 29 3b 20 56 64 62 65  , iTab, 0); Vdbe
16cf0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 72  Coverage(v);.  r
16d00 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
16d10 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
16d20 72 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  rse);..  sqlite3
16d30 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
16d40 28 70 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69  (pParse,pIndex,i
16d50 54 61 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c  Tab,regRecord,0,
16d60 26 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30  &iPartIdxLabel,0
16d70 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ,0);.  sqlite3Vd
16d80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
16d90 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f  orterInsert, iSo
16da0 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29  rter, regRecord)
16db0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
16dc0 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70  vePartIdxLabel(p
16dd0 50 61 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c  Parse, iPartIdxL
16de0 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  abel);.  sqlite3
16df0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16e00 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
16e10 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  r1+1); VdbeCover
16e20 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
16e30 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
16e40 20 61 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d   addr1);.  if( m
16e50 65 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73  emRootPage<0 ) s
16e60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16e70 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e  (v, OP_Clear, tn
16e80 75 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  um, iDb);.  sqli
16e90 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
16ea0 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69   OP_OpenWrite, i
16eb0 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20  Idx, tnum, iDb, 
16ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16ed0 20 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65       (char *)pKe
16ee0 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  y, P4_KEYINFO);.
16ef0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
16f00 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
16f10 42 55 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f  BULKCSR|((memRoo
16f20 74 50 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47  tPage>=0)?OPFLAG
16f30 5f 50 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20  _P2ISREG:0));.. 
16f40 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
16f50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16f60 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f  _SorterSort, iSo
16f70 72 74 65 72 2c 20 30 29 3b 20 56 64 62 65 43 6f  rter, 0); VdbeCo
16f80 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28  verage(v);.  if(
16f90 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
16fa0 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69 6e  Index) ){.    in
16fb0 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t j2 = sqlite3Vd
16fc0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
16fd0 20 2b 20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65   + 3;.    sqlite
16fe0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6a 32 29  3VdbeGoto(v, j2)
16ff0 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  ;.    addr2 = sq
17000 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
17010 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
17020 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
17030 74 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f  t(v, OP_SorterCo
17040 6d 70 61 72 65 2c 20 69 53 6f 72 74 65 72 2c 20  mpare, iSorter, 
17050 6a 32 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20  j2, regRecord,. 
17060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17070 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
17080 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f  nKeyCol); VdbeCo
17090 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
170a0 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73  qlite3UniqueCons
170b0 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 4f  traint(pParse, O
170c0 45 5f 41 62 6f 72 74 2c 20 70 49 6e 64 65 78 29  E_Abort, pIndex)
170d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
170e0 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
170f0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
17100 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
17110 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
17120 53 6f 72 74 65 72 44 61 74 61 2c 20 69 53 6f 72  SorterData, iSor
17130 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20  ter, regRecord, 
17140 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  iIdx);.  sqlite3
17150 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
17160 5f 53 65 65 6b 45 6e 64 2c 20 69 49 64 78 29 3b  _SeekEnd, iIdx);
17170 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17180 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
17190 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67 52  sert, iIdx, regR
171a0 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
171b0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
171c0 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
171d0 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65  ESULT);.  sqlite
171e0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
171f0 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
17200 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
17210 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
17220 72 74 65 72 4e 65 78 74 2c 20 69 53 6f 72 74 65  rterNext, iSorte
17230 72 2c 20 61 64 64 72 32 29 3b 20 56 64 62 65 43  r, addr2); VdbeC
17240 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
17250 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
17260 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20  e(v, addr1);..  
17270 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17280 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
17290 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Tab);.  sqlite3V
172a0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
172b0 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a 20 20  Close, iIdx);.  
172c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
172d0 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
172e0 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Sorter);.}../*.*
172f0 2a 20 41 6c 6c 6f 63 61 74 65 20 68 65 61 70 20  * Allocate heap 
17300 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 61 6e  space to hold an
17310 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 77 69   Index object wi
17320 74 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e  th nCol columns.
17330 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20  .**.** Increase 
17340 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73  the allocation s
17350 69 7a 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61  ize to provide a
17360 6e 20 65 78 74 72 61 20 6e 45 78 74 72 61 20 62  n extra nExtra b
17370 79 74 65 73 0a 2a 2a 20 6f 66 20 38 2d 62 79 74  ytes.** of 8-byt
17380 65 20 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20  e aligned space 
17390 61 66 74 65 72 20 74 68 65 20 49 6e 64 65 78 20  after the Index 
173a0 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72  object and retur
173b0 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  n a.** pointer t
173c0 6f 20 74 68 69 73 20 65 78 74 72 61 20 73 70 61  o this extra spa
173d0 63 65 20 69 6e 20 2a 70 70 45 78 74 72 61 2e 0a  ce in *ppExtra..
173e0 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65  */.Index *sqlite
173f0 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62  3AllocateIndexOb
17400 6a 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20  ject(.  sqlite3 
17410 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
17420 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
17430 69 6f 6e 20 2a 2f 0a 20 20 69 31 36 20 6e 43 6f  ion */.  i16 nCo
17440 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l,            /*
17450 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
17460 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
17470 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e  index */.  int n
17480 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20  Extra,          
17490 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
174a0 65 73 20 6f 66 20 65 78 74 72 61 20 73 70 61 63  es of extra spac
174b0 65 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f 0a 20 20  e to alloc */.  
174c0 63 68 61 72 20 2a 2a 70 70 45 78 74 72 61 20 20  char **ppExtra  
174d0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
174e0 74 6f 20 74 68 65 20 22 65 78 74 72 61 22 20 73  to the "extra" s
174f0 70 61 63 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  pace */.){.  Ind
17500 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ex *p;          
17510 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 69    /* Allocated i
17520 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ndex object */. 
17530 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
17540 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
17550 66 20 73 70 61 63 65 20 66 6f 72 20 49 6e 64 65  f space for Inde
17560 78 20 6f 62 6a 65 63 74 20 2b 20 61 72 72 61 79  x object + array
17570 73 20 2a 2f 0a 0a 20 20 6e 42 79 74 65 20 3d 20  s */..  nByte = 
17580 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e  ROUND8(sizeof(In
17590 64 65 78 29 29 20 2b 20 20 20 20 20 20 20 20 20  dex)) +         
175a0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74       /* Index st
175b0 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20  ructure  */.    
175c0 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a        ROUND8(siz
175d0 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29  eof(char*)*nCol)
175e0 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e   +         /* In
175f0 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a  dex.azColl     *
17600 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e  /.          ROUN
17610 44 38 28 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74  D8(sizeof(LogEst
17620 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20  )*(nCol+1) +    
17630 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 4c   /* Index.aiRowL
17640 6f 67 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20  ogEst   */.     
17650 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
17660 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 20 2b 20 20  of(i16)*nCol +  
17670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
17680 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f  ex.aiColumn   */
17690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
176a0 20 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f    sizeof(u8)*nCo
176b0 6c 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  l);             
176c0 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72  /* Index.aSortOr
176d0 64 65 72 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  der */.  p = sql
176e0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
176f0 28 64 62 2c 20 6e 42 79 74 65 20 2b 20 6e 45 78  (db, nByte + nEx
17700 74 72 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  tra);.  if( p ){
17710 0a 20 20 20 20 63 68 61 72 20 2a 70 45 78 74 72  .    char *pExtr
17720 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29 2b 52  a = ((char*)p)+R
17730 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64  OUND8(sizeof(Ind
17740 65 78 29 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 43  ex));.    p->azC
17750 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  oll = (const cha
17760 72 2a 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74  r**)pExtra; pExt
17770 72 61 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a  ra += ROUND8(siz
17780 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29  eof(char*)*nCol)
17790 3b 0a 20 20 20 20 70 2d 3e 61 69 52 6f 77 4c 6f  ;.    p->aiRowLo
177a0 67 45 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29  gEst = (LogEst*)
177b0 70 45 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b  pExtra; pExtra +
177c0 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29  = sizeof(LogEst)
177d0 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 70  *(nCol+1);.    p
177e0 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31  ->aiColumn = (i1
177f0 36 2a 29 70 45 78 74 72 61 3b 20 20 20 20 20 20  6*)pExtra;      
17800 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f   pExtra += sizeo
17810 66 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20  f(i16)*nCol;.   
17820 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d   p->aSortOrder =
17830 20 28 75 38 2a 29 70 45 78 74 72 61 3b 0a 20 20   (u8*)pExtra;.  
17840 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e    p->nColumn = n
17850 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79  Col;.    p->nKey
17860 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a  Col = nCol - 1;.
17870 20 20 20 20 2a 70 70 45 78 74 72 61 20 3d 20 28      *ppExtra = (
17880 28 63 68 61 72 2a 29 70 29 20 2b 20 6e 42 79 74  (char*)p) + nByt
17890 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
178a0 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  p;.}../*.** Crea
178b0 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66  te a new index f
178c0 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e  or an SQL table.
178d0 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20    pName1.pName2 
178e0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
178f0 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64  he index .** and
17900 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65   pTblList is the
17910 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
17920 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
17930 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20   indexed.  Both 
17940 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c  will .** be NULL
17950 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b   for a primary k
17960 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74  ey or an index t
17970 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74  hat is created t
17980 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55  o satisfy a.** U
17990 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
179a0 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64  .  If pTable and
179b0 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c   pIndex are NULL
179c0 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  , use pParse->pN
179d0 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68  ewTable.** as th
179e0 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
179f0 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e  dexed.  pParse->
17a00 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74  pNewTable is a t
17a10 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  able that is.** 
17a20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
17a30 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61  constructed by a
17a40 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
17a50 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70  atement..**.** p
17a60 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
17a70 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
17a80 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20  indexed.  pList 
17a90 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
17aa0 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69  this.** is a pri
17ab0 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71  mary key or uniq
17ac0 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  ue-constraint on
17ad0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
17ae0 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a   column added.**
17af0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
17b00 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
17b10 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f  nstruction.  .*/
17b20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
17b30 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ateIndex(.  Pars
17b40 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
17b50 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * All informatio
17b60 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72  n about this par
17b70 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
17b80 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69  Name1,     /* Fi
17b90 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65  rst part of inde
17ba0 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
17bb0 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
17bc0 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53  pName2,     /* S
17bd0 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e  econd part of in
17be0 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
17bf0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69   NULL */.  SrcLi
17c00 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a  st *pTblName, /*
17c10 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e   Table to index.
17c20 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   Use pParse->pNe
17c30 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20  wTable if 0 */. 
17c40 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
17c50 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66  ,   /* A list of
17c60 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
17c70 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
17c80 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f  onError,       /
17c90 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49  * OE_Abort, OE_I
17ca0 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63  gnore, OE_Replac
17cb0 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f  e, or OE_None */
17cc0 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
17cd0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
17ce0 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
17cf0 65 67 69 6e 73 20 74 68 69 73 20 73 74 61 74 65  egins this state
17d00 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ment */.  Expr *
17d10 70 50 49 57 68 65 72 65 2c 20 20 20 20 2f 2a 20  pPIWhere,    /* 
17d20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72  WHERE clause for
17d30 20 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73   partial indices
17d40 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
17d50 64 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74  der,     /* Sort
17d60 20 6f 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72   order of primar
17d70 79 20 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74  y key when pList
17d80 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  ==NULL */.  int 
17d90 69 66 4e 6f 74 45 78 69 73 74 2c 20 20 20 20 2f  ifNotExist,    /
17da0 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20  * Omit error if 
17db0 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
17dc0 69 73 74 73 20 2a 2f 0a 20 20 75 38 20 69 64 78  ists */.  u8 idx
17dd0 54 79 70 65 20 20 20 20 20 20 20 20 20 2f 2a 20  Type         /* 
17de0 54 68 65 20 69 6e 64 65 78 20 74 79 70 65 20 2a  The index type *
17df0 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
17e00 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  ab = 0;     /* T
17e10 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
17e20 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
17e30 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20  Index = 0;   /* 
17e40 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
17e50 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61  created */.  cha
17e60 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20  r *zName = 0;   
17e70 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
17e80 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
17e90 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
17ea0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
17eb0 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d  aracters in zNam
17ec0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  e */.  int i, j;
17ed0 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
17ee0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61          /* For a
17ef0 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73  ssigning databas
17f00 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c  e names to pTabl
17f10 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  e */.  int sortO
17f20 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31  rderMask;   /* 1
17f30 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69   to honor DESC i
17f40 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69  n index.  0 to i
17f50 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69  gnore. */.  sqli
17f60 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
17f70 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b  ->db;.  Db *pDb;
17f80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17f90 54 68 65 20 73 70 65 63 69 66 69 63 20 74 61 62  The specific tab
17fa0 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
17fb0 65 20 69 6e 64 65 78 65 64 20 64 61 74 61 62 61  e indexed databa
17fc0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17fe0 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  Index of the dat
17ff0 61 62 61 73 65 20 74 68 61 74 20 69 73 20 62 65  abase that is be
18000 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  ing written */. 
18010 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20   Token *pName = 
18020 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69  0;    /* Unquali
18030 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65  fied name of the
18040 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65   index to create
18050 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70   */.  struct Exp
18060 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73  rList_item *pLis
18070 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f  tItem; /* For lo
18080 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74  oping over pList
18090 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
180a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
180b0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
180c0 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 45  allocated for zE
180d0 78 74 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  xtra[] */.  int 
180e0 6e 45 78 74 72 61 43 6f 6c 3b 20 20 20 20 20 20  nExtraCol;      
180f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18100 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
18110 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a  columns needed *
18120 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61  /.  char *zExtra
18130 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
18140 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70       /* Extra sp
18150 61 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e  ace after the In
18160 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dex object */.  
18170 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20  Index *pPk = 0; 
18180 20 20 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20       /* PRIMARY 
18190 4b 45 59 20 69 6e 64 65 78 20 66 6f 72 20 57 49  KEY index for WI
181a0 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
181b0 65 73 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d  es */..  if( db-
181c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
181d0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
181e0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
181f0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18200 20 7d 0a 20 20 69 66 28 20 49 4e 5f 44 45 43 4c   }.  if( IN_DECL
18210 41 52 45 5f 56 54 41 42 20 26 26 20 69 64 78 54  ARE_VTAB && idxT
18220 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54  ype!=SQLITE_IDXT
18230 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29  YPE_PRIMARYKEY )
18240 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
18250 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18260 7d 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  }.  if( SQLITE_O
18270 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
18280 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
18290 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
182a0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
182b0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
182c0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
182d0 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
182e0 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69    Return early i
182f0 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  f not found..  *
18300 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65  /.  if( pTblName
18310 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55  !=0 ){..    /* U
18320 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20  se the two-part 
18330 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65  index name to de
18340 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61  termine the data
18350 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20  base .    ** to 
18360 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74  search for the t
18370 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20  able. 'Fix' the 
18380 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
18390 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66  is db.    ** bef
183a0 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74  ore looking up t
183b0 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  he table..    */
183c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
183d0 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b  me1 && pName2 );
183e0 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
183f0 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
18400 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
18410 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
18420 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67     if( iDb<0 ) g
18430 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18440 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72  index;.    asser
18450 74 28 20 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d  t( pName && pNam
18460 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66  e->z );..#ifndef
18470 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d   SQLITE_OMIT_TEM
18480 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  PDB.    /* If th
18490 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73  e index name was
184a0 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68   unqualified, ch
184b0 65 63 6b 20 69 66 20 74 68 65 20 74 61 62 6c 65  eck if the table
184c0 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d  .    ** is a tem
184d0 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20  p table. If so, 
184e0 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
184f0 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f   to 1. Do not do
18500 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20   this.    ** if 
18510 69 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64  initialising a d
18520 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
18530 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
18540 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
18550 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71  .      pTab = sq
18560 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b  lite3SrcListLook
18570 75 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e  up(pParse, pTblN
18580 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
18590 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20  pName2->n==0 && 
185a0 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53  pTab && pTab->pS
185b0 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
185c0 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ].pSchema ){.   
185d0 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20       iDb = 1;.  
185e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
185f0 69 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46  if..    sqlite3F
18600 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50  ixInit(&sFix, pP
18610 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65  arse, iDb, "inde
18620 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  x", pName);.    
18630 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 72  if( sqlite3FixSr
18640 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 62  cList(&sFix, pTb
18650 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  lName) ){.      
18660 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 70  /* Because the p
18670 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73  arser constructs
18680 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61   pTblName from a
18690 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69   single identifi
186a0 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  er,.      ** sql
186b0 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 20 63  ite3FixSrcList c
186c0 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a  an never fail. *
186d0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30  /.      assert(0
186e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  );.    }.    pTa
186f0 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
18700 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73  eTableItem(pPars
18710 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d  e, 0, &pTblName-
18720 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65  >a[0]);.    asse
18730 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
18740 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d  iled==0 || pTab=
18750 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  =0 );.    if( pT
18760 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  ab==0 ) goto exi
18770 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
18780 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 26      if( iDb==1 &
18790 26 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  & db->aDb[iDb].p
187a0 53 63 68 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53  Schema!=pTab->pS
187b0 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73  chema ){.      s
187c0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
187d0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
187e0 20 20 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74     "cannot creat
187f0 65 20 61 20 54 45 4d 50 20 69 6e 64 65 78 20 6f  e a TEMP index o
18800 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65  n non-TEMP table
18810 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20   \"%s\"",.      
18820 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
18830 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  );.      goto ex
18840 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18850 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
18860 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
18870 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72   pPk = sqlite3Pr
18880 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
18890 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ab);.  }else{.  
188a0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d    assert( pName=
188b0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
188c0 28 20 70 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20  ( pStart==0 );. 
188d0 20 20 20 70 54 61 62 20 3d 20 70 50 61 72 73 65     pTab = pParse
188e0 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20  ->pNewTable;.   
188f0 20 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74   if( !pTab ) got
18900 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18910 64 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  dex;.    iDb = s
18920 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
18930 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
18940 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44  chema);.  }.  pD
18950 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
18960 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  ];..  assert( pT
18970 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ab!=0 );.  asser
18980 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
18990 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  =0 );.  if( sqli
189a0 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62  te3StrNICmp(pTab
189b0 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  ->zName, "sqlite
189c0 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 20  _", 7)==0 .     
189d0 20 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75    && db->init.bu
189e0 73 79 3d 3d 30 0a 23 69 66 20 53 51 4c 49 54 45  sy==0.#if SQLITE
189f0 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
18a00 54 49 4f 4e 0a 20 20 20 20 20 20 20 26 26 20 73  TION.       && s
18a10 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61  qlite3UserAuthTa
18a20 62 6c 65 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  ble(pTab->zName)
18a30 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ==0.#endif.     
18a40 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e    && sqlite3StrN
18a50 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d  ICmp(&pTab->zNam
18a60 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22  e[7],"altertab_"
18a70 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  ,9)!=0 ){.    sq
18a80 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18a90 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
18aa0 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
18ab0 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
18ac0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
18ad0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18ae0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
18af0 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66  E_OMIT_VIEW.  if
18b00 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
18b10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
18b20 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
18b30 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65  views may not be
18b40 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
18b50 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
18b60 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64  _index;.  }.#end
18b70 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
18b80 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
18b90 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74  BLE.  if( IsVirt
18ba0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
18bb0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18bc0 28 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61  (pParse, "virtua
18bd0 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  l tables may not
18be0 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
18bf0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18c00 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
18c10 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  endif..  /*.  **
18c20 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f   Find the name o
18c30 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61  f the index.  Ma
18c40 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
18c50 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f   not already ano
18c60 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ther.  ** index 
18c70 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  or table with th
18c80 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20  e same name.  . 
18c90 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69   **.  ** Excepti
18ca0 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72  on:  If we are r
18cb0 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73  eading the names
18cc0 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e   of permanent in
18cd0 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20  dices from the. 
18ce0 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   ** sqlite_maste
18cf0 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65  r table (because
18d00 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
18d10 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20  ess changed the 
18d20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a  schema) and.  **
18d30 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65   one of the inde
18d40 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73  x names collides
18d50 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f   with the name o
18d60 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  f a temporary ta
18d70 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65  ble or.  ** inde
18d80 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  x, then we will 
18d90 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63  continue to proc
18da0 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a  ess this index..
18db0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61    **.  ** If pNa
18dc0 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
18dd0 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20  hat we are.  ** 
18de0 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70  dealing with a p
18df0 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e  rimary key or UN
18e00 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
18e10 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76    We have to inv
18e20 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e  ent our.  ** own
18e30 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   name..  */.  if
18e40 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
18e50 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
18e60 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
18e70 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
18e80 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
18e90 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18ea0 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  x;.    assert( p
18eb0 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  Name->z!=0 );.  
18ec0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
18ed0 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
18ee0 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
18ef0 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
18f00 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
18f10 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
18f20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
18f30 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66  busy ){.      if
18f40 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
18f50 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  le(db, zName, 0)
18f60 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
18f70 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
18f80 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73  Parse, "there is
18f90 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65   already a table
18fa0 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d   named %s", zNam
18fb0 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
18fc0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18fd0 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
18fe0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
18ff0 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
19000 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 44 62 53 4e  Name, pDb->zDbSN
19010 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
19020 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74   if( !ifNotExist
19030 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
19040 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
19050 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c  se, "index %s al
19060 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a  ready exists", z
19070 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Name);.      }el
19080 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
19090 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
190a0 73 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  sy );.        sq
190b0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
190c0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
190d0 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
190e0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
190f0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
19100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
19110 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   n;.    Index *p
19120 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c  Loop;.    for(pL
19130 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  oop=pTab->pIndex
19140 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c  , n=1; pLoop; pL
19150 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74  oop=pLoop->pNext
19160 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61  , n++){}.    zNa
19170 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
19180 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ntf(db, "sqlite_
19190 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22  autoindex_%s_%d"
191a0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e  , pTab->zName, n
191b0 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
191c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
191d0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
191e0 64 65 78 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  dex;.    }..    
191f0 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64  /* Automatic ind
19200 65 78 20 6e 61 6d 65 73 20 67 65 6e 65 72 61 74  ex names generat
19210 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 73  ed from within s
19220 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
19230 74 61 62 28 29 0a 20 20 20 20 2a 2a 20 6d 75 73  tab().    ** mus
19240 74 20 68 61 76 65 20 6e 61 6d 65 73 20 74 68 61  t have names tha
19250 74 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 66  t are distinct f
19260 72 6f 6d 20 6e 6f 72 6d 61 6c 20 61 75 74 6f 6d  rom normal autom
19270 61 74 69 63 20 69 6e 64 65 78 20 6e 61 6d 65 73  atic index names
19280 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  ..    ** The fol
19290 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
192a0 20 63 6f 6e 76 65 72 74 73 20 22 73 71 6c 69 74   converts "sqlit
192b0 65 33 5f 61 75 74 6f 69 6e 64 65 78 2e 2e 2e 22  e3_autoindex..."
192c0 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 22 73 71   into.    ** "sq
192d0 6c 69 74 65 33 5f 62 75 74 6f 69 6e 64 65 78 2e  lite3_butoindex.
192e0 2e 2e 22 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .." in order to 
192f0 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 73 20 64  make the names d
19300 69 73 74 69 6e 63 74 2e 0a 20 20 20 20 2a 2a 20  istinct..    ** 
19310 54 68 65 20 22 76 74 61 62 5f 65 72 72 2e 74 65  The "vtab_err.te
19320 73 74 22 20 74 65 73 74 20 64 65 6d 6f 6e 73 74  st" test demonst
19330 72 61 74 65 73 20 74 68 65 20 6e 65 65 64 20 6f  rates the need o
19340 66 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  f this statement
19350 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 4e 5f  . */.    if( IN_
19360 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 7a  DECLARE_VTAB ) z
19370 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a 20 20 7d 0a 0a  Name[7]++;.  }..
19380 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61    /* Check for a
19390 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
193a0 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e  create an index.
193b0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
193c0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
193d0 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
193e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
193f0 3d 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 3b  = pDb->zDbSName;
19400 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
19410 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
19420 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
19430 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
19440 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  b), 0, zDb) ){. 
19450 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
19460 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
19470 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
19480 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
19490 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
194a0 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
194b0 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
194c0 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
194d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
194e0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
194f0 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
19500 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
19510 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
19520 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
19530 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
19540 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
19550 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
19560 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
19570 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
19580 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
19590 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
195a0 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
195b0 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
195c0 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
195d0 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
195e0 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
195f0 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
19600 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
19610 20 20 20 54 6f 6b 65 6e 20 70 72 65 76 43 6f 6c     Token prevCol
19620 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  ;.    Column *pC
19630 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c  ol = &pTab->aCol
19640 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a  [pTab->nCol-1];.
19650 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
19660 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 55 4e  gs |= COLFLAG_UN
19670 49 51 55 45 3b 0a 20 20 20 20 73 71 6c 69 74 65  IQUE;.    sqlite
19680 33 54 6f 6b 65 6e 49 6e 69 74 28 26 70 72 65 76  3TokenInit(&prev
19690 43 6f 6c 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  Col, pCol->zName
196a0 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  );.    pList = s
196b0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
196c0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 0a  pend(pParse, 0,.
196d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
196e0 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
196f0 62 2c 20 54 4b 5f 49 44 2c 20 26 70 72 65 76 43  b, TK_ID, &prevC
19700 6f 6c 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28  ol, 0));.    if(
19710 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
19720 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19730 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
19740 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20  pList->nExpr==1 
19750 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
19760 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64  prListSetSortOrd
19770 65 72 28 70 4c 69 73 74 2c 20 73 6f 72 74 4f 72  er(pList, sortOr
19780 64 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  der);.  }else{. 
19790 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
197a0 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50  stCheckLength(pP
197b0 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 22 69 6e  arse, pList, "in
197c0 64 65 78 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  dex");.  }..  /*
197d0 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
197e0 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70  many bytes of sp
197f0 61 63 65 20 61 72 65 20 72 65 71 75 69 72 65 64  ace are required
19800 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63   to store explic
19810 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66  itly.  ** specif
19820 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ied collation se
19830 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20  quence names..  
19840 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
19850 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
19860 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
19870 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  xpr = pList->a[i
19880 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ].pExpr;.    ass
19890 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b  ert( pExpr!=0 );
198a0 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
198b0 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
198c0 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b  {.      nExtra +
198d0 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74  = (1 + sqlite3St
198e0 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e  rlen30(pExpr->u.
198f0 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a  zToken));.    }.
19900 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20    }..  /* .  ** 
19910 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  Allocate the ind
19920 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20  ex structure. . 
19930 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71   */.  nName = sq
19940 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
19950 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f  ame);.  nExtraCo
19960 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e  l = pPk ? pPk->n
19970 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70 49  KeyCol : 1;.  pI
19980 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 41 6c  ndex = sqlite3Al
19990 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63  locateIndexObjec
199a0 74 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45 78  t(db, pList->nEx
199b0 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c 0a  pr + nExtraCol,.
199c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199e0 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e 45        nName + nE
199f0 78 74 72 61 20 2b 20 31 2c 20 26 7a 45 78 74 72  xtra + 1, &zExtr
19a00 61 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  a);.  if( db->ma
19a10 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
19a20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
19a30 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
19a40 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
19a50 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e  TE_ALIGNMENT(pIn
19a60 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  dex->aiRowLogEst
19a70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ) );.  assert( E
19a80 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
19a90 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  ENT(pIndex->azCo
19aa0 6c 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65 78 2d  ll) );.  pIndex-
19ab0 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61 3b  >zName = zExtra;
19ac0 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e 61  .  zExtra += nNa
19ad0 6d 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79  me + 1;.  memcpy
19ae0 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20  (pIndex->zName, 
19af0 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b  zName, nName+1);
19b00 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
19b10 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
19b20 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75  ex->onError = (u
19b30 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e  8)onError;.  pIn
19b40 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  dex->uniqNotNull
19b50 20 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e   = onError!=OE_N
19b60 6f 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69  one;.  pIndex->i
19b70 64 78 54 79 70 65 20 3d 20 69 64 78 54 79 70 65  dxType = idxType
19b80 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  ;.  pIndex->pSch
19b90 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ema = db->aDb[iD
19ba0 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 49  b].pSchema;.  pI
19bb0 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20  ndex->nKeyCol = 
19bc0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
19bd0 69 66 28 20 70 50 49 57 68 65 72 65 20 29 7b 0a  if( pPIWhere ){.
19be0 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
19bf0 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28  veSelfReference(
19c00 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43  pParse, pTab, NC
19c10 5f 50 61 72 74 49 64 78 2c 20 70 50 49 57 68 65  _PartIdx, pPIWhe
19c20 72 65 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e 64  re, 0);.    pInd
19c30 65 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  ex->pPartIdxWher
19c40 65 20 3d 20 70 50 49 57 68 65 72 65 3b 0a 20 20  e = pPIWhere;.  
19c50 20 20 70 50 49 57 68 65 72 65 20 3d 20 30 3b 0a    pPIWhere = 0;.
19c60 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
19c70 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
19c80 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
19c90 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
19ca0 74 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f  to see if we sho
19cb0 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72  uld honor DESC r
19cc0 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78  equests on index
19cd0 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20   columns.  */.  
19ce0 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
19cf0 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ->file_format>=4
19d00 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65   ){.    sortOrde
19d10 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a  rMask = -1;   /*
19d20 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20   Honor DESC */. 
19d30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74   }else{.    sort
19d40 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20  OrderMask = 0;  
19d50 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43    /* Ignore DESC
19d60 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e   */.  }..  /* An
19d70 61 6c 79 7a 65 20 74 68 65 20 6c 69 73 74 20 6f  alyze the list o
19d80 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  f expressions th
19d90 61 74 20 66 6f 72 6d 20 74 68 65 20 74 65 72 6d  at form the term
19da0 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  s of the index a
19db0 6e 64 0a 20 20 2a 2a 20 72 65 70 6f 72 74 20 61  nd.  ** report a
19dc0 6e 79 20 65 72 72 6f 72 73 2e 20 20 49 6e 20 74  ny errors.  In t
19dd0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
19de0 68 65 72 65 20 74 68 65 20 65 78 70 72 65 73 73  here the express
19df0 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 0a 20  ion is exactly. 
19e00 20 2a 2a 20 61 20 74 61 62 6c 65 20 63 6f 6c 75   ** a table colu
19e10 6d 6e 2c 20 73 74 6f 72 65 20 74 68 61 74 20 63  mn, store that c
19e20 6f 6c 75 6d 6e 20 69 6e 20 61 69 43 6f 6c 75 6d  olumn in aiColum
19e30 6e 5b 5d 2e 20 20 46 6f 72 20 67 65 6e 65 72 61  n[].  For genera
19e40 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 20  l expressions,. 
19e50 20 2a 2a 20 70 6f 70 75 6c 61 74 65 20 70 49 6e   ** populate pIn
19e60 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 61 6e  dex->aColExpr an
19e70 64 20 73 74 6f 72 65 20 58 4e 5f 45 58 50 52 20  d store XN_EXPR 
19e80 28 2d 32 29 20 69 6e 20 61 69 43 6f 6c 75 6d 6e  (-2) in aiColumn
19e90 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  []..  **.  ** TO
19ea0 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e  DO: Issue a warn
19eb0 69 6e 67 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f  ing if two or mo
19ec0 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  re columns of th
19ed0 65 20 69 6e 64 65 78 20 61 72 65 20 69 64 65 6e  e index are iden
19ee0 74 69 63 61 6c 2e 0a 20 20 2a 2a 20 54 4f 44 4f  tical..  ** TODO
19ef0 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e  : Issue a warnin
19f00 67 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 70  g if the table p
19f10 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73  rimary key is us
19f20 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
19f30 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6b 65 79  e.  ** index key
19f40 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
19f50 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73  , pListItem=pLis
19f60 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  t->a; i<pList->n
19f70 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74  Expr; i++, pList
19f80 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
19f90 72 20 2a 70 43 45 78 70 72 3b 20 20 20 20 20 20  r *pCExpr;      
19fa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19fb0 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20 65 78  he i-th index ex
19fc0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
19fd0 69 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f 72  int requestedSor
19fe0 74 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20 2f  tOrder;        /
19ff0 2a 20 41 53 43 20 6f 72 20 44 45 53 43 20 6f 6e  * ASC or DESC on
1a000 20 74 68 65 20 69 2d 74 68 20 65 78 70 72 65 73   the i-th expres
1a010 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  sion */.    cons
1a020 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20  t char *zColl;  
1a030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1a040 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1a050 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 73 71   name */..    sq
1a060 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28  lite3StringToId(
1a070 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
1a080 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1a090 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e  solveSelfReferen
1a0a0 63 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ce(pParse, pTab,
1a0b0 20 4e 43 5f 49 64 78 45 78 70 72 2c 20 70 4c 69   NC_IdxExpr, pLi
1a0c0 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 30  stItem->pExpr, 0
1a0d0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
1a0e0 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65  e->nErr ) goto e
1a0f0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1a100 3b 0a 20 20 20 20 70 43 45 78 70 72 20 3d 20 73  ;.    pCExpr = s
1a110 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
1a120 6c 6c 61 74 65 28 70 4c 69 73 74 49 74 65 6d 2d  llate(pListItem-
1a130 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  >pExpr);.    if(
1a140 20 70 43 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f   pCExpr->op!=TK_
1a150 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
1a160 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65  if( pTab==pParse
1a170 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20  ->pNewTable ){. 
1a180 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1a190 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1a1a0 65 78 70 72 65 73 73 69 6f 6e 73 20 70 72 6f 68  expressions proh
1a1b0 69 62 69 74 65 64 20 69 6e 20 50 52 49 4d 41 52  ibited in PRIMAR
1a1c0 59 20 4b 45 59 20 61 6e 64 20 22 0a 20 20 20 20  Y KEY and ".    
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1e0 20 20 20 20 20 20 20 20 20 20 20 20 22 55 4e 49              "UNI
1a1f0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 22  QUE constraints"
1a200 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
1a210 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1a220 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
1a230 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 43 6f   if( pIndex->aCo
1a240 6c 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  lExpr==0 ){.    
1a250 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43      ExprList *pC
1a260 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  opy = sqlite3Exp
1a270 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4c 69  rListDup(db, pLi
1a280 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  st, 0);.        
1a290 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72  pIndex->aColExpr
1a2a0 20 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20 20 20   = pCopy;.      
1a2b0 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
1a2c0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
1a2d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
1a2e0 70 79 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  py!=0 );.       
1a2f0 20 20 20 70 4c 69 73 74 49 74 65 6d 20 3d 20 26     pListItem = &
1a300 70 43 6f 70 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20  pCopy->a[i];.   
1a310 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1a320 20 20 20 20 20 6a 20 3d 20 58 4e 5f 45 58 50 52       j = XN_EXPR
1a330 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  ;.      pIndex->
1a340 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e  aiColumn[i] = XN
1a350 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e  _EXPR;.      pIn
1a360 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  dex->uniqNotNull
1a370 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1a380 0a 20 20 20 20 20 20 6a 20 3d 20 70 43 45 78 70  .      j = pCExp
1a390 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
1a3a0 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 30 78 37    assert( j<=0x7
1a3b0 66 66 66 20 29 3b 0a 20 20 20 20 20 20 69 66 28  fff );.      if(
1a3c0 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   j<0 ){.        
1a3d0 6a 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  j = pTab->iPKey;
1a3e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1a3f0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e   pTab->aCol[j].n
1a400 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  otNull==0 ){.   
1a410 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69       pIndex->uni
1a420 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  qNotNull = 0;.  
1a430 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64      }.      pInd
1a440 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
1a450 3d 20 28 69 31 36 29 6a 3b 0a 20 20 20 20 7d 0a  = (i16)j;.    }.
1a460 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20      zColl = 0;. 
1a470 20 20 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d     if( pListItem
1a480 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ->pExpr->op==TK_
1a490 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20  COLLATE ){.     
1a4a0 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20   int nColl;.    
1a4b0 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49    zColl = pListI
1a4c0 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54  tem->pExpr->u.zT
1a4d0 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c  oken;.      nCol
1a4e0 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  l = sqlite3Strle
1a4f0 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a  n30(zColl) + 1;.
1a500 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 45        assert( nE
1a510 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20  xtra>=nColl );. 
1a520 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 78 74       memcpy(zExt
1a530 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c  ra, zColl, nColl
1a540 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  );.      zColl =
1a550 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20 7a   zExtra;.      z
1a560 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a  Extra += nColl;.
1a570 20 20 20 20 20 20 6e 45 78 74 72 61 20 2d 3d 20        nExtra -= 
1a580 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  nColl;.    }else
1a590 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20   if( j>=0 ){.   
1a5a0 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d     zColl = pTab-
1a5b0 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a  >aCol[j].zColl;.
1a5c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a      }.    if( !z
1a5d0 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 73  Coll ) zColl = s
1a5e0 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b  qlite3StrBINARY;
1a5f0 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
1a600 69 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69  it.busy && !sqli
1a610 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
1a620 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20  (pParse, zColl) 
1a630 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
1a640 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1a650 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
1a660 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a  x->azColl[i] = z
1a670 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73  Coll;.    reques
1a680 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70  tedSortOrder = p
1a690 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  ListItem->sortOr
1a6a0 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d  der & sortOrderM
1a6b0 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d  ask;.    pIndex-
1a6c0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
1a6d0 20 28 75 38 29 72 65 71 75 65 73 74 65 64 53 6f   (u8)requestedSo
1a6e0 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  rtOrder;.  }..  
1a6f0 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 74 61  /* Append the ta
1a700 62 6c 65 20 6b 65 79 20 74 6f 20 74 68 65 20 65  ble key to the e
1a710 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  nd of the index.
1a720 20 20 46 6f 72 20 57 49 54 48 4f 55 54 20 52 4f    For WITHOUT RO
1a730 57 49 44 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20  WID.  ** tables 
1a740 28 77 68 65 6e 20 70 50 6b 21 3d 30 29 20 74 68  (when pPk!=0) th
1a750 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64  is will be the d
1a760 65 63 6c 61 72 65 64 20 50 52 49 4d 41 52 59 20  eclared PRIMARY 
1a770 4b 45 59 2e 20 20 46 6f 72 0a 20 20 2a 2a 20 6e  KEY.  For.  ** n
1a780 6f 72 6d 61 6c 20 74 61 62 6c 65 73 20 28 77 68  ormal tables (wh
1a790 65 6e 20 70 50 6b 3d 3d 30 29 20 74 68 69 73 20  en pPk==0) this 
1a7a0 77 69 6c 6c 20 62 65 20 74 68 65 20 72 6f 77 69  will be the rowi
1a7b0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
1a7c0 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  k ){.    for(j=0
1a7d0 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  ; j<pPk->nKeyCol
1a7e0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; j++){.      in
1a7f0 74 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c  t x = pPk->aiCol
1a800 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73  umn[j];.      as
1a810 73 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20  sert( x>=0 );.  
1a820 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d      if( hasColum
1a830 6e 28 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  n(pIndex->aiColu
1a840 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  mn, pIndex->nKey
1a850 43 6f 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20 20  Col, x) ){.     
1a860 20 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75     pIndex->nColu
1a870 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c  mn--; .      }el
1a880 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64  se{.        pInd
1a890 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
1a8a0 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  = x;.        pIn
1a8b0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
1a8c0 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b   pPk->azColl[j];
1a8d0 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1a8e0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
1a8f0 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72   pPk->aSortOrder
1a900 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b  [j];.        i++
1a910 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a920 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70      assert( i==p
1a930 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
1a940 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1a950 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
1a960 69 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20  i] = XN_ROWID;. 
1a970 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c     pIndex->azCol
1a980 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 53 74  l[i] = sqlite3St
1a990 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 20 20 73  rBINARY;.  }.  s
1a9a0 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77  qlite3DefaultRow
1a9b0 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 20 20 69  Est(pIndex);.  i
1a9c0 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  f( pParse->pNewT
1a9d0 61 62 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d 61  able==0 ) estima
1a9e0 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49 6e  teIndexWidth(pIn
1a9f0 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  dex);..  /* If t
1aa00 68 69 73 20 69 6e 64 65 78 20 63 6f 6e 74 61 69  his index contai
1aa10 6e 73 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  ns every column 
1aa20 6f 66 20 69 74 73 20 74 61 62 6c 65 2c 20 74 68  of its table, th
1aa30 65 6e 20 6d 61 72 6b 0a 20 20 2a 2a 20 69 74 20  en mark.  ** it 
1aa40 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  as a covering in
1aa50 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  dex */.  assert(
1aa60 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
1aa70 0a 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e  .      || pTab->
1aa80 69 50 4b 65 79 3c 30 20 7c 7c 20 73 71 6c 69 74  iPKey<0 || sqlit
1aa90 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
1aaa0 70 49 6e 64 65 78 2c 20 70 54 61 62 2d 3e 69 50  pIndex, pTab->iP
1aab0 4b 65 79 29 3e 3d 30 20 29 3b 0a 20 20 69 66 28  Key)>=0 );.  if(
1aac0 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 26 26 20   pTblName!=0 && 
1aad0 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  pIndex->nColumn>
1aae0 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  =pTab->nCol ){. 
1aaf0 20 20 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76     pIndex->isCov
1ab00 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 66  ering = 1;.    f
1ab10 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
1ab20 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
1ab30 20 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69    if( j==pTab->i
1ab40 50 4b 65 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b  PKey ) continue;
1ab50 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1ab60 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
1ab70 70 49 6e 64 65 78 2c 6a 29 3e 3d 30 20 29 20 63  pIndex,j)>=0 ) c
1ab80 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
1ab90 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e  Index->isCoverin
1aba0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  g = 0;.      bre
1abb0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
1abc0 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73   if( pTab==pPars
1abd0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a  e->pNewTable ){.
1abe0 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74      /* This rout
1abf0 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c  ine has been cal
1ac00 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e  led to create an
1ac10 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
1ac20 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73   as a.    ** res
1ac30 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59  ult of a PRIMARY
1ac40 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
1ac50 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d  lause on a colum
1ac60 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72  n definition, or
1ac70 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52  .    ** a PRIMAR
1ac80 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
1ac90 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67  clause following
1aca0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69   the column defi
1acb0 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20  nitions..    ** 
1acc0 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20  i.e. one of:.   
1acd0 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54   **.    ** CREAT
1ace0 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d  E TABLE t(x PRIM
1acf0 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20  ARY KEY, y);.   
1ad00 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
1ad10 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28   t(x, y, UNIQUE(
1ad20 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20  x, y));.    **. 
1ad30 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79     ** Either way
1ad40 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
1ad50 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
1ad60 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e 20  ady has such an 
1ad70 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a  index. If.    **
1ad80 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65   so, don't bothe
1ad90 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73 20  r creating this 
1ada0 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61  one. This only a
1adb0 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a  pplies to.    **
1adc0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
1add0 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20  reated indices. 
1ade0 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20  Users can do as 
1adf0 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a 20  they wish with. 
1ae00 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69     ** explicit i
1ae10 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20  ndices..    **. 
1ae20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45     ** Two UNIQUE
1ae30 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20   or PRIMARY KEY 
1ae40 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
1ae50 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69 76  considered equiv
1ae60 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e  alent.    ** (an
1ae70 64 20 74 68 75 73 20 73 75 70 70 72 65 73 73 69  d thus suppressi
1ae80 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e  ng the second on
1ae90 65 29 20 65 76 65 6e 20 69 66 20 74 68 65 79 20  e) even if they 
1aea0 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 20  have different. 
1aeb0 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72     ** sort order
1aec0 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
1aed0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
1aee0 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e  fferent collatin
1aef0 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20 69  g sequences or i
1af00 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
1af10 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73  .    ** the cons
1af20 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e 20  traint occur in 
1af30 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 73  different orders
1af40 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74  , then the const
1af50 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20 2a  raints are.    *
1af60 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73  * considered dis
1af70 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20 72  tinct and both r
1af80 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61 74  esult in separat
1af90 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a  e indices..    *
1afa0 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
1afb0 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
1afc0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
1afd0 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
1afe0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
1aff0 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   k;.      assert
1b000 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  ( IsUniqueIndex(
1b010 70 49 64 78 29 20 29 3b 0a 20 20 20 20 20 20 61  pIdx) );.      a
1b020 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 64 78  ssert( pIdx->idx
1b030 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58  Type!=SQLITE_IDX
1b040 54 59 50 45 5f 41 50 50 44 45 46 20 29 3b 0a 20  TYPE_APPDEF );. 
1b050 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73 55       assert( IsU
1b060 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65  niqueIndex(pInde
1b070 78 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  x) );..      if(
1b080 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d   pIdx->nKeyCol!=
1b090 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20  pIndex->nKeyCol 
1b0a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1b0b0 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64    for(k=0; k<pId
1b0c0 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29  x->nKeyCol; k++)
1b0d0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
1b0e0 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20  char *z1;.      
1b0f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
1b100 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1b110 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
1b120 5b 6b 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  [k]>=0 );.      
1b130 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
1b140 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d  lumn[k]!=pIndex-
1b150 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62  >aiColumn[k] ) b
1b160 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31  reak;.        z1
1b170 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
1b180 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d  k];.        z2 =
1b190 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1b1a0 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k];.        if( 
1b1b0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1b1c0 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a  1, z2) ) break;.
1b1d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1b1e0 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  ( k==pIdx->nKeyC
1b1f0 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ol ){.        if
1b200 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
1b210 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  =pIndex->onError
1b220 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1b230 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   This constraint
1b240 20 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d   creates the sam
1b250 65 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65  e index as a pre
1b260 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20  vious.          
1b270 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70  ** constraint sp
1b280 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72  ecified somewher
1b290 65 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  e in the CREATE 
1b2a0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
1b2b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f  .          ** Ho
1b2c0 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e  wever the ON CON
1b2d0 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72  FLICT clauses ar
1b2e0 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20  e different. If 
1b2f0 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20  both this .     
1b300 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
1b310 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69  nt and the previ
1b320 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63  ous equivalent c
1b330 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65  onstraint have e
1b340 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20  xplicit.        
1b350 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54    ** ON CONFLICT
1b360 20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73   clauses this is
1b370 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72   an error. Other
1b380 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20  wise, use the.  
1b390 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69          ** expli
1b3a0 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20  citly specified 
1b3b0 62 65 68 61 76 69 6f 72 20 66 6f 72 20 74 68 65  behavior for the
1b3c0 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
1b3d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
1b3e0 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72  f( !(pIdx->onErr
1b3f0 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c  or==OE_Default |
1b400 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  | pIndex->onErro
1b410 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29  r==OE_Default) )
1b420 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1b430 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1b440 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
1b450 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74         "conflict
1b460 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  ing ON CONFLICT 
1b470 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65  clauses specifie
1b480 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  d", 0);.        
1b490 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
1b4a0 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
1b4b0 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20  =OE_Default ){. 
1b4c0 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
1b4d0 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65  >onError = pInde
1b4e0 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  x->onError;.    
1b4f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b500 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 64  }.        if( id
1b510 78 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44  xType==SQLITE_ID
1b520 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59  XTYPE_PRIMARYKEY
1b530 20 29 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65   ) pIdx->idxType
1b540 20 3d 20 69 64 78 54 79 70 65 3b 0a 20 20 20 20   = idxType;.    
1b550 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1b560 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1b570 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1b580 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77   /* Link the new
1b590 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
1b5a0 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e   to its table an
1b5b0 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20  d to the other. 
1b5c0 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   ** in-memory da
1b5d0 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
1b5e0 73 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  s. .  */.  asser
1b5f0 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
1b600 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  =0 );.  if( db->
1b610 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
1b620 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 61   Index *p;.    a
1b630 73 73 65 72 74 28 20 21 49 4e 5f 44 45 43 4c 41  ssert( !IN_DECLA
1b640 52 45 5f 56 54 41 42 20 29 3b 0a 20 20 20 20 61  RE_VTAB );.    a
1b650 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
1b660 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
1b670 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  , 0, pIndex->pSc
1b680 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 70 20 3d  hema) );.    p =
1b690 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
1b6a0 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68  rt(&pIndex->pSch
1b6b0 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20  ema->idxHash, . 
1b6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6d0 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d           pIndex-
1b6e0 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 29 3b  >zName, pIndex);
1b6f0 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
1b700 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
1b710 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c  Index );  /* Mal
1b720 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
1b730 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71  iled */.      sq
1b740 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
1b750 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  );.      goto ex
1b760 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1b770 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d  .    }.    db->m
1b780 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41  DbFlags |= DBFLA
1b790 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  G_SchemaChange;.
1b7a0 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
1b7b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  !=0 ){.      pIn
1b7c0 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e  dex->tnum = db->
1b7d0 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20  init.newTnum;.  
1b7e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1b7f0 20 74 68 69 73 20 69 73 20 74 68 65 20 69 6e 69   this is the ini
1b800 74 69 61 6c 20 43 52 45 41 54 45 20 49 4e 44 45  tial CREATE INDE
1b810 58 20 73 74 61 74 65 6d 65 6e 74 20 28 6f 72 20  X statement (or 
1b820 43 52 45 41 54 45 20 54 41 42 4c 45 20 69 66 20  CREATE TABLE if 
1b830 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69  the.  ** index i
1b840 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64  s an implied ind
1b850 65 78 20 66 6f 72 20 61 20 55 4e 49 51 55 45 20  ex for a UNIQUE 
1b860 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
1b870 6f 6e 73 74 72 61 69 6e 74 29 20 74 68 65 6e 0a  onstraint) then.
1b880 20 20 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20 74    ** emit code t
1b890 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  o allocate the i
1b8a0 6e 64 65 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e  ndex rootpage on
1b8b0 20 64 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61   disk and make a
1b8c0 6e 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  n entry for.  **
1b8d0 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 74 68   the index in th
1b8e0 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
1b8f0 74 61 62 6c 65 20 61 6e 64 20 70 6f 70 75 6c 61  table and popula
1b900 74 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 74  te the index wit
1b910 68 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20  h.  ** content. 
1b920 20 42 75 74 2c 20 64 6f 20 6e 6f 74 20 64 6f 20   But, do not do 
1b930 74 68 69 73 20 69 66 20 77 65 20 61 72 65 20 73  this if we are s
1b940 69 6d 70 6c 79 20 72 65 61 64 69 6e 67 20 74 68  imply reading th
1b950 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a  e sqlite_master.
1b960 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 70 61    ** table to pa
1b970 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2c 20  rse the schema, 
1b980 6f 72 20 69 66 20 74 68 69 73 20 69 6e 64 65 78  or if this index
1b990 20 69 73 20 74 68 65 20 50 52 49 4d 41 52 59 20   is the PRIMARY 
1b9a0 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2a 20 6f  KEY index.  ** o
1b9b0 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  f a WITHOUT ROWI
1b9c0 44 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  D table..  **.  
1b9d0 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d  ** If pTblName==
1b9e0 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
1b9f0 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74  index is generat
1ba00 65 64 20 61 73 20 61 6e 20 69 6d 70 6c 69 65 64  ed as an implied
1ba10 20 50 52 49 4d 41 52 59 20 4b 45 59 0a 20 20 2a   PRIMARY KEY.  *
1ba20 2a 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65  * or UNIQUE inde
1ba30 78 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  x in a CREATE TA
1ba40 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
1ba50 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a  Since the table.
1ba60 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65    ** has just be
1ba70 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63  en created, it c
1ba80 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20  ontains no data 
1ba90 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e  and the index in
1baa0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a  itialization.  *
1bab0 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b  * step can be sk
1bac0 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
1bad0 73 65 20 69 66 28 20 48 61 73 52 6f 77 69 64 28  se if( HasRowid(
1bae0 70 54 61 62 29 20 7c 7c 20 70 54 62 6c 4e 61 6d  pTab) || pTblNam
1baf0 65 21 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65  e!=0 ){.    Vdbe
1bb00 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   *v;.    char *z
1bb10 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d  Stmt;.    int iM
1bb20 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
1bb30 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71  Mem;..    v = sq
1bb40 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1bb50 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
1bb60 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
1bb70 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20  reate_index;..  
1bb80 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
1bb90 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
1bba0 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 20  rse, 1, iDb);.. 
1bbb0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
1bbc0 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68   rootpage for th
1bbd0 65 20 69 6e 64 65 78 20 75 73 69 6e 67 20 43 72  e index using Cr
1bbe0 65 61 74 65 49 6e 64 65 78 2e 20 42 75 74 20 62  eateIndex. But b
1bbf0 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 64 6f 69  efore.    ** doi
1bc00 6e 67 20 73 6f 2c 20 63 6f 64 65 20 61 20 4e 6f  ng so, code a No
1bc10 6f 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  op instruction a
1bc20 6e 64 20 73 74 6f 72 65 20 69 74 73 20 61 64 64  nd store its add
1bc30 72 65 73 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20  ress in .    ** 
1bc40 49 6e 64 65 78 2e 74 6e 75 6d 2e 20 54 68 69 73  Index.tnum. This
1bc50 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
1bc60 63 61 73 65 20 74 68 69 73 20 69 6e 64 65 78 20  case this index 
1bc70 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 0a 20  is actually a . 
1bc80 20 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45     ** PRIMARY KE
1bc90 59 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  Y and the table 
1bca0 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 57 49  is actually a WI
1bcb0 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
1bcc0 65 2e 20 49 6e 20 0a 20 20 20 20 2a 2a 20 74 68  e. In .    ** th
1bcd0 61 74 20 63 61 73 65 20 74 68 65 20 63 6f 6e 76  at case the conv
1bce0 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69  ertToWithoutRowi
1bcf0 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65  dTable() routine
1bd00 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20   will replace.  
1bd10 20 20 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69    ** the Noop wi
1bd20 74 68 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d  th a Goto to jum
1bd30 70 20 6f 76 65 72 20 74 68 65 20 56 44 42 45 20  p over the VDBE 
1bd40 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
1bd50 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 70 49 6e  elow. */.    pIn
1bd60 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69  dex->tnum = sqli
1bd70 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
1bd80 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 73   OP_Noop);.    s
1bd90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1bda0 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 42 74 72  (v, OP_CreateBtr
1bdb0 65 65 2c 20 69 44 62 2c 20 69 4d 65 6d 2c 20 42  ee, iDb, iMem, B
1bdc0 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a 0a  TREE_BLOBKEY);..
1bdd0 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68      /* Gather th
1bde0 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
1bdf0 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49 4e  of the CREATE IN
1be00 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  DEX statement in
1be10 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53  to.    ** the zS
1be20 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20  tmt variable.   
1be30 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61   */.    if( pSta
1be40 72 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rt ){.      int 
1be50 6e 20 3d 20 28 69 6e 74 29 28 70 50 61 72 73 65  n = (int)(pParse
1be60 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d  ->sLastToken.z -
1be70 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61   pName->z) + pPa
1be80 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e  rse->sLastToken.
1be90 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61  n;.      if( pNa
1bea0 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20  me->z[n-1]==';' 
1beb0 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a 20  ) n--;.      /* 
1bec0 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69  A named index wi
1bed0 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43  th an explicit C
1bee0 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
1bef0 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a  ement */.      z
1bf00 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
1bf10 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54  rintf(db, "CREAT
1bf20 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c  E%s INDEX %.*s",
1bf30 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72  .        onError
1bf40 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a  ==OE_None ? "" :
1bf50 20 22 20 55 4e 49 51 55 45 22 2c 20 6e 2c 20 70   " UNIQUE", n, p
1bf60 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65  Name->z);.    }e
1bf70 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
1bf80 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
1bf90 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52   created by a PR
1bfa0 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
1bfb0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  QUE constraint *
1bfc0 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74  /.      /* zStmt
1bfd0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
1bfe0 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20  f(""); */.      
1bff0 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  zStmt = 0;.    }
1c000 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20  ..    /* Add an 
1c010 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f  entry in sqlite_
1c020 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20  master for this 
1c030 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20  index.    */.   
1c040 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
1c050 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
1c060 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
1c070 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27  O %Q.%s VALUES('
1c080 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64  index',%Q,%Q,#%d
1c090 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20  ,%Q);",.        
1c0a0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
1c0b0 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  SName, MASTER_NA
1c0c0 4d 45 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64  ME,.        pInd
1c0d0 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ex->zName,.     
1c0e0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a     pTab->zName,.
1c0f0 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20          iMem,.  
1c100 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20        zStmt.    
1c110 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
1c120 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b  Free(db, zStmt);
1c130 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68  ..    /* Fill th
1c140 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61 74  e index with dat
1c150 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74 68  a and reparse th
1c160 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61  e schema. Code a
1c170 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20  n OP_Expire.    
1c180 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ** to invalidate
1c190 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65   all pre-compile
1c1a0 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
1c1b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 62    */.    if( pTb
1c1c0 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73  lName ){.      s
1c1d0 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
1c1e0 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
1c1f0 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73  , iMem);.      s
1c200 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
1c210 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
1c220 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1c230 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61  beAddParseSchema
1c240 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20  Op(v, iDb,.     
1c250 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
1c260 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71  tf(db, "name='%q
1c270 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65  ' AND type='inde
1c280 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  x'", pIndex->zNa
1c290 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  me));.      sqli
1c2a0 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
1c2b0 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20 20 20   OP_Expire);.   
1c2c0 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56   }..    sqlite3V
1c2d0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
1c2e0 49 6e 64 65 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20  Index->tnum);.  
1c2f0 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64  }..  /* When add
1c300 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ing an index to 
1c310 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69  the list of indi
1c320 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c  ces for a table,
1c330 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20   make.  ** sure 
1c340 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65  all indices labe
1c350 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63  led OE_Replace c
1c360 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68  ome after all th
1c370 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a  ose labeled.  **
1c380 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69   OE_Ignore.  Thi
1c390 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66  s is necessary f
1c3a0 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 63  or the correct c
1c3b0 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a  onstraint check.
1c3c0 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
1c3d0 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72  (in sqlite3Gener
1c3e0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65  ateConstraintChe
1c3f0 63 6b 73 28 29 29 20 61 73 20 70 61 72 74 20 6f  cks()) as part o
1c400 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e  f.  ** UPDATE an
1c410 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  d INSERT stateme
1c420 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66  nts.  .  */.  if
1c430 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
1c440 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29  || pTblName==0 )
1c450 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f  {.    if( onErro
1c460 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c  r!=OE_Replace ||
1c470 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30   pTab->pIndex==0
1c480 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61  .         || pTa
1c490 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  b->pIndex->onErr
1c4a0 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b  or==OE_Replace){
1c4b0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
1c4c0 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
1c4d0 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  dex;.      pTab-
1c4e0 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
1c4f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c500 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72     Index *pOther
1c510 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
1c520 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f  .      while( pO
1c530 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70  ther->pNext && p
1c540 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e  Other->pNext->on
1c550 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
1c560 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74  e ){.        pOt
1c570 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  her = pOther->pN
1c580 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
1c590 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
1c5a0 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
1c5b0 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e  ;.      pOther->
1c5c0 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a  pNext = pIndex;.
1c5d0 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
1c5e0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
1c5f0 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20  Clean up before 
1c600 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f  exiting */.exit_
1c610 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20  create_index:.  
1c620 69 66 28 20 70 49 6e 64 65 78 20 29 20 66 72 65  if( pIndex ) fre
1c630 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  eIndex(db, pInde
1c640 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  x);.  sqlite3Exp
1c650 72 44 65 6c 65 74 65 28 64 62 2c 20 70 50 49 57  rDelete(db, pPIW
1c660 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  here);.  sqlite3
1c670 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
1c680 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c  b, pList);.  sql
1c690 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
1c6a0 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b  e(db, pTblName);
1c6b0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1c6c0 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, zName);.}..
1c6d0 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49  /*.** Fill the I
1c6e0 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20  ndex.aiRowEst[] 
1c6f0 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61 75  array with defau
1c700 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  lt information -
1c710 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
1c720 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20  to be used when 
1c730 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20  we have not run 
1c740 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d  the ANALYZE comm
1c750 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77  and..**.** aiRow
1c760 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73  Est[0] is suppos
1c770 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ed to contain th
1c780 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
1c790 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ents in the inde
1c7a0 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64  x..** Since we d
1c7b0 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73  o not know, gues
1c7c0 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69  s 1 million.  ai
1c7d0 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20  RowEst[1] is an 
1c7e0 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a  estimate of the.
1c7f0 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
1c800 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74  s in the table t
1c810 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61  hat match any pa
1c820 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f  rticular value o
1c830 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63  f the.** first c
1c840 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
1c850 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d  ex.  aiRowEst[2]
1c860 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
1c870 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  of the number.**
1c880 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61   of rows that ma
1c890 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c  tch any particul
1c8a0 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ar combination o
1c8b0 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63 6f  f the first 2 co
1c8c0 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20  lumns.** of the 
1c8d0 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66  index.  And so f
1c8e0 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61  orth.  It must a
1c8f0 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61 73  lways be the cas
1c900 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20  e that.*.**     
1c910 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e        aiRowEst[N
1c920 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d  ]<=aiRowEst[N-1]
1c930 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69  .**           ai
1c940 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a  RowEst[N]>=1.**.
1c950 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68  ** Apart from th
1c960 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74  at, we have litt
1c970 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69  le to go on besi
1c980 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73  des intuition as
1c990 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77   to.** how aiRow
1c9a0 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  Est[] should be 
1c9b0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68  initialized.  Th
1c9c0 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61  e numbers genera
1c9d0 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20  ted here.** are 
1c9e0 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c  based on typical
1c9f0 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e   values found in
1ca00 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e   actual indices.
1ca10 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ca20 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e  DefaultRowEst(In
1ca30 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a  dex *pIdx){.  /*
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca50 31 30 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c 20  10,  9,  8,  7, 
1ca60 20 36 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61   6 */.  LogEst a
1ca70 56 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32  Val[] = { 33, 32
1ca80 2c 20 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a  , 30, 28, 26 };.
1ca90 20 20 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70 49    LogEst *a = pI
1caa0 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b  dx->aiRowLogEst;
1cab0 0a 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d  .  int nCopy = M
1cac0 49 4e 28 41 72 72 61 79 53 69 7a 65 28 61 56 61  IN(ArraySize(aVa
1cad0 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  l), pIdx->nKeyCo
1cae0 6c 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  l);.  int i;..  
1caf0 2f 2a 20 49 6e 64 65 78 65 73 20 77 69 74 68 20  /* Indexes with 
1cb00 64 65 66 61 75 6c 74 20 72 6f 77 20 65 73 74 69  default row esti
1cb10 6d 61 74 65 73 20 73 68 6f 75 6c 64 20 6e 6f 74  mates should not
1cb20 20 68 61 76 65 20 73 74 61 74 31 20 64 61 74 61   have stat1 data
1cb30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
1cb40 49 64 78 2d 3e 68 61 73 53 74 61 74 31 20 29 3b  Idx->hasStat1 );
1cb50 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66  ..  /* Set the f
1cb60 69 72 73 74 20 65 6e 74 72 79 20 28 6e 75 6d 62  irst entry (numb
1cb70 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
1cb80 65 20 69 6e 64 65 78 29 20 74 6f 20 74 68 65 20  e index) to the 
1cb90 65 73 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20  estimated .  ** 
1cba0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
1cbb0 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 6f 72 20  n the table, or 
1cbc0 68 61 6c 66 20 74 68 65 20 6e 75 6d 62 65 72 20  half the number 
1cbd0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
1cbe0 61 62 6c 65 0a 20 20 2a 2a 20 66 6f 72 20 61 20  able.  ** for a 
1cbf0 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 20 20  partial index.  
1cc00 20 42 75 74 20 64 6f 20 6e 6f 74 20 6c 65 74 20   But do not let 
1cc10 74 68 65 20 65 73 74 69 6d 61 74 65 20 64 72 6f  the estimate dro
1cc20 70 20 62 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a 20  p below 10. */. 
1cc30 20 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54   a[0] = pIdx->pT
1cc40 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  able->nRowLogEst
1cc50 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50  ;.  if( pIdx->pP
1cc60 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 29  artIdxWhere!=0 )
1cc70 20 61 5b 30 5d 20 2d 3d 20 31 30 3b 20 20 61 73   a[0] -= 10;  as
1cc80 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65  sert( 10==sqlite
1cc90 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20  3LogEst(2) );.  
1cca0 69 66 28 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b  if( a[0]<33 ) a[
1ccb0 30 5d 20 3d 20 33 33 3b 20 20 20 20 20 20 20 20  0] = 33;        
1ccc0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1ccd0 28 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 33==sqlite3Log
1cce0 45 73 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a  Est(10) );..  /*
1ccf0 20 45 73 74 69 6d 61 74 65 20 74 68 61 74 20 61   Estimate that a
1cd00 5b 31 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d 20  [1] is 10, a[2] 
1cd10 69 73 20 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c  is 9, a[3] is 8,
1cd20 20 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d   a[4] is 7, a[5]
1cd30 20 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65   is.  ** 6 and e
1cd40 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 76  ach subsequent v
1cd50 61 6c 75 65 20 28 69 66 20 61 6e 79 29 20 69 73  alue (if any) is
1cd60 20 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79   5.  */.  memcpy
1cd70 28 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43  (&a[1], aVal, nC
1cd80 6f 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73  opy*sizeof(LogEs
1cd90 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f  t));.  for(i=nCo
1cda0 70 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e  py+1; i<=pIdx->n
1cdb0 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  KeyCol; i++){.  
1cdc0 20 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20    a[i] = 23;    
1cdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cde0 61 73 73 65 72 74 28 20 32 33 3d 3d 73 71 6c 69  assert( 23==sqli
1cdf0 74 65 33 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a  te3LogEst(5) );.
1ce00 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30    }..  assert( 0
1ce10 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
1ce20 31 29 20 29 3b 0a 20 20 69 66 28 20 49 73 55 6e  1) );.  if( IsUn
1ce30 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20  iqueIndex(pIdx) 
1ce40 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ) a[pIdx->nKeyCo
1ce50 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  l] = 0;.}../*.**
1ce60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
1ce70 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74  ll drop an exist
1ce80 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e  ing named index.
1ce90 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
1cea0 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  * implements the
1ceb0 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74   DROP INDEX stat
1cec0 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
1ced0 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28  qlite3DropIndex(
1cee0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1cef0 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69  rcList *pName, i
1cf00 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20  nt ifExists){.  
1cf10 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
1cf20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
1cf30 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1cf40 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
1cf50 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1cf60 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20  se->nErr==0 );  
1cf70 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64   /* Never called
1cf80 20 77 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f   with prior erro
1cf90 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  rs */.  if( db->
1cfa0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1cfb0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1cfc0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
1cfd0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e  assert( pName->n
1cfe0 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  Src==1 );.  if( 
1cff0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
1d000 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
1d010 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  rse) ){.    goto
1d020 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1d030 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
1d040 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
1d050 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  x(db, pName->a[0
1d060 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
1d070 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
1d080 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
1d090 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45   ){.    if( !ifE
1d0a0 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73  xists ){.      s
1d0b0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1d0c0 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
1d0d0 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d  index: %S", pNam
1d0e0 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e, 0);.    }else
1d0f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
1d100 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
1d110 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61  hema(pParse, pNa
1d120 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
1d130 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  se);.    }.    p
1d140 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
1d150 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  ma = 1;.    goto
1d160 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1d170 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64  ;.  }.  if( pInd
1d180 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c  ex->idxType!=SQL
1d190 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44  ITE_IDXTYPE_APPD
1d1a0 45 46 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  EF ){.    sqlite
1d1b0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1d1c0 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61  , "index associa
1d1d0 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20  ted with UNIQUE 
1d1e0 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d  ".      "or PRIM
1d1f0 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
1d200 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f  nt cannot be dro
1d210 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67  pped", 0);.    g
1d220 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1d230 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  dex;.  }.  iDb =
1d240 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
1d250 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
1d260 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e  ->pSchema);.#ifn
1d270 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d280 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
1d290 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d  {.    int code =
1d2a0 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44   SQLITE_DROP_IND
1d2b0 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  EX;.    Table *p
1d2c0 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
1d2d0 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  able;.    const 
1d2e0 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
1d2f0 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
1d300 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
1d310 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
1d320 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
1d330 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1d340 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1d350 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
1d360 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  b, 0, zDb) ){.  
1d370 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1d380 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
1d390 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
1d3a0 4d 50 44 42 20 26 26 20 69 44 62 20 29 20 63 6f  MPDB && iDb ) co
1d3b0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
1d3c0 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
1d3d0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1d3e0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
1d3f0 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  de, pIndex->zNam
1d400 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
1d410 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
1d420 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1d430 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
1d440 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
1d450 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
1d460 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  ve the index and
1d470 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
1d480 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20   table */.  v = 
1d490 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1d4a0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
1d4b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
1d4c0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
1d4d0 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
1d4e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  );.    sqlite3Ne
1d4f0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
1d500 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  ,.       "DELETE
1d510 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
1d520 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79  E name=%Q AND ty
1d530 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20 20  pe='index'",.   
1d540 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
1d550 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45  .zDbSName, MASTE
1d560 52 5f 4e 41 4d 45 2c 20 70 49 6e 64 65 78 2d 3e  R_NAME, pIndex->
1d570 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20  zName.    );.   
1d580 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61   sqlite3ClearSta
1d590 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20  tTables(pParse, 
1d5a0 69 44 62 2c 20 22 69 64 78 22 2c 20 70 49 6e 64  iDb, "idx", pInd
1d5b0 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ex->zName);.    
1d5c0 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
1d5d0 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
1d5e0 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  ;.    destroyRoo
1d5f0 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
1d600 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  ndex->tnum, iDb)
1d610 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1d620 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72  eAddOp4(v, OP_Dr
1d630 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c  opIndex, iDb, 0,
1d640 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d   0, pIndex->zNam
1d650 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74  e, 0);.  }..exit
1d660 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73  _drop_index:.  s
1d670 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
1d680 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ete(db, pName);.
1d690 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20  }../*.** pArray 
1d6a0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1d6b0 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65  an array of obje
1d6c0 63 74 73 2e 20 45 61 63 68 20 6f 62 6a 65 63 74  cts. Each object
1d6d0 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79   in the.** array
1d6e0 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65   is szEntry byte
1d6f0 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 69 73 20  s in size. This 
1d700 72 6f 75 74 69 6e 65 20 75 73 65 73 20 73 71 6c  routine uses sql
1d710 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a  ite3DbRealloc().
1d720 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65  ** to extend the
1d730 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20 74   array so that t
1d740 68 65 72 65 20 69 73 20 73 70 61 63 65 20 66 6f  here is space fo
1d750 72 20 61 20 6e 65 77 20 6f 62 6a 65 63 74 20 61  r a new object a
1d760 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a  t the end..**.**
1d770 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
1d780 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a  ion is called, *
1d790 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73  pnEntry contains
1d7a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
1d7b0 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72 72 61  e of.** the arra
1d7c0 79 20 28 69 6e 20 65 6e 74 72 69 65 73 20 2d 20  y (in entries - 
1d7d0 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  so the allocatio
1d7e0 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74 72 79 29  n is ((*pnEntry)
1d7f0 20 2a 20 73 7a 45 6e 74 72 79 29 20 62 79 74 65   * szEntry) byte
1d800 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a  s.** in total)..
1d810 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 61  **.** If the rea
1d820 6c 6c 6f 63 28 29 20 69 73 20 73 75 63 63 65 73  lloc() is succes
1d830 73 66 75 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f  sful (i.e. if no
1d840 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f   OOM condition o
1d850 63 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73  ccurs), the.** s
1d860 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
1d870 6f 72 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  or the new objec
1d880 74 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e  t is zeroed, *pn
1d890 45 6e 74 72 79 20 75 70 64 61 74 65 64 20 74 6f  Entry updated to
1d8a0 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 65 20  .** reflect the 
1d8b0 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20  new size of the 
1d8c0 61 72 72 61 79 20 61 6e 64 20 61 20 70 6f 69 6e  array and a poin
1d8d0 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 61  ter to the new a
1d8e0 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74  llocation.** ret
1d8f0 75 72 6e 65 64 2e 20 2a 70 49 64 78 20 69 73 20  urned. *pIdx is 
1d900 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
1d910 20 6f 66 20 74 68 65 20 6e 65 77 20 61 72 72 61   of the new arra
1d920 79 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20  y entry in this 
1d930 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  case..**.** Othe
1d940 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 72 65  rwise, if the re
1d950 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a  alloc() fails, *
1d960 70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 2d  pIdx is set to -
1d970 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61  1, *pnEntry rema
1d980 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  ins.** unchanged
1d990 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 70   and a copy of p
1d9a0 41 72 72 61 79 20 72 65 74 75 72 6e 65 64 2e 0a  Array returned..
1d9b0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
1d9c0 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
1d9d0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1d9e0 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1d9f0 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61   to notify of ma
1da00 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f  lloc failures */
1da10 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c  .  void *pArray,
1da20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
1da30 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74   objects.  Might
1da40 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20   be reallocated 
1da50 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79  */.  int szEntry
1da60 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  ,      /* Size o
1da70 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e  f each object in
1da80 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20   the array */.  
1da90 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20  int *pnEntry,   
1daa0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
1dab0 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79  bjects currently
1dac0 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74   in use */.  int
1dad0 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f   *pIdx         /
1dae0 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65  * Write the inde
1daf0 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20  x of a new slot 
1db00 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  here */.){.  cha
1db10 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  r *z;.  int n = 
1db20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28 20  *pnEntry;.  if( 
1db30 28 6e 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29  (n & (n-1))==0 )
1db40 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 28  {.    int sz = (
1db50 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b  n==0) ? 1 : 2*n;
1db60 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20  .    void *pNew 
1db70 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
1db80 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20 73  oc(db, pArray, s
1db90 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20  z*szEntry);.    
1dba0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
1dbb0 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b       *pIdx = -1;
1dbc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41  .      return pA
1dbd0 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rray;.    }.    
1dbe0 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20  pArray = pNew;. 
1dbf0 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29   }.  z = (char*)
1dc00 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74  pArray;.  memset
1dc10 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d  (&z[n * szEntry]
1dc20 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20  , 0, szEntry);. 
1dc30 20 2a 70 49 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b   *pIdx = n;.  ++
1dc40 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75  *pnEntry;.  retu
1dc50 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a  rn pArray;.}../*
1dc60 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
1dc70 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
1dc80 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43  given IdList.  C
1dc90 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69  reate a new IdLi
1dca0 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
1dcb0 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64  ..**.** A new Id
1dcc0 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
1dcd0 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
1dce0 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
1dcf0 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
1dd00 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69  dListAppend(sqli
1dd10 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
1dd20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
1dd30 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  Token){.  int i;
1dd40 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1dd50 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
1dd60 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1dd70 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64  ro(db, sizeof(Id
1dd80 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
1dd90 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1dda0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
1ddb0 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72  t->a = sqlite3Ar
1ddc0 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
1ddd0 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69     db,.      pLi
1dde0 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a  st->a,.      siz
1ddf0 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
1de00 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e  ,.      &pList->
1de10 6e 49 64 2c 0a 20 20 20 20 20 20 26 69 0a 20 20  nId,.      &i.  
1de20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  );.  if( i<0 ){.
1de30 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
1de40 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
1de50 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
1de60 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61  ;.  }.  pList->a
1de70 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
1de80 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1de90 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  (db, pToken);.  
1dea0 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
1deb0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
1dec0 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64   IdList..*/.void
1ded0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1dee0 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
1def0 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29  , IdList *pList)
1df00 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1df10 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1df20 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
1df30 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
1df40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
1df50 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
1df60 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  a[i].zName);.  }
1df70 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1df80 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a  (db, pList->a);.
1df90 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
1dfa0 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  N(db, pList);.}.
1dfb0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1dfc0 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  e index in pList
1dfd0 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69   of the identifi
1dfe0 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52  er named zId.  R
1dff0 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e  eturn -1.** if n
1e000 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  ot found..*/.int
1e010 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
1e020 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  dex(IdList *pLis
1e030 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
1e040 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
1e050 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1e060 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f   return -1;.  fo
1e070 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1e080 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nId; i++){.    i
1e090 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1e0a0 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
1e0b0 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
1e0c0 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
1e0d0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
1e0e0 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20  *.** Expand the 
1e0f0 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
1e100 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 72  for the given Sr
1e110 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a  cList object by.
1e120 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74  ** creating nExt
1e130 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67  ra new slots beg
1e140 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74  inning at iStart
1e150 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65 72  .  iStart is zer
1e160 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20  o based..** New 
1e170 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64  slots are zeroed
1e180 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1e190 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53  ple, suppose a S
1e1a0 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79  rcList initially
1e1b0 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e   contains two en
1e1c0 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54  tries: A,B..** T
1e1d0 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65  o append 3 new e
1e1e0 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20  ntries onto the 
1e1f0 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a  end, do this:.**
1e200 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72  .**    sqlite3Sr
1e210 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
1e220 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29   pSrclist, 3, 2)
1e230 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ;.**.** After th
1e240 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20  e call above it 
1e250 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20  would contain:  
1e260 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20  A, B, nil, nil, 
1e270 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69  nil..** If the i
1e280 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68  Start argument h
1e290 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61  ad been 1 instea
1e2a0 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65  d of 2, then the
1e2b0 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64   result.** would
1e2c0 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20   have been:  A, 
1e2d0 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42  nil, nil, nil, B
1e2e0 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68  .  To prepend th
1e2f0 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20  e new slots,.** 
1e300 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75 65  the iStart value
1e310 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68   would be 0.  Th
1e320 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f  e result then wo
1e330 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20  uld.** be: nil, 
1e340 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a  nil, nil, A, B..
1e350 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
1e360 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
1e370 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69  ls the SrcList i
1e380 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68  s unchanged.  Th
1e390 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  e.** db->mallocF
1e3a0 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20  ailed flag will 
1e3b0 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a  be set to true..
1e3c0 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
1e3d0 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1e3e0 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
1e3f0 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ,       /* Datab
1e400 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
1e410 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20  o notify of OOM 
1e420 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c  errors */.  SrcL
1e430 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  ist *pSrc,     /
1e440 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f  * The SrcList to
1e450 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a   be enlarged */.
1e460 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
1e470 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e480 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61  f new slots to a
1e490 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20  dd to pSrc->a[] 
1e4a0 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20  */.  int iStart 
1e4b0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1e4c0 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   in pSrc->a[] of
1e4d0 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20   first new slot 
1e4e0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  */.){.  int i;..
1e4f0 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
1e500 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20  king on calling 
1e510 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
1e520 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d  assert( iStart>=
1e530 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
1e540 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73  Extra>=1 );.  as
1e550 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b  sert( pSrc!=0 );
1e560 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
1e570 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  t<=pSrc->nSrc );
1e580 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1e590 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65  additional space
1e5a0 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
1e5b0 69 66 28 20 28 75 33 32 29 70 53 72 63 2d 3e 6e  if( (u32)pSrc->n
1e5c0 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d  Src+nExtra>pSrc-
1e5d0 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53  >nAlloc ){.    S
1e5e0 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
1e5f0 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70    int nAlloc = p
1e600 53 72 63 2d 3e 6e 53 72 63 2a 32 2b 6e 45 78 74  Src->nSrc*2+nExt
1e610 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74  ra;.    int nGot
1e620 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
1e630 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
1e640 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20  , pSrc,.        
1e650 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
1e660 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31  Src) + (nAlloc-1
1e670 29 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61  )*sizeof(pSrc->a
1e680 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
1e690 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
1e6a0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
1e6b0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1e6c0 20 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a     return pSrc;.
1e6d0 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d      }.    pSrc =
1e6e0 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20   pNew;.    nGot 
1e6f0 3d 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  = (sqlite3DbMall
1e700 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29  ocSize(db, pNew)
1e710 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29   - sizeof(*pSrc)
1e720 29 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61  )/sizeof(pSrc->a
1e730 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63  [0])+1;.    pSrc
1e740 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74 3b  ->nAlloc = nGot;
1e750 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  .  }..  /* Move 
1e760 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74  existing slots t
1e770 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74  hat come after t
1e780 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65  he newly inserte
1e790 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74  d slots.  ** out
1e7a0 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20   of the way */. 
1e7b0 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
1e7c0 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20  c-1; i>=iStart; 
1e7d0 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e  i--){.    pSrc->
1e7e0 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53  a[i+nExtra] = pS
1e7f0 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  rc->a[i];.  }.  
1e800 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45  pSrc->nSrc += nE
1e810 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f  xtra;..  /* Zero
1e820 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63   the newly alloc
1e830 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20  ated slots */.  
1e840 6d 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b  memset(&pSrc->a[
1e850 69 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65  iStart], 0, size
1e860 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e  of(pSrc->a[0])*n
1e870 45 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d  Extra);.  for(i=
1e880 69 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74  iStart; i<iStart
1e890 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20  +nExtra; i++){. 
1e8a0 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43     pSrc->a[i].iC
1e8b0 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a  ursor = -1;.  }.
1e8c0 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  .  /* Return a p
1e8d0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e  ointer to the en
1e8e0 6c 61 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a  larged SrcList *
1e8f0 2f 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b  /.  return pSrc;
1e900 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  .}.../*.** Appen
1e910 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  d a new table na
1e920 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  me to the given 
1e930 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65  SrcList.  Create
1e940 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
1e950 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41  f.** need be.  A
1e960 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72   new entry is cr
1e970 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63  eated in the Src
1e980 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 61  List even if pTa
1e990 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  ble is NULL..**.
1e9a0 2a 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73 20  ** A SrcList is 
1e9b0 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
1e9c0 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  L if there is an
1e9d0 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68 65   OOM error.  The
1e9e0 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63   returned.** Src
1e9f0 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 74 68  List might be th
1ea00 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 53 72  e same as the Sr
1ea10 63 4c 69 73 74 20 74 68 61 74 20 77 61 73 20 69  cList that was i
1ea20 6e 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74  nput or it might
1ea30 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65   be.** a new one
1ea40 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  .  If an OOM err
1ea50 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20  or does occurs, 
1ea60 74 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76  then the prior v
1ea70 61 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a  alue of pList.**
1ea80 20 74 68 61 74 20 69 73 20 69 6e 70 75 74 20 74   that is input t
1ea90 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
1eaa0 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
1eab0 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  freed..**.** If 
1eac0 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74  pDatabase is not
1ead0 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20   null, it means 
1eae0 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68  that the table h
1eaf0 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a  as an optional.*
1eb00 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * database name 
1eb10 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68  prefix.  Like th
1eb20 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74  is:  "database.t
1eb30 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74  able".  The pDat
1eb40 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20  abase.** points 
1eb50 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  to the table nam
1eb60 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65  e and the pTable
1eb70 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64   points to the d
1eb80 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a  atabase name..**
1eb90 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d   The SrcList.a[]
1eba0 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20  .zName field is 
1ebb0 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
1ebc0 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68  table name which
1ebd0 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66   might.** come f
1ebe0 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70  rom pTable (if p
1ebf0 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c  Database is NULL
1ec00 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62  ) or from pDatab
1ec10 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73  ase.  .** SrcLis
1ec20 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20  t.a[].zDatabase 
1ec30 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
1ec40 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
1ec50 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a   from pTable,.**
1ec60 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66   or with NULL if
1ec70 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20   no database is 
1ec80 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
1ec90 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1eca0 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68   if call like th
1ecb0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
1ecc0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1ecd0 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b  Append(D,A,B,0);
1ece0 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73  .**.** Then B is
1ecf0 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   a table name an
1ed00 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  d the database n
1ed10 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69  ame is unspecifi
1ed20 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a  ed.  If called.*
1ed30 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  * like this:.**.
1ed40 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
1ed50 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1ed60 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,B,C);.**.** 
1ed70 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61  Then C is the ta
1ed80 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69  ble name and B i
1ed90 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  s the database n
1eda0 61 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64 65  ame.  If C is de
1edb0 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f  fined.** then so
1edc0 20 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72   is B.  In other
1edd0 20 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72   words, we never
1ede0 20 68 61 76 65 20 61 20 63 61 73 65 20 77 68 65   have a case whe
1edf0 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
1ee00 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1ee10 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b  Append(D,A,0,C);
1ee20 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62  .**.** Both pTab
1ee30 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65  le and pDatabase
1ee40 20 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20   are assumed to 
1ee50 62 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79  be quoted.  They
1ee60 20 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a   are dequoted.**
1ee70 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64   before being ad
1ee80 64 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69  ded to the SrcLi
1ee90 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  st..*/.SrcList *
1eea0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1eeb0 70 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20  pend(.  sqlite3 
1eec0 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  *db,        /* C
1eed0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74  onnection to not
1eee0 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61  ify of malloc fa
1eef0 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c  ilures */.  SrcL
1ef00 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
1ef10 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69  /* Append to thi
1ef20 73 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20  s SrcList. NULL 
1ef30 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 53 72  creates a new Sr
1ef40 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  cList */.  Token
1ef50 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f   *pTable,      /
1ef60 2a 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e  * Table to appen
1ef70 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44  d */.  Token *pD
1ef80 61 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61  atabase    /* Da
1ef90 74 61 62 61 73 65 20 6f 66 20 74 68 65 20 74 61  tabase of the ta
1efa0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ble */.){.  stru
1efb0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1efc0 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74  *pItem;.  assert
1efd0 28 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20 7c  ( pDatabase==0 |
1efe0 7c 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20 20  | pTable!=0 );  
1eff0 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 43  /* Cannot have C
1f000 20 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20   without B */.  
1f010 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
1f020 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1f030 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
1f040 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
1f050 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 53  wNN(db, sizeof(S
1f060 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  rcList) );.    i
1f070 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1f080 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
1f090 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20  t->nAlloc = 1;. 
1f0a0 20 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 3d     pList->nSrc =
1f0b0 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   1;.    memset(&
1f0c0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2c 20 30 2c 20  pList->a[0], 0, 
1f0d0 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
1f0e0 30 5d 29 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d  0]));.    pList-
1f0f0 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20  >a[0].iCursor = 
1f100 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
1f110 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1f120 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
1f130 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69  b, pList, 1, pLi
1f140 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 7d 0a 20  st->nSrc);.  }. 
1f150 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1f160 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
1f170 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
1f180 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
1f190 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1f1a0 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
1f1b0 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d  ->a[pList->nSrc-
1f1c0 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62  1];.  if( pDatab
1f1d0 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65  ase && pDatabase
1f1e0 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  ->z==0 ){.    pD
1f1f0 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
1f200 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
1f210 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   ){.    pItem->z
1f220 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1f230 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1f240 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  pDatabase);.    
1f250 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
1f260 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1f270 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62  omToken(db, pTab
1f280 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  le);.  }else{.  
1f290 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
1f2a0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1f2b0 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65  Token(db, pTable
1f2c0 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44  );.    pItem->zD
1f2d0 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
1f2e0 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
1f2f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
1f300 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65   VdbeCursor inde
1f310 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c  x numbers to all
1f320 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63   tables in a Src
1f330 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  List.*/.void sql
1f340 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
1f350 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a  nCursors(Parse *
1f360 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
1f370 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1f380 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1f390 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1f3a0 20 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c    assert(pList |
1f3b0 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
1f3c0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1f3d0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
1f3e0 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
1f3f0 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73  pList->a; i<pLis
1f400 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
1f410 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  tem++){.      if
1f420 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ( pItem->iCursor
1f430 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  >=0 ) break;.   
1f440 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f     pItem->iCurso
1f450 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
1f460 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ++;.      if( pI
1f470 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
1f480 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1f490 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
1f4a0 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65  ors(pParse, pIte
1f4b0 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  m->pSelect->pSrc
1f4c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1f4d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
1f4e0 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53  lete an entire S
1f4f0 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67  rcList including
1f500 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75   all its substru
1f510 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cture..*/.void s
1f520 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
1f530 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
1f540 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
1f550 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
1f560 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1f570 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
1f580 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1f590 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
1f5a0 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
1f5b0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1f5c0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
1f5d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1f5e0 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
1f5f0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
1f600 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
1f610 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
1f620 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1f630 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
1f640 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
1f650 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 73  .isIndexedBy ) s
1f660 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1f670 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65   pItem->u1.zInde
1f680 78 65 64 42 79 29 3b 0a 20 20 20 20 69 66 28 20  xedBy);.    if( 
1f690 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pItem->fg.isTabF
1f6a0 75 6e 63 20 29 20 73 71 6c 69 74 65 33 45 78 70  unc ) sqlite3Exp
1f6b0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
1f6c0 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  pItem->u1.pFuncA
1f6d0 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
1f6e0 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
1f6f0 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  pItem->pTab);.  
1f700 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1f710 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
1f720 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  >pSelect);.    s
1f730 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1f740 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29  (db, pItem->pOn)
1f750 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  ;.    sqlite3IdL
1f760 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  istDelete(db, pI
1f770 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
1f780 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
1f790 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  eNN(db, pList);.
1f7a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1f7b0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1f7c0 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f  by the parser to
1f7d0 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20   add a new term 
1f7e0 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
1f7f0 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20   a growing FROM 
1f800 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70 22  clause.  The "p"
1f810 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
1f820 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  e part of.** the
1f830 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61   FROM clause tha
1f840 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
1f850 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20  en constructed. 
1f860 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20   "p" is NULL.** 
1f870 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
1f880 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65  irst term of the
1f890 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70   FROM clause.  p
1f8a0 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62  Table and pDatab
1f8b0 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e  ase.** are the n
1f8c0 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
1f8d0 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61   and database na
1f8e0 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
1f8f0 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20  clause term..** 
1f900 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
1f910 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  L if the databas
1f920 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72  e name qualifier
1f930 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68   is missing - th
1f940 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e  e.** usual case.
1f950 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 68 61    If the term ha
1f960 73 20 61 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e  s an alias, then
1f970 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74   pAlias points t
1f980 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74  o the.** alias t
1f990 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65  oken.  If the te
1f9a0 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79  rm is a subquery
1f9b0 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79  , then pSubquery
1f9c0 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43   is the.** SELEC
1f9d0 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
1f9e0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e   the subquery en
1f9f0 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62  codes.  The pTab
1fa00 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62  le and.** pDatab
1fa10 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61  ase parameters a
1fa20 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71  re NULL for subq
1fa30 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e  ueries.  The pOn
1fa40 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70   and pUsing.** p
1fa50 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68  arameters are th
1fa60 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
1fa70 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1fa80 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  auses..**.** Ret
1fa90 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73  urn a new SrcLis
1faa0 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20  t which encodes 
1fab0 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68  is the FROM with
1fac0 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d   the new.** term
1fad0 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69   added..*/.SrcLi
1fae0 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
1faf0 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
1fb00 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1fb10 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
1fb20 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1fb30 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  /.  SrcList *p, 
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1fb50 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20  he left part of 
1fb60 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1fb70 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a  already seen */.
1fb80 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
1fb90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1fba0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
1fbb0 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f  o add to the FRO
1fbc0 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f  M clause */.  To
1fbd0 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20  ken *pDatabase, 
1fbe0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1fbf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
1fc00 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20  ntaining pTable 
1fc10 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69  */.  Token *pAli
1fc20 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  as,          /* 
1fc30 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
1fc40 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75  ide of the AS su
1fc50 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  bexpression */. 
1fc60 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65   Select *pSubque
1fc70 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75  ry,      /* A su
1fc80 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70  bquery used in p
1fc90 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20  lace of a table 
1fca0 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  name */.  Expr *
1fcb0 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pOn,            
1fcc0 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75    /* The ON clau
1fcd0 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a  se of a join */.
1fce0 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67    IdList *pUsing
1fcf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1fd00 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
1fd10 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20   a join */.){.  
1fd20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1fd30 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
1fd40 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1fd50 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70  se->db;.  if( !p
1fd60 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69   && (pOn || pUsi
1fd70 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ng) ){.    sqlit
1fd80 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1fd90 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73  e, "a JOIN claus
1fda0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  e is required be
1fdb0 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20  fore %s", .     
1fdc0 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22   (pOn ? "ON" : "
1fdd0 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20  USING").    );. 
1fde0 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66     goto append_f
1fdf0 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  rom_error;.  }. 
1fe00 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c   p = sqlite3SrcL
1fe10 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c  istAppend(db, p,
1fe20 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61   pTable, pDataba
1fe30 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  se);.  if( p==0 
1fe40 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65  ){.    goto appe
1fe50 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20  nd_from_error;. 
1fe60 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
1fe70 6e 53 72 63 3e 30 20 29 3b 0a 20 20 70 49 74 65  nSrc>0 );.  pIte
1fe80 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72  m = &p->a[p->nSr
1fe90 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  c-1];.  assert( 
1fea0 70 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69  pAlias!=0 );.  i
1feb0 66 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a  f( pAlias->n ){.
1fec0 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61      pItem->zAlia
1fed0 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  s = sqlite3NameF
1fee0 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c  romToken(db, pAl
1fef0 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  ias);.  }.  pIte
1ff00 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75  m->pSelect = pSu
1ff10 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d  bquery;.  pItem-
1ff20 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49  >pOn = pOn;.  pI
1ff30 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55  tem->pUsing = pU
1ff40 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70  sing;.  return p
1ff50 3b 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f  ;.. append_from_
1ff60 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28  error:.  assert(
1ff70 20 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   p==0 );.  sqlit
1ff80 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1ff90 20 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33   pOn);.  sqlite3
1ffa0 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
1ffb0 20 70 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69   pUsing);.  sqli
1ffc0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
1ffd0 64 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a  db, pSubquery);.
1ffe0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1fff0 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45  *.** Add an INDE
20000 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e  XED BY or NOT IN
20010 44 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20  DEXED clause to 
20020 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
20030 79 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d  y added .** elem
20040 65 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63  ent of the sourc
20050 65 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  e-list passed as
20060 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
20070 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
20080 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65  lite3SrcListInde
20090 78 65 64 42 79 28 50 61 72 73 65 20 2a 70 50 61  xedBy(Parse *pPa
200a0 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c  rse, SrcList *p,
200b0 20 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64   Token *pIndexed
200c0 42 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  By){.  assert( p
200d0 49 6e 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a  IndexedBy!=0 );.
200e0 20 20 69 66 28 20 70 20 26 26 20 70 49 6e 64 65    if( p && pInde
200f0 78 65 64 42 79 2d 3e 6e 3e 30 20 29 7b 0a 20 20  xedBy->n>0 ){.  
20100 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
20110 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
20120 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 72    assert( p->nSr
20130 63 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  c>0 );.    pItem
20140 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63   = &p->a[p->nSrc
20150 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
20160 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e   pItem->fg.notIn
20170 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  dexed==0 );.    
20180 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66  assert( pItem->f
20190 67 2e 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30  g.isIndexedBy==0
201a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
201b0 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pItem->fg.isTabF
201c0 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  unc==0 );.    if
201d0 28 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d  ( pIndexedBy->n=
201e0 3d 31 20 26 26 20 21 70 49 6e 64 65 78 65 64 42  =1 && !pIndexedB
201f0 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a  y->z ){.      /*
20200 20 41 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22   A "NOT INDEXED"
20210 20 63 6c 61 75 73 65 20 77 61 73 20 73 75 70 70   clause was supp
20220 6c 69 65 64 2e 20 53 65 65 20 70 61 72 73 65 2e  lied. See parse.
20230 79 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  y .      ** cons
20240 74 72 75 63 74 20 22 69 6e 64 65 78 65 64 5f 6f  truct "indexed_o
20250 70 74 22 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  pt" for details.
20260 20 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   */.      pItem-
20270 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 3d  >fg.notIndexed =
20280 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
20290 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 7a       pItem->u1.z
202a0 49 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69  IndexedBy = sqli
202b0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
202c0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e  (pParse->db, pIn
202d0 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 20 20  dexedBy);.      
202e0 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  pItem->fg.isInde
202f0 78 65 64 42 79 20 3d 20 31 3b 0a 20 20 20 20 7d  xedBy = 1;.    }
20300 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
20310 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 75  d the list of fu
20320 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
20330 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74 20   to the SrcList 
20340 65 6e 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20 74  entry for a.** t
20350 61 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63  able-valued-func
20360 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
20370 6c 69 74 65 33 53 72 63 4c 69 73 74 46 75 6e 63  lite3SrcListFunc
20380 41 72 67 73 28 50 61 72 73 65 20 2a 70 50 61 72  Args(Parse *pPar
20390 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  se, SrcList *p, 
203a0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
203b0 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
203c0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
203d0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
203e0 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  ->a[p->nSrc-1];.
203f0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
20400 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64  m->fg.notIndexed
20410 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
20420 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49  t( pItem->fg.isI
20430 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20  ndexedBy==0 );. 
20440 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
20450 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d  ->fg.isTabFunc==
20460 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  0 );.    pItem->
20470 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 70 4c  u1.pFuncArg = pL
20480 69 73 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  ist;.    pItem->
20490 66 67 2e 69 73 54 61 62 46 75 6e 63 20 3d 20 31  fg.isTabFunc = 1
204a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
204b0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
204c0 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
204d0 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a   pList);.  }.}..
204e0 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64  /*.** When build
204f0 69 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c  ing up a FROM cl
20500 61 75 73 65 20 69 6e 20 74 68 65 20 70 61 72 73  ause in the pars
20510 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  er, the join ope
20520 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74  rator.** is init
20530 69 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74  ially attached t
20540 6f 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61  o the left opera
20550 6e 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64  nd.  But the cod
20560 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65  e generator.** e
20570 78 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20  xpects the join 
20580 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f  operator to be o
20590 6e 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  n the right oper
205a0 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  and.  This routi
205b0 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c  ne.** Shifts all
205c0 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20   join operators 
205d0 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
205e0 68 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65  ht for an entire
205f0 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e   FROM.** clause.
20600 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20  .**.** Example: 
20610 53 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e  Suppose the join
20620 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a   is like this:.*
20630 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41  *.**           A
20640 20 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a   natural cross j
20650 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oin B.**.** The 
20660 6f 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74  operator is "nat
20670 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22  ural cross join"
20680 2e 20 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f  .  The A and B o
20690 70 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72  perands are stor
206a0 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d  ed.** in p->a[0]
206b0 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65   and p->a[1], re
206c0 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65  spectively.  The
206d0 20 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c   parser initiall
206e0 79 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20  y stores the.** 
206f0 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e  operator with A.
20700 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
20710 68 69 66 74 73 20 74 68 61 74 20 6f 70 65 72 61  hifts that opera
20720 74 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a  tor over to B..*
20730 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
20740 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79  cListShiftJoinTy
20750 70 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a  pe(SrcList *p){.
20760 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
20770 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
20780 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20  p->nSrc-1; i>0; 
20790 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  i--){.      p->a
207a0 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  [i].fg.jointype 
207b0 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a  = p->a[i-1].fg.j
207c0 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20  ointype;.    }. 
207d0 20 20 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f     p->a[0].fg.jo
207e0 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a  intype = 0;.  }.
207f0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
20800 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20  e VDBE code for 
20810 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e  a BEGIN statemen
20820 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
20830 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  e3BeginTransacti
20840 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
20850 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73  , int type){.  s
20860 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
20870 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a  be *v;.  int i;.
20880 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
20890 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  e!=0 );.  db = p
208a0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Parse->db;.  ass
208b0 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
208c0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
208d0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
208e0 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
208f0 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20   "BEGIN", 0, 0) 
20900 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
20910 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
20920 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
20930 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75  .  if( !v ) retu
20940 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d  rn;.  if( type!=
20950 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20  TK_DEFERRED ){. 
20960 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
20970 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
20980 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20990 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73  dOp2(v, OP_Trans
209a0 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65  action, i, (type
209b0 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b  ==TK_EXCLUSIVE)+
209c0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
209d0 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
209e0 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
209f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20a00 4f 70 30 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  Op0(v, OP_AutoCo
20a10 6d 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mmit);.}../*.** 
20a20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
20a30 64 65 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54 20  de for a COMMIT 
20a40 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 73 74 61 74  or ROLLBACK stat
20a50 65 6d 65 6e 74 2e 0a 2a 2a 20 43 6f 64 65 20 66  ement..** Code f
20a60 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 69 73 20 67  or ROLLBACK is g
20a70 65 6e 65 72 61 74 65 64 20 69 66 20 65 54 79 70  enerated if eTyp
20a80 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 2e 20  e==TK_ROLLBACK. 
20a90 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 63 6f   Otherwise.** co
20aa0 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
20ab0 66 6f 72 20 61 20 43 4f 4d 4d 49 54 2e 0a 2a 2f  for a COMMIT..*/
20ac0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64  .void sqlite3End
20ad0 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
20ae0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65  e *pParse, int e
20af0 54 79 70 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  Type){.  Vdbe *v
20b00 3b 0a 20 20 69 6e 74 20 69 73 52 6f 6c 6c 62 61  ;.  int isRollba
20b10 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ck;..  assert( p
20b20 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73  Parse!=0 );.  as
20b30 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
20b40 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
20b50 20 65 54 79 70 65 3d 3d 54 4b 5f 43 4f 4d 4d 49   eType==TK_COMMI
20b60 54 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 45  T || eType==TK_E
20b70 4e 44 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f  ND || eType==TK_
20b80 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 69 73  ROLLBACK );.  is
20b90 52 6f 6c 6c 62 61 63 6b 20 3d 20 65 54 79 70 65  Rollback = eType
20ba0 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  ==TK_ROLLBACK;. 
20bb0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
20bc0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
20bd0 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
20be0 2c 20 0a 20 20 20 20 20 20 20 69 73 52 6f 6c 6c  , .       isRoll
20bf0 62 61 63 6b 20 3f 20 22 52 4f 4c 4c 42 41 43 4b  back ? "ROLLBACK
20c00 22 20 3a 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  " : "COMMIT", 0,
20c10 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   0) ){.    retur
20c20 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c  n;.  }.  v = sql
20c30 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
20c40 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
20c50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20c60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f  ddOp2(v, OP_Auto
20c70 43 6f 6d 6d 69 74 2c 20 31 2c 20 69 73 52 6f 6c  Commit, 1, isRol
20c80 6c 62 61 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  lback);.  }.}../
20c90 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
20ca0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
20cb0 74 68 65 20 70 61 72 73 65 72 20 77 68 65 6e 20  the parser when 
20cc0 69 74 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d  it parses a comm
20cd0 61 6e 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a  and to create,.*
20ce0 2a 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c  * release or rol
20cf0 6c 62 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76  lback an SQL sav
20d00 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64  epoint. .*/.void
20d10 20 73 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e   sqlite3Savepoin
20d20 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
20d30 20 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a   int op, Token *
20d40 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  pName){.  char *
20d50 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
20d60 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
20d70 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b  rse->db, pName);
20d80 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a  .  if( zName ){.
20d90 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
20da0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
20db0 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  rse);.#ifndef SQ
20dc0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
20dd0 49 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74  IZATION.    stat
20de0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  ic const char * 
20df0 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22  const az[] = { "
20e00 42 45 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45  BEGIN", "RELEASE
20e10 22 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b  ", "ROLLBACK" };
20e20 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 53 41  .    assert( !SA
20e30 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26  VEPOINT_BEGIN &&
20e40 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
20e50 53 45 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49  SE==1 && SAVEPOI
20e60 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29  NT_ROLLBACK==2 )
20e70 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
20e80 20 21 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75   !v || sqlite3Au
20e90 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
20ea0 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54  SQLITE_SAVEPOINT
20eb0 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c  , az[op], zName,
20ec0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c   0) ){.      sql
20ed0 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
20ee0 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  e->db, zName);. 
20ef0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
20f00 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
20f10 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
20f20 61 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c  avepoint, op, 0,
20f30 20 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59   0, zName, P4_DY
20f40 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  NAMIC);.  }.}../
20f50 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
20f60 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  he TEMP database
20f70 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61   is open and ava
20f80 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20  ilable for use. 
20f90 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e   Return.** the n
20fa0 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
20fb0 20 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f    Leave any erro
20fc0 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68  r messages in th
20fd0 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
20fe0 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  re..*/.int sqlit
20ff0 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
21000 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
21010 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
21020 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
21030 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
21040 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73  pBt==0 && !pPars
21050 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
21060 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74    int rc;.    Bt
21070 72 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74  ree *pBt;.    st
21080 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66  atic const int f
21090 6c 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20  lags = .        
210a0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
210b0 41 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20  ADWRITE |.      
210c0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
210d0 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20  CREATE |.       
210e0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
210f0 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20  XCLUSIVE |.     
21100 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
21110 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c  _DELETEONCLOSE |
21120 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
21130 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a  E_OPEN_TEMP_DB;.
21140 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
21150 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70  3BtreeOpen(db->p
21160 56 66 73 2c 20 30 2c 20 64 62 2c 20 26 70 42 74  Vfs, 0, db, &pBt
21170 2c 20 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  , 0, flags);.   
21180 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21190 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
211a0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
211b0 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f  se, "unable to o
211c0 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
211d0 64 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20  database ".     
211e0 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f     "file for sto
211f0 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74  ring temporary t
21200 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70  ables");.      p
21210 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a  Parse->rc = rc;.
21220 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
21230 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44      }.    db->aD
21240 62 5b 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a  b[1].pBt = pBt;.
21250 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
21260 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
21270 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
21280 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42  _NOMEM==sqlite3B
21290 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
212a0 70 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67  pBt, db->nextPag
212b0 65 73 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b  esize, -1, 0) ){
212c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  .      sqlite3Oo
212d0 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
212e0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
212f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
21300 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72  ;.}../*.** Recor
21310 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
21320 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
21330 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62  e will need to b
21340 65 20 76 65 72 69 66 69 65 64 0a 2a 2a 20 66 6f  e verified.** fo
21350 72 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20  r database iDb. 
21360 20 54 68 65 20 63 6f 64 65 20 74 6f 20 61 63 74   The code to act
21370 75 61 6c 6c 79 20 76 65 72 69 66 79 20 74 68 65  ually verify the
21380 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a   schema cookie.*
21390 2a 20 77 69 6c 6c 20 6f 63 63 75 72 20 61 74 20  * will occur at 
213a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74  the end of the t
213b0 6f 70 2d 6c 65 76 65 6c 20 56 44 42 45 20 61 6e  op-level VDBE an
213c0 64 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61  d will be genera
213d0 74 65 64 0a 2a 2a 20 6c 61 74 65 72 2c 20 62 79  ted.** later, by
213e0 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f   sqlite3FinishCo
213f0 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ding()..*/.void 
21400 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
21410 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70  ySchema(Parse *p
21420 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
21430 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
21440 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
21450 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
21460 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  e);..  assert( i
21470 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61  Db>=0 && iDb<pPa
21480 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a  rse->db->nDb );.
21490 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
214a0 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
214b0 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20  Bt!=0 || iDb==1 
214c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
214d0 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  <SQLITE_MAX_ATTA
214e0 43 48 45 44 2b 32 20 29 3b 0a 20 20 61 73 73 65  CHED+2 );.  asse
214f0 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
21500 61 4d 75 74 65 78 48 65 6c 64 28 70 50 61 72 73  aMutexHeld(pPars
21510 65 2d 3e 64 62 2c 20 69 44 62 2c 20 30 29 20 29  e->db, iDb, 0) )
21520 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 54 65  ;.  if( DbMaskTe
21530 73 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f  st(pToplevel->co
21540 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d  okieMask, iDb)==
21550 30 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53  0 ){.    DbMaskS
21560 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f  et(pToplevel->co
21570 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a  okieMask, iDb);.
21580 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
21590 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
215a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
215b0 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
215c0 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20  pToplevel);.    
215d0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
215e0 66 20 61 72 67 75 6d 65 6e 74 20 7a 44 62 20 69  f argument zDb i
215f0 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c  s NULL, then cal
21600 6c 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  l sqlite3CodeVer
21610 69 66 79 53 63 68 65 6d 61 28 29 20 66 6f 72 20  ifySchema() for 
21620 65 61 63 68 20 0a 2a 2a 20 61 74 74 61 63 68 65  each .** attache
21630 64 20 64 61 74 61 62 61 73 65 2e 20 4f 74 68 65  d database. Othe
21640 72 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74  rwise, invoke it
21650 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
21660 65 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79  e named zDb only
21670 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21680 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64  3CodeVerifyNamed
21690 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
216a0 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
216b0 20 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74 65   *zDb){.  sqlite
216c0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
216d0 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  db;.  int i;.  f
216e0 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
216f0 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20  b; i++){.    Db 
21700 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
21710 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
21720 3e 70 42 74 20 26 26 20 28 21 7a 44 62 20 7c 7c  >pBt && (!zDb ||
21730 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
21740 6d 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 44 62  mp(zDb, pDb->zDb
21750 53 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 20  SName)) ){.     
21760 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
21770 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
21780 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   i);.    }.  }.}
21790 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
217a0 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
217b0 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69  prepares for doi
217c0 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ng an operation 
217d0 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68  that.** might ch
217e0 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73  ange the databas
217f0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
21800 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e  utine starts a n
21810 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ew transaction i
21820 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72  f we are not alr
21830 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61  eady within.** a
21840 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
21850 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
21860 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
21870 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68  ction, then a ch
21880 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73  eckpoint.** is s
21890 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61  et if the setSta
218a0 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72  tement parameter
218b0 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65   is true.  A che
218c0 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a  ckpoint should.*
218d0 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65  * be set for ope
218e0 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67  rations that mig
218f0 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20  ht fail (due to 
21900 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61  a constraint) pa
21910 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79  rt of.** the way
21920 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69   through and whi
21930 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  ch will need to 
21940 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73  undo some writes
21950 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
21960 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74  to.** rollback t
21970 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63  he whole transac
21980 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61  tion.  For opera
21990 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20  tions where all 
219a0 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63  constraints.** c
219b0 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65  an be checked be
219c0 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
219d0 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
219e0 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73   database, it is
219f0 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73   never.** necess
21a00 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72  ary to undo a wr
21a10 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63  ite and the chec
21a20 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f  kpoint should no
21a30 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  t be set..*/.voi
21a40 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72  d sqlite3BeginWr
21a50 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72  iteOperation(Par
21a60 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
21a70 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e  setStatement, in
21a80 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20  t iDb){.  Parse 
21a90 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
21aa0 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
21ab0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  l(pParse);.  sql
21ac0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
21ad0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
21ae0 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70  );.  DbMaskSet(p
21af0 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d  Toplevel->writeM
21b00 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f  ask, iDb);.  pTo
21b10 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57  plevel->isMultiW
21b20 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65  rite |= setState
21b30 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ment;.}../*.** I
21b40 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
21b50 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65   statement curre
21b60 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
21b70 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72  ruction might wr
21b80 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  ite.** more than
21b90 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d   one entry (exam
21ba0 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e  ple: deleting on
21bb0 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72  e row then inser
21bc0 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a  ting another,.**
21bd0 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69   inserting multi
21be0 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61  ple rows in a ta
21bf0 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e  ble, or insertin
21c00 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65  g a row and inde
21c10 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49  x entries.).** I
21c20 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72  f an abort occur
21c30 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20  s after some of 
21c40 74 68 65 73 65 20 77 72 69 74 65 73 20 68 61 76  these writes hav
21c50 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65  e completed, the
21c60 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  n it will.** be 
21c70 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
21c80 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20  o the completed 
21c90 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  writes..*/.void 
21ca0 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74  sqlite3MultiWrit
21cb0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
21cc0 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
21cd0 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
21ce0 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
21cf0 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  se);.  pToplevel
21d00 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d  ->isMultiWrite =
21d10 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68   1;.}../* .** Th
21d20 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
21d30 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
21d40 69 6e 65 20 69 66 20 69 73 20 64 69 73 63 6f 76  ine if is discov
21d50 65 72 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a  ers that it is.*
21d60 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62  * possible to ab
21d70 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ort a statement 
21d80 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74  prior to complet
21d90 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74  ion.  In order t
21da0 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68  o .** perform th
21db0 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74  is abort without
21dc0 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20   corrupting the 
21dd0 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65  database, we nee
21de0 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72  d to make.** sur
21df0 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
21e00 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65  ment is protecte
21e10 64 20 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74  d by a statement
21e20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
21e30 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c  .** Technically,
21e40 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f   we only need to
21e50 20 73 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72   set the mayAbor
21e60 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a  t flag if the.**
21e70 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c   isMultiWrite fl
21e80 61 67 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ag was previousl
21e90 79 20 73 65 74 2e 20 20 54 68 65 72 65 20 69 73  y set.  There is
21ea0 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e   a time dependen
21eb0 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20  cy.** such that 
21ec0 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f  the abort must o
21ed0 63 63 75 72 20 61 66 74 65 72 20 74 68 65 20 6d  ccur after the m
21ee0 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68 69 73  ultiwrite.  This
21ef0 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73   makes.** some s
21f00 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76  tatements involv
21f10 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43 45 20  ing the REPLACE 
21f20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
21f30 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a  ion algorithm.**
21f40 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73   go a little fas
21f50 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67  ter.  But taking
21f60 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68   advantage of th
21f70 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e  is time dependen
21f80 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d  cy.** makes it m
21f90 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f  ore difficult to
21fa0 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20   prove that the 
21fb0 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63 74 20  code is correct 
21fc0 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c  (in .** particul
21fd0 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20  ar, it prevents 
21fe0 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20  us from writing 
21ff0 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20  an effective.** 
22000 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
22010 66 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d  f sqlite3AssertM
22020 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73  ayAbort()) and s
22030 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e  o we have chosen
22040 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20  .** to take the 
22050 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73  safe route and s
22060 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61  kip the optimiza
22070 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
22080 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61  lite3MayAbort(Pa
22090 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
220a0 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
220b0 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
220c0 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
220d0 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61  .  pToplevel->ma
220e0 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f  yAbort = 1;.}../
220f0 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
22100 48 61 6c 74 20 74 68 61 74 20 63 61 75 73 65 73  Halt that causes
22110 20 74 68 65 20 76 64 62 65 20 74 6f 20 72 65 74   the vdbe to ret
22120 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
22130 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f  NSTRAINT.** erro
22140 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70  r. The onError p
22150 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69  arameter determi
22160 6e 65 73 20 77 68 69 63 68 20 28 69 66 20 61 6e  nes which (if an
22170 79 29 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  y) of the statem
22180 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75  ent.** and/or cu
22190 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
221a0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
221b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
221c0 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
221d0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
221e0 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
221f0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
22200 20 65 72 72 43 6f 64 65 2c 20 20 20 20 20 20 2f   errCode,      /
22210 2a 20 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72  * extended error
22220 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   code */.  int o
22230 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
22240 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20  Constraint type 
22250 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c 20 20  */.  char *p4,  
22260 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
22270 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 38 20  message */.  i8 
22280 70 34 74 79 70 65 2c 20 20 20 20 20 20 20 20 2f  p4type,        /
22290 2a 20 50 34 5f 53 54 41 54 49 43 20 6f 72 20 50  * P4_STATIC or P
222a0 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20  4_TRANSIENT */. 
222b0 20 75 38 20 70 35 45 72 72 6d 73 67 20 20 20 20   u8 p5Errmsg    
222c0 20 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20     /* P5_ErrMsg 
222d0 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  type */.){.  Vdb
222e0 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
222f0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
22300 20 61 73 73 65 72 74 28 20 28 65 72 72 43 6f 64   assert( (errCod
22310 65 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  e&0xff)==SQLITE_
22320 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20 20  CONSTRAINT );.  
22330 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  if( onError==OE_
22340 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c  Abort ){.    sql
22350 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
22360 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rse);.  }.  sqli
22370 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
22380 20 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64   OP_Halt, errCod
22390 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70  e, onError, 0, p
223a0 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 73 71  4, p4type);.  sq
223b0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
223c0 35 28 76 2c 20 70 35 45 72 72 6d 73 67 29 3b 0a  5(v, p5Errmsg);.
223d0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
223e0 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20   OP_Halt due to 
223f0 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52  UNIQUE or PRIMAR
22400 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
22410 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76   violation..*/.v
22420 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69 71 75  oid sqlite3Uniqu
22430 65 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  eConstraint(.  P
22440 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
22450 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
22460 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  ext */.  int onE
22470 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f  rror,      /* Co
22480 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f  nstraint type */
22490 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
224a0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
224b0 78 20 74 68 61 74 20 74 72 69 67 67 65 72 73 20  x that triggers 
224c0 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  the constraint *
224d0 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72  /.){.  char *zEr
224e0 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53 74  r;.  int j;.  St
224f0 72 41 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a 20  rAccum errMsg;. 
22500 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
22510 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20  Idx->pTable;..  
22520 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49  sqlite3StrAccumI
22530 6e 69 74 28 26 65 72 72 4d 73 67 2c 20 70 50 61  nit(&errMsg, pPa
22540 72 73 65 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 32  rse->db, 0, 0, 2
22550 30 30 29 3b 0a 20 20 69 66 28 20 70 49 64 78 2d  00);.  if( pIdx-
22560 3e 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20 20 20  >aColExpr ){.   
22570 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
22580 26 65 72 72 4d 73 67 2c 20 22 69 6e 64 65 78 20  &errMsg, "index 
22590 27 25 71 27 22 2c 20 70 49 64 78 2d 3e 7a 4e 61  '%q'", pIdx->zNa
225a0 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
225b0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
225c0 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29  x->nKeyCol; j++)
225d0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  {.      char *zC
225e0 6f 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ol;.      assert
225f0 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
22600 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  [j]>=0 );.      
22610 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
22620 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  l[pIdx->aiColumn
22630 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  [j]].zName;.    
22640 20 20 69 66 28 20 6a 20 29 20 73 71 6c 69 74 65    if( j ) sqlite
22650 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
22660 26 65 72 72 4d 73 67 2c 20 22 2c 20 22 2c 20 32  &errMsg, ", ", 2
22670 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22680 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c  StrAccumAppendAl
22690 6c 28 26 65 72 72 4d 73 67 2c 20 70 54 61 62 2d  l(&errMsg, pTab-
226a0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  >zName);.      s
226b0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
226c0 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2e  pend(&errMsg, ".
226d0 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", 1);.      sql
226e0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
226f0 6e 64 41 6c 6c 28 26 65 72 72 4d 73 67 2c 20 7a  ndAll(&errMsg, z
22700 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Col);.    }.  }.
22710 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
22720 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26  StrAccumFinish(&
22730 65 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  errMsg);.  sqlit
22740 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
22750 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 49 73  (pParse, .    Is
22760 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
22770 70 49 64 78 29 20 3f 20 53 51 4c 49 54 45 5f 43  pIdx) ? SQLITE_C
22780 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52  ONSTRAINT_PRIMAR
22790 59 4b 45 59 20 0a 20 20 20 20 20 20 20 20 20 20  YKEY .          
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227b0 20 20 3a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54    : SQLITE_CONST
227c0 52 41 49 4e 54 5f 55 4e 49 51 55 45 2c 0a 20 20  RAINT_UNIQUE,.  
227d0 20 20 6f 6e 45 72 72 6f 72 2c 20 7a 45 72 72 2c    onError, zErr,
227e0 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20 50 35 5f   P4_DYNAMIC, P5_
227f0 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65  ConstraintUnique
22800 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64  );.}.../*.** Cod
22810 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65  e an OP_Halt due
22820 20 74 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72   to non-unique r
22830 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  owid..*/.void sq
22840 6c 69 74 65 33 52 6f 77 69 64 43 6f 6e 73 74 72  lite3RowidConstr
22850 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
22860 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
22870 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
22880 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
22890 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20      /* Conflict 
228a0 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
228b0 69 74 68 6d 20 2a 2f 0a 20 20 54 61 62 6c 65 20  ithm */.  Table 
228c0 2a 70 54 61 62 20 20 20 20 20 20 20 2f 2a 20 54  *pTab       /* T
228d0 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  he table with th
228e0 65 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77  e non-unique row
228f0 69 64 20 2a 2f 20 0a 29 7b 0a 20 20 63 68 61 72  id */ .){.  char
22900 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74 20 72 63   *zMsg;.  int rc
22910 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50  ;.  if( pTab->iP
22920 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 4d  Key>=0 ){.    zM
22930 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
22940 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
22950 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a  "%s.%s", pTab->z
22960 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
22970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22980 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
22990 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a  >iPKey].zName);.
229a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
229b0 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41  CONSTRAINT_PRIMA
229c0 52 59 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  RYKEY;.  }else{.
229d0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
229e0 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65  e3MPrintf(pParse
229f0 2d 3e 64 62 2c 20 22 25 73 2e 72 6f 77 69 64 22  ->db, "%s.rowid"
22a00 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
22a10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22a20 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44  CONSTRAINT_ROWID
22a30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
22a40 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  altConstraint(pP
22a50 61 72 73 65 2c 20 72 63 2c 20 6f 6e 45 72 72 6f  arse, rc, onErro
22a60 72 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  r, zMsg, P4_DYNA
22a70 4d 49 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20  MIC,.           
22a80 20 20 20 20 20 20 20 20 20 20 20 20 20 50 35 5f               P5_
22a90 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65  ConstraintUnique
22aa0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  );.}../*.** Chec
22ab0 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64  k to see if pInd
22ac0 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c  ex uses the coll
22ad0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
22ae0 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  Coll.  Return.**
22af0 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
22b00 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74   and false if it
22b10 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69   does not..*/.#i
22b20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22b30 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
22b40 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61   int collationMa
22b50 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tch(const char *
22b60 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49  zColl, Index *pI
22b70 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  ndex){.  int i;.
22b80 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21    assert( zColl!
22b90 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  =0 );.  for(i=0;
22ba0 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   i<pIndex->nColu
22bb0 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  mn; i++){.    co
22bc0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49  nst char *z = pI
22bd0 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b  ndex->azColl[i];
22be0 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d  .    assert( z!=
22bf0 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 61 69 43  0 || pIndex->aiC
22c00 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20  olumn[i]<0 );.  
22c10 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69    if( pIndex->ai
22c20 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20  Column[i]>=0 && 
22c30 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
22c40 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  p(z, zColl) ){. 
22c50 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
22c60 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
22c70 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 0;.}.#endif../
22c80 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61  *.** Recompute a
22c90 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54  ll indices of pT
22ca0 61 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ab that use the 
22cb0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
22cc0 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20  ce pColl..** If 
22cd0 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
22ce0 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
22cf0 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a  ces of pTab..*/.
22d00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22d10 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
22d20 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54  ic void reindexT
22d30 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
22d40 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  se, Table *pTab,
22d50 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
22d60 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ll){.  Index *pI
22d70 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
22d80 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61     /* An index a
22d90 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
22da0 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49  Tab */..  for(pI
22db0 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  ndex=pTab->pInde
22dc0 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
22dd0 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29  x=pIndex->pNext)
22de0 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d  {.    if( zColl=
22df0 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d  =0 || collationM
22e00 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64  atch(zColl, pInd
22e10 65 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ex) ){.      int
22e20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
22e30 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
22e40 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
22e50 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71  chema);.      sq
22e60 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
22e70 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
22e80 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20   0, iDb);.      
22e90 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
22ea0 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
22eb0 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  x, -1);.    }.  
22ec0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
22ed0 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  * Recompute all 
22ee0 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74  indices of all t
22ef0 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  ables in all dat
22f00 61 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65  abases where the
22f10 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20  .** indices use 
22f20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
22f30 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49  quence pColl.  I
22f40 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20  f pColl==0 then 
22f50 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c  recompute.** all
22f60 20 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68   indices everywh
22f70 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ere..*/.#ifndef 
22f80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
22f90 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEX.static void 
22fa0 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
22fb0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
22fc0 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
22fd0 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  l){.  Db *pDb;  
22fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ff0 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61    /* A single da
23000 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
23010 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
23020 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
23030 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75  atabase index nu
23040 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mber */.  sqlite
23050 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
23060 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74  db;   /* The dat
23070 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
23080 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a   */.  HashElem *
23090 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
230a0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
230b0 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20   over tables in 
230c0 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  pDb */.  Table *
230d0 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
230e0 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
230f0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
23100 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
23110 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
23120 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
23130 20 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20    /* Needed for 
23140 73 63 68 65 6d 61 20 61 63 63 65 73 73 20 2a 2f  schema access */
23150 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44  .  for(iDb=0, pD
23160 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64  b=db->aDb; iDb<d
23170 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70  b->nDb; iDb++, p
23180 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72  Db++){.    asser
23190 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20  t( pDb!=0 );.   
231a0 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73   for(k=sqliteHas
231b0 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63  hFirst(&pDb->pSc
231c0 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
231d0 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68   k; k=sqliteHash
231e0 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20  Next(k)){.      
231f0 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73  pTab = (Table*)s
23200 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29  qliteHashData(k)
23210 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54  ;.      reindexT
23220 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
23230 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  b, zColl);.    }
23240 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
23250 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
23260 64 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44  de for the REIND
23270 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  EX command..**.*
23280 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
23290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232a0 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31              -- 1
232b0 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
232c0 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20  EX  <collation> 
232d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
232e0 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   2.**        REI
232f0 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65  NDEX  ?<database
23300 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20  >.?<tablename>  
23310 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 3.**        R
23320 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
23330 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e  se>.?<indexname>
23340 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72    -- 4.**.** For
23350 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69  m 1 causes all i
23360 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74  ndices in all at
23370 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
23380 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a   to be rebuilt..
23390 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c  ** Form 2 rebuil
233a0 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69  ds all indices i
233b0 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  n all databases 
233c0 74 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d  that use the nam
233d0 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20  ed.** collating 
233e0 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73  function.  Forms
233f0 20 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64   3 and 4 rebuild
23400 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
23410 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63   or all.** indic
23420 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
23430 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  th the named tab
23440 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  le..*/.#ifndef S
23450 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
23460 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  EX.void sqlite3R
23470 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  eindex(Parse *pP
23480 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
23490 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  me1, Token *pNam
234a0 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e2){.  CollSeq *
234b0 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
234c0 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
234d0 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72  sequence to be r
234e0 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c  eindexed, or NUL
234f0 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  L */.  char *z; 
23500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23510 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20     /* Name of a 
23520 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a  table or index *
23530 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
23540 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  zDb;            
23550 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
23560 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62  atabase */.  Tab
23570 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
23580 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
23590 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
235a0 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ase */.  Index *
235b0 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  pIndex;         
235c0 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
235d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
235e0 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
235f0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
23600 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
23610 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
23620 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
23630 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
23640 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
23650 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
23660 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a  */.  Token *pObj
23670 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
23680 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
23690 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
236a0 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a  o be reindexed *
236b0 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  /..  /* Read the
236c0 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
236d0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
236e0 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
236f0 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
23700 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
23710 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
23720 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
23730 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
23740 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
23750 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
23760 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e  n;.  }..  if( pN
23770 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ame1==0 ){.    r
23780 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
23790 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20  pParse, 0);.    
237a0 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20  return;.  }else 
237b0 69 66 28 20 4e 45 56 45 52 28 70 4e 61 6d 65 32  if( NEVER(pName2
237c0 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e  ==0) || pName2->
237d0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  z==0 ){.    char
237e0 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73   *zColl;.    ass
237f0 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29  ert( pName1->z )
23800 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71  ;.    zColl = sq
23810 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
23820 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
23830 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20  Name1);.    if( 
23840 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b  !zColl ) return;
23850 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
23860 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
23870 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
23880 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ll, 0);.    if( 
23890 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
238a0 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
238b0 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a  pParse, zColl);.
238c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
238d0 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
238e0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
238f0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
23900 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
23910 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
23920 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
23930 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
23940 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61   pName2, &pObjNa
23950 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
23960 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d   ) return;.  z =
23970 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
23980 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61  Token(db, pObjNa
23990 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  me);.  if( z==0 
239a0 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20  ) return;.  zDb 
239b0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
239c0 44 62 53 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20  DbSName;.  pTab 
239d0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
239e0 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a  le(db, z, zDb);.
239f0 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
23a00 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70    reindexTable(p
23a10 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b  Parse, pTab, 0);
23a20 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
23a30 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72  ee(db, z);.    r
23a40 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e  eturn;.  }.  pIn
23a50 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
23a60 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44  dIndex(db, z, zD
23a70 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  b);.  sqlite3DbF
23a80 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66  ree(db, z);.  if
23a90 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
23aa0 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
23ab0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
23ac0 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 0, iDb);.    
23ad0 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
23ae0 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
23af0 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  x, -1);.    retu
23b00 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
23b10 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
23b20 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65  , "unable to ide
23b30 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74  ntify the object
23b40 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
23b50 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ");.}.#endif../*
23b60 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 4b 65 79  .** Return a Key
23b70 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
23b80 68 61 74 20 69 73 20 61 70 70 72 6f 70 72 69 61  hat is appropria
23b90 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  te for the given
23ba0 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68   Index..**.** Th
23bb0 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  e caller should 
23bc0 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 4b 65  invoke sqlite3Ke
23bd0 79 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f 6e 20  yInfoUnref() on 
23be0 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a  the returned obj
23bf0 65 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74 20 68  ect.** when it h
23c00 61 73 20 66 69 6e 69 73 68 65 64 20 75 73 69 6e  as finished usin
23c10 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f  g it..*/.KeyInfo
23c20 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f   *sqlite3KeyInfo
23c30 4f 66 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  OfIndex(Parse *p
23c40 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
23c50 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dx){.  int i;.  
23c60 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d  int nCol = pIdx-
23c70 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20  >nColumn;.  int 
23c80 6e 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e 4b 65  nKey = pIdx->nKe
23c90 79 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  yCol;.  KeyInfo 
23ca0 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20 70 50 61  *pKey;.  if( pPa
23cb0 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
23cc0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 64 78  rn 0;.  if( pIdx
23cd0 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29 7b  ->uniqNotNull ){
23ce0 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69  .    pKey = sqli
23cf0 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
23d00 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79  pParse->db, nKey
23d10 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20  , nCol-nKey);.  
23d20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 20  }else{.    pKey 
23d30 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
23d40 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
23d50 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d 0a  , nCol, 0);.  }.
23d60 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
23d70 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
23d80 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
23d90 62 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20 20 20  ble(pKey) );.   
23da0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
23db0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
23dc0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
23dd0 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  = pIdx->azColl[i
23de0 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61  ];.      pKey->a
23df0 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3d  Coll[i] = zColl=
23e00 3d 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52  =sqlite3StrBINAR
23e10 59 20 3f 20 30 20 3a 0a 20 20 20 20 20 20 20 20  Y ? 0 :.        
23e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e30 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
23e40 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
23e50 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d  ll);.      pKey-
23e60 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
23e70 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
23e80 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  r[i];.    }.    
23e90 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
23ea0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
23eb0 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51  ( pParse->rc==SQ
23ec0 4c 49 54 45 5f 45 52 52 4f 52 5f 4d 49 53 53 49  LITE_ERROR_MISSI
23ed0 4e 47 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20  NG_COLLSEQ );.  
23ee0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62 4e      if( pIdx->bN
23ef0 6f 51 75 65 72 79 3d 3d 30 20 29 7b 0a 20 20 20  oQuery==0 ){.   
23f00 20 20 20 20 20 2f 2a 20 44 65 61 63 74 69 76 61       /* Deactiva
23f10 74 65 20 74 68 65 20 69 6e 64 65 78 20 62 65 63  te the index bec
23f20 61 75 73 65 20 69 74 20 63 6f 6e 74 61 69 6e 73  ause it contains
23f30 20 61 6e 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 6c   an unknown coll
23f40 61 74 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  ating.        **
23f50 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 65 20   sequence.  The 
23f60 6f 6e 6c 79 20 77 61 79 20 74 6f 20 72 65 61 63  only way to reac
23f70 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 20 69  tive the index i
23f80 73 20 74 6f 20 72 65 6c 6f 61 64 20 74 68 65 0a  s to reload the.
23f90 20 20 20 20 20 20 20 20 2a 2a 20 73 63 68 65 6d          ** schem
23fa0 61 2e 20 20 41 64 64 69 6e 67 20 74 68 65 20 6d  a.  Adding the m
23fb0 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6e 67  issing collating
23fc0 20 73 65 71 75 65 6e 63 65 20 6c 61 74 65 72 20   sequence later 
23fd0 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 20  does not.       
23fe0 20 2a 2a 20 72 65 61 63 74 69 76 65 20 74 68 65   ** reactive the
23ff0 20 69 6e 64 65 78 2e 20 20 54 68 65 20 61 70 70   index.  The app
24000 6c 69 63 61 74 69 6f 6e 20 68 61 64 20 74 68 65  lication had the
24010 20 63 68 61 6e 63 65 20 74 6f 20 72 65 67 69 73   chance to regis
24020 74 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ter.        ** t
24030 68 65 20 6d 69 73 73 69 6e 67 20 69 6e 64 65 78  he missing index
24040 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61   using the colla
24050 74 69 6f 6e 2d 6e 65 65 64 65 64 20 63 61 6c 6c  tion-needed call
24060 62 61 63 6b 2e 20 20 46 6f 72 0a 20 20 20 20 20  back.  For.     
24070 20 20 20 2a 2a 20 73 69 6d 70 6c 69 63 69 74 79     ** simplicity
24080 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  , SQLite will no
24090 74 20 67 69 76 65 20 74 68 65 20 61 70 70 6c 69  t give the appli
240a0 63 61 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20  cation a second 
240b0 63 68 61 6e 63 65 2e 0a 20 20 20 20 20 20 20 20  chance..        
240c0 2a 2f 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  */.        pIdx-
240d0 3e 62 4e 6f 51 75 65 72 79 20 3d 20 31 3b 0a 20  >bNoQuery = 1;. 
240e0 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
240f0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
24100 5f 52 45 54 52 59 3b 0a 20 20 20 20 20 20 7d 0a  _RETRY;.      }.
24110 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79        sqlite3Key
24120 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 29 3b  InfoUnref(pKey);
24130 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20 30 3b  .      pKey = 0;
24140 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
24150 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a 23 69 66  urn pKey;.}..#if
24160 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24170 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  _CTE./* .** This
24180 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
24190 6b 65 64 20 6f 6e 63 65 20 70 65 72 20 43 54 45  ked once per CTE
241a0 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
241b0 68 69 6c 65 20 70 61 72 73 69 6e 67 20 61 20 0a  hile parsing a .
241c0 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20  ** WITH clause. 
241d0 0a 2a 2f 0a 57 69 74 68 20 2a 73 71 6c 69 74 65  .*/.With *sqlite
241e0 33 57 69 74 68 41 64 64 28 0a 20 20 50 61 72 73  3WithAdd(.  Pars
241f0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
24200 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
24210 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 69 74 68  ontext */.  With
24220 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20   *pWith,        
24230 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e 67 20      /* Existing 
24240 57 49 54 48 20 63 6c 61 75 73 65 2c 20 6f 72 20  WITH clause, or 
24250 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
24260 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *pName,         
24270 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
24280 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20 2a 2f   common-table */
24290 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 72  .  ExprList *pAr
242a0 67 6c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4f 70  glist,     /* Op
242b0 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 6e 61  tional column na
242c0 6d 65 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20  me list for the 
242d0 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63  table */.  Selec
242e0 74 20 2a 70 51 75 65 72 79 20 20 20 20 20 20 20  t *pQuery       
242f0 20 20 20 2f 2a 20 51 75 65 72 79 20 75 73 65 64     /* Query used
24300 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
24310 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  he table */.){. 
24320 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
24330 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 57 69 74  Parse->db;.  Wit
24340 68 20 2a 70 4e 65 77 3b 0a 20 20 63 68 61 72 20  h *pNew;.  char 
24350 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 43 68  *zName;..  /* Ch
24360 65 63 6b 20 74 68 61 74 20 74 68 65 20 43 54 45  eck that the CTE
24370 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 20   name is unique 
24380 77 69 74 68 69 6e 20 74 68 69 73 20 57 49 54 48  within this WITH
24390 20 63 6c 61 75 73 65 2e 20 49 66 0a 20 20 2a 2a   clause. If.  **
243a0 20 6e 6f 74 2c 20 73 74 6f 72 65 20 61 6e 20 65   not, store an e
243b0 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73  rror in the Pars
243c0 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  e structure. */.
243d0 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
243e0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
243f0 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
24400 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 26  );.  if( zName &
24410 26 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69  & pWith ){.    i
24420 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
24430 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65  0; i<pWith->nCte
24440 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
24450 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
24460 28 7a 4e 61 6d 65 2c 20 70 57 69 74 68 2d 3e 61  (zName, pWith->a
24470 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
24480 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24490 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
244a0 20 22 64 75 70 6c 69 63 61 74 65 20 57 49 54 48   "duplicate WITH
244b0 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25 73 22   table name: %s"
244c0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
244d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
244e0 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20  f( pWith ){.    
244f0 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
24500 6f 66 28 2a 70 57 69 74 68 29 20 2b 20 28 73 69  of(*pWith) + (si
24510 7a 65 6f 66 28 70 57 69 74 68 2d 3e 61 5b 31 5d  zeof(pWith->a[1]
24520 29 20 2a 20 70 57 69 74 68 2d 3e 6e 43 74 65 29  ) * pWith->nCte)
24530 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
24540 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
24550 2c 20 70 57 69 74 68 2c 20 6e 42 79 74 65 29 3b  , pWith, nByte);
24560 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
24570 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
24580 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
24590 65 6f 66 28 2a 70 57 69 74 68 29 29 3b 0a 20 20  eof(*pWith));.  
245a0 7d 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65  }.  assert( (pNe
245b0 77 21 3d 30 20 26 26 20 7a 4e 61 6d 65 21 3d 30  w!=0 && zName!=0
245c0 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ) || db->mallocF
245d0 61 69 6c 65 64 20 29 3b 0a 0a 20 20 69 66 28 20  ailed );..  if( 
245e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
245f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
24600 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
24610 2c 20 70 41 72 67 6c 69 73 74 29 3b 0a 20 20 20  , pArglist);.   
24620 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
24630 6c 65 74 65 28 64 62 2c 20 70 51 75 65 72 79 29  lete(db, pQuery)
24640 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
24650 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
24660 20 20 20 20 70 4e 65 77 20 3d 20 70 57 69 74 68      pNew = pWith
24670 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
24680 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74  New->a[pNew->nCt
24690 65 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 51 75  e].pSelect = pQu
246a0 65 72 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ery;.    pNew->a
246b0 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 43 6f  [pNew->nCte].pCo
246c0 6c 73 20 3d 20 70 41 72 67 6c 69 73 74 3b 0a 20  ls = pArglist;. 
246d0 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
246e0 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20 3d 20 7a  >nCte].zName = z
246f0 4e 61 6d 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Name;.    pNew->
24700 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 43  a[pNew->nCte].zC
24710 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70  teErr = 0;.    p
24720 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a 20 20 7d  New->nCte++;.  }
24730 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ..  return pNew;
24740 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
24750 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
24760 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20 70  he With object p
24770 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
24780 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
24790 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74  .void sqlite3Wit
247a0 68 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  hDelete(sqlite3 
247b0 2a 64 62 2c 20 57 69 74 68 20 2a 70 57 69 74 68  *db, With *pWith
247c0 29 7b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29  ){.  if( pWith )
247d0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
247e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74   for(i=0; i<pWit
247f0 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  h->nCte; i++){. 
24800 20 20 20 20 20 73 74 72 75 63 74 20 43 74 65 20       struct Cte 
24810 2a 70 43 74 65 20 3d 20 26 70 57 69 74 68 2d 3e  *pCte = &pWith->
24820 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[i];.      sqli
24830 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
24840 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 43 6f 6c  e(db, pCte->pCol
24850 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  s);.      sqlite
24860 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
24870 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 29  , pCte->pSelect)
24880 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
24890 62 46 72 65 65 28 64 62 2c 20 70 43 74 65 2d 3e  bFree(db, pCte->
248a0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
248b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
248c0 64 62 2c 20 70 57 69 74 68 29 3b 0a 20 20 7d 0a  db, pWith);.  }.
248d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
248e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
248f0 5f 43 54 45 29 20 2a 2f 0a                       _CTE) */.