/ Hex Artifact Content
Login

Artifact ce2ee94ac2a056414c5ebb005910500dce2f119fc65a101b401074a253ffa144:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c40: 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1c50: 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44 69  vel==0 );  /* Di
1c60: 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65 6e  sables and re-en
1c70: 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a 20  ables match */. 
1c80: 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d 20     /* A minimum 
1c90: 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20 69 73  of one cursor is
1ca0: 20 72 65 71 75 69 72 65 64 20 69 66 20 61 75 74   required if aut
1cb0: 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75 73  oincrement is us
1cc0: 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20 74 69  ed.    *  See ti
1cd0: 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63 31 66  cket [a696379c1f
1ce0: 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69 66  08866] */.    if
1cf0: 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 21  ( pParse->pAinc!
1d00: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54  =0 && pParse->nT
1d10: 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d 3e  ab==0 ) pParse->
1d20: 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 73 71  nTab = 1;.    sq
1d30: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
1d40: 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b 0a 20  dy(v, pParse);. 
1d50: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
1d60: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
1d70: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65  else{.    pParse
1d80: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
1d90: 52 4f 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ROR;.  }.}../*.*
1da0: 2a 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72  * Run the parser
1db0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
1dc0: 74 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20  tor recursively 
1dd0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65  in order to gene
1de0: 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72  rate.** code for
1df0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
1e00: 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68  nt given onto th
1e10: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61  e end of the pPa
1e20: 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63  rse context.** c
1e30: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
1e40: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68  onstruction.  Wh
1e50: 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73  en the parser is
1e60: 20 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79   run recursively
1e70: 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68  .** this way, th
1e80: 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20  e final OP_Halt 
1e90: 69 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20  is not appended 
1ea0: 61 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61  and other initia
1eb0: 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  lization.** and 
1ec0: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65  finalization ste
1ed0: 70 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62  ps are omitted b
1ee0: 65 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65  ecause those are
1ef0: 20 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65   handling by the
1f00: 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61  .** outermost pa
1f10: 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20  rser..**.** Not 
1f20: 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65  everything is ne
1f30: 73 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61  stable.  This fa
1f40: 63 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e  cility is design
1f50: 65 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20  ed to permit.** 
1f60: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20  INSERT, UPDATE, 
1f70: 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61  and DELETE opera
1f80: 74 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51  tions against SQ
1f90: 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73  LITE_MASTER.  Us
1fa0: 65 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75  e.** care if you
1fb0: 20 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74   decide to try t
1fc0: 6f 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69  o use this routi
1fd0: 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ne for some othe
1fe0: 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76  r purposes..*/.v
1ff0: 6f 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65  oid sqlite3Neste
2000: 64 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50  dParse(Parse *pP
2010: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
2020: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
2030: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
2040: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63   char *zSql;.  c
2050: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
2060: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2070: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2080: 63 68 61 72 20 73 61 76 65 42 75 66 5b 50 41 52  char saveBuf[PAR
2090: 53 45 5f 54 41 49 4c 5f 53 5a 5d 3b 0a 0a 20 20  SE_TAIL_SZ];..  
20a0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
20b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
20c0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73  ert( pParse->nes
20d0: 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65  ted<10 );  /* Ne
20e0: 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c  sting should onl
20f0: 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20  y be of limited 
2100: 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74  depth */.  va_st
2110: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
2120: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
2130: 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a  e3VMPrintf(db, z
2140: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
2150: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
2160: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
2170: 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d  return;   /* A m
2180: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
2190: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  failed */.  }.  
21a0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b  pParse->nested++
21b0: 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42  ;.  memcpy(saveB
21c0: 75 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 28 70  uf, PARSE_TAIL(p
21d0: 50 61 72 73 65 29 2c 20 50 41 52 53 45 5f 54 41  Parse), PARSE_TA
21e0: 49 4c 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74  IL_SZ);.  memset
21f0: 28 50 41 52 53 45 5f 54 41 49 4c 28 70 50 61 72  (PARSE_TAIL(pPar
2200: 73 65 29 2c 20 30 2c 20 50 41 52 53 45 5f 54 41  se), 0, PARSE_TA
2210: 49 4c 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  IL_SZ);.  sqlite
2220: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
2230: 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73  e, zSql, &zErrMs
2240: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
2250: 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
2260: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2270: 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d  e(db, zSql);.  m
2280: 65 6d 63 70 79 28 50 41 52 53 45 5f 54 41 49 4c  emcpy(PARSE_TAIL
2290: 28 70 50 61 72 73 65 29 2c 20 73 61 76 65 42 75  (pParse), saveBu
22a0: 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a  f, PARSE_TAIL_SZ
22b0: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73  );.  pParse->nes
22c0: 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51  ted--;.}..#if SQ
22d0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
22e0: 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52  TICATION./*.** R
22f0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a 54  eturn TRUE if zT
2300: 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65  able is the name
2310: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 74   of the system t
2320: 61 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73  able that stores
2330: 20 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20   the.** list of 
2340: 75 73 65 72 73 20 61 6e 64 20 74 68 65 69 72 20  users and their 
2350: 61 63 63 65 73 73 20 63 72 65 64 65 6e 74 69 61  access credentia
2360: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
2370: 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28  e3UserAuthTable(
2380: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2390: 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  le){.  return sq
23a0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54  lite3_stricmp(zT
23b0: 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75 73  able, "sqlite_us
23c0: 65 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  er")==0;.}.#endi
23d0: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  f../*.** Locate 
23e0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
23f0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
2400: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
2410: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
2420: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
2430: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
2440: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
2450: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
2460: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2470: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
2480: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
2490: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
24a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
24b0: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
24c0: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
24d0: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
24e0: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
24f0: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
2500: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
2510: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
2520: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
2530: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
2540: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
2550: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
2560: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2570: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
2580: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
2590: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
25a0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
25b0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
25c0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
25d0: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
25e0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
25f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
2600: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2610: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
2620: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
2630: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
2640: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  ;..  /* All mute
2650: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2660: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2670: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2680: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
2690: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
26a0: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
26b0: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
26c0: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69 66  texes(db) );.#if
26d0: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
26e0: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f 2a  HENTICATION.  /*
26f0: 20 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e 20   Only the admin 
2700: 75 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20  user is allowed 
2710: 74 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  to know that the
2720: 20 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62   sqlite_user tab
2730: 6c 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20 2a  le.  ** exists *
2740: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68  /.  if( db->auth
2750: 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48  .authLevel<UAUTH
2760: 5f 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74 65  _Admin && sqlite
2770: 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 7a  3UserAuthTable(z
2780: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
2790: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
27a0: 6e 64 69 66 0a 20 20 77 68 69 6c 65 28 31 29 7b  ndif.  while(1){
27b0: 0a 20 20 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  .    for(i=OMIT_
27c0: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
27d0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
27e0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
27f0: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
2800: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
2810: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69 66  MAIN */.      if
2820: 28 20 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 7c  ( zDatabase==0 |
2830: 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  | sqlite3StrICmp
2840: 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e  (zDatabase, db->
2850: 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29  aDb[j].zDbSName)
2860: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
2870: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
2880: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
2890: 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  , j, 0) );.     
28a0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
28b0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b  shFind(&db->aDb[
28c0: 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  j].pSchema->tblH
28d0: 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ash, zName);.   
28e0: 20 20 20 20 20 69 66 28 20 70 20 29 20 72 65 74       if( p ) ret
28f0: 75 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20  urn p;.      }. 
2900: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4e 6f 74 20     }.    /* Not 
2910: 66 6f 75 6e 64 2e 20 20 49 66 20 74 68 65 20 6e  found.  If the n
2920: 61 6d 65 20 77 65 20 77 65 72 65 20 6c 6f 6f 6b  ame we were look
2930: 69 6e 67 20 66 6f 72 20 77 61 73 20 74 65 6d 70  ing for was temp
2940: 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20  .sqlite_master. 
2950: 20 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67     ** then chang
2960: 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 73 71  e the name to sq
2970: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
2980: 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
2990: 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
29a0: 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c  e3StrICmp(zName,
29b0: 20 4d 41 53 54 45 52 5f 4e 41 4d 45 29 21 3d 30   MASTER_NAME)!=0
29c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
29d0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
29e0: 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d  p(zDatabase, db-
29f0: 3e 61 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[1].zDbSName
2a00: 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
2a10: 20 20 7a 4e 61 6d 65 20 3d 20 54 45 4d 50 5f 4d    zName = TEMP_M
2a20: 41 53 54 45 52 5f 4e 41 4d 45 3b 0a 20 20 7d 0a  ASTER_NAME;.  }.
2a30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2a40: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
2a50: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
2a60: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
2a70: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
2a80: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
2a90: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
2aa0: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
2ab0: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
2ac0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
2ad0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
2ae0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
2af0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
2b00: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c  f not found.  Al
2b10: 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65  so leave an.** e
2b20: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
2b30: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
2b40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
2b50: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
2b60: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73  is routine and s
2b70: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2b80: 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
2b90: 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73  * routine leaves
2ba0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2bb0: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
2bc0: 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71  rMsg where.** sq
2bd0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29  lite3FindTable()
2be0: 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61   does not..*/.Ta
2bf0: 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  ble *sqlite3Loca
2c00: 74 65 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  teTable(.  Parse
2c10: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2c20: 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20    /* context in 
2c30: 77 68 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20  which to report 
2c40: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 33 32 20  errors */.  u32 
2c50: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2c60: 20 20 20 2f 2a 20 4c 4f 43 41 54 45 5f 56 49 45     /* LOCATE_VIE
2c70: 57 20 6f 72 20 4c 4f 43 41 54 45 5f 4e 4f 45 52  W or LOCATE_NOER
2c80: 52 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  R */.  const cha
2c90: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  r *zName,     /*
2ca0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
2cb0: 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  le we are lookin
2cc0: 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  g for */.  const
2cd0: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20   char *zDbase   
2ce0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2cf0: 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68   database.  Migh
2d00: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
2d10: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f    Table *p;..  /
2d20: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
2d30: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
2d40: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2d50: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
2d60: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
2d70: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
2d80: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
2d90: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
2da0: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
2db0: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
2dc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2dd0: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
2de0: 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
2df0: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  e->db, zName, zD
2e00: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
2e10: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
2e20: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 66 6c 61 67  har *zMsg = flag
2e30: 73 20 26 20 4c 4f 43 41 54 45 5f 56 49 45 57 20  s & LOCATE_VIEW 
2e40: 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22  ? "no such view"
2e50: 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c   : "no such tabl
2e60: 65 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e";.#ifndef SQLI
2e70: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2e80: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 73 71 6c  ABLE.    if( sql
2e90: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 70  ite3FindDbName(p
2ea0: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 44 62 61 73  Parse->db, zDbas
2eb0: 65 29 3c 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  e)<1 ){.      /*
2ec0: 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 74 68 65   If zName is the
2ed0: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
2ee0: 20 61 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   a table in the 
2ef0: 73 63 68 65 6d 61 20 63 72 65 61 74 65 64 20 75  schema created u
2f00: 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 43 52  sing.      ** CR
2f10: 45 41 54 45 2c 20 74 68 65 6e 20 63 68 65 63 6b  EATE, then check
2f20: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 69 73   to see if it is
2f30: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
2f40: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
2f50: 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20  at.      ** can 
2f60: 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20  be an eponymous 
2f70: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 2a  virtual table. *
2f80: 2f 0a 20 20 20 20 20 20 4d 6f 64 75 6c 65 20 2a  /.      Module *
2f90: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29  pMod = (Module*)
2fa0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2fb0: 26 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4d 6f  &pParse->db->aMo
2fc0: 64 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  dule, zName);.  
2fd0: 20 20 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20      if( pMod==0 
2fe0: 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  && sqlite3_strni
2ff0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67  cmp(zName, "prag
3000: 6d 61 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20  ma_", 7)==0 ){. 
3010: 20 20 20 20 20 20 20 70 4d 6f 64 20 3d 20 73 71         pMod = sq
3020: 6c 69 74 65 33 50 72 61 67 6d 61 56 74 61 62 52  lite3PragmaVtabR
3030: 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2d 3e  egister(pParse->
3040: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
3050: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4d    }.      if( pM
3060: 6f 64 20 26 26 20 73 71 6c 69 74 65 33 56 74 61  od && sqlite3Vta
3070: 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 49  bEponymousTableI
3080: 6e 69 74 28 70 50 61 72 73 65 2c 20 70 4d 6f 64  nit(pParse, pMod
3090: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
30a0: 75 72 6e 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61  urn pMod->pEpoTa
30b0: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
30c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
30d0: 28 66 6c 61 67 73 20 26 20 4c 4f 43 41 54 45 5f  (flags & LOCATE_
30e0: 4e 4f 45 52 52 29 3d 3d 30 20 29 7b 0a 20 20 20  NOERR)==0 ){.   
30f0: 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b     if( zDbase ){
3100: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3110: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3120: 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d   "%s: %s.%s", zM
3130: 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d  sg, zDbase, zNam
3140: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
3150: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3160: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3170: 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c   "%s: %s", zMsg,
3180: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
3190: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
31a0: 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
31b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
31c0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
31d0: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
31e0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 2a   identified by *
31f0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
3200: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
3210: 64 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  d sqlite3LocateT
3220: 61 62 6c 65 28 29 2e 20 54 68 65 20 64 69 66 66  able(). The diff
3230: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a  erence between.*
3240: 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  * sqlite3LocateT
3250: 61 62 6c 65 28 29 20 61 6e 64 20 74 68 69 73 20  able() and this 
3260: 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 61 74  function is that
3270: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
3280: 65 73 74 72 69 63 74 73 0a 2a 2a 20 74 68 65 20  estricts.** the 
3290: 73 65 61 72 63 68 20 74 6f 20 73 63 68 65 6d 61  search to schema
32a0: 20 28 70 2d 3e 70 53 63 68 65 6d 61 29 20 69 66   (p->pSchema) if
32b0: 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e   it is not NULL.
32c0: 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79 20   p->pSchema may 
32d0: 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  be.** non-NULL i
32e0: 66 20 69 74 20 69 73 20 70 61 72 74 20 6f 66 20  f it is part of 
32f0: 61 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65  a view or trigge
3300: 72 20 70 72 6f 67 72 61 6d 20 64 65 66 69 6e 69  r program defini
3310: 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c  tion. See.** sql
3320: 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 29  ite3FixSrcList()
3330: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
3340: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c  .Table *sqlite3L
3350: 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 0a  ocateTableItem(.
3360: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3370: 20 0a 20 20 75 33 32 20 66 6c 61 67 73 2c 0a 20   .  u32 flags,. 
3380: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
3390: 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e  item *p.){.  con
33a0: 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  st char *zDb;.  
33b0: 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65  assert( p->pSche
33c0: 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74  ma==0 || p->zDat
33d0: 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66  abase==0 );.  if
33e0: 28 20 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  ( p->pSchema ){.
33f0: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
3400: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
3410: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
3420: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
3430: 7a 44 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  zDb = pParse->db
3440: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
3450: 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ame;.  }else{.  
3460: 20 20 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61    zDb = p->zData
3470: 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  base;.  }.  retu
3480: 72 6e 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  rn sqlite3Locate
3490: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 66 6c  Table(pParse, fl
34a0: 61 67 73 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a  ags, p->zName, z
34b0: 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  Db);.}../*.** Lo
34c0: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
34d0: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
34e0: 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20  t describes .** 
34f0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
3500: 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  ex given the nam
3510: 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a  e of that index.
3520: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20  ** and the name 
3530: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
3540: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
3550: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75  e index..** Retu
3560: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
3570: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
3580: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
3590: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
35a0: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
35b0: 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74  e.** table and t
35c0: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
35d0: 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72  g index is retur
35e0: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
35f0: 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63  ng.** for duplic
3600: 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  ate index names 
3610: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
3620: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a  earch order is.*
3630: 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  * TEMP first, th
3640: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
3650: 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  y auxiliary data
3660: 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75  bases added.** u
3670: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
3680: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65  command..*/.Inde
3690: 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  x *sqlite3FindIn
36a0: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
36b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
36c0: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
36d0: 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  zDb){.  Index *p
36e0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
36f0: 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20   /* All mutexes 
3700: 61 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  are required for
3710: 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20   schema access. 
3720: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f   Make sure we ho
3730: 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73  ld them. */.  as
3740: 73 65 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20  sert( zDb!=0 || 
3750: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
3760: 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
3770: 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  );.  for(i=OMIT_
3780: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
3790: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  b; i++){.    int
37a0: 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31   j = (i<2) ? i^1
37b0: 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68   : i;  /* Search
37c0: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49   TEMP before MAI
37d0: 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20  N */.    Schema 
37e0: 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  *pSchema = db->a
37f0: 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  Db[j].pSchema;. 
3800: 20 20 20 61 73 73 65 72 74 28 20 70 53 63 68 65     assert( pSche
3810: 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44  ma );.    if( zD
3820: 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  b && sqlite3StrI
3830: 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62  Cmp(zDb, db->aDb
3840: 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29 20 29 20  [j].zDbSName) ) 
3850: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
3860: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
3870: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
3880: 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20   j, 0) );.    p 
3890: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
38a0: 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  d(&pSchema->idxH
38b0: 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ash, zName);.   
38c0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
38d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
38e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d  }../*.** Reclaim
38f0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64   the memory used
3900: 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a   by an index.*/.
3910: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
3920: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
3930: 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 23 69  b, Index *p){.#i
3940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3950: 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69  T_ANALYZE.  sqli
3960: 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61  te3DeleteIndexSa
3970: 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a 23 65  mples(db, p);.#e
3980: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78  ndif.  sqlite3Ex
3990: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
39a0: 70 50 61 72 74 49 64 78 57 68 65 72 65 29 3b 0a  pPartIdxWhere);.
39b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
39c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 61  tDelete(db, p->a
39d0: 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  ColExpr);.  sqli
39e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
39f0: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66 28  >zColAff);.  if(
3a00: 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20 29 20   p->isResized ) 
3a10: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3a20: 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e 61 7a 43  , (void *)p->azC
3a30: 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  oll);.#ifdef SQL
3a40: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
3a50: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 71 6c 69  _OR_STAT4.  sqli
3a60: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f  te3_free(p->aiRo
3a70: 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  wEst);.#endif.  
3a80: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3a90: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  , p);.}../*.** F
3aa0: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c  or the index cal
3ab0: 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69  led zIdxName whi
3ac0: 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  ch is found in t
3ad0: 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c  he database iDb,
3ae0: 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20  .** unlike that 
3af0: 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54  index from its T
3b00: 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65  able then remove
3b10: 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a   the index from.
3b20: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  ** the index has
3b30: 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65  h table and free
3b40: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75   all memory stru
3b50: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
3b60: 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  d.** with the in
3b70: 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  dex..*/.void sql
3b80: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
3b90: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  eteIndex(sqlite3
3ba0: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
3bb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e  onst char *zIdxN
3bc0: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
3bd0: 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20 2a 70  Index;.  Hash *p
3be0: 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28  Hash;..  assert(
3bf0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3c00: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3c10: 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d   0) );.  pHash =
3c20: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70   &db->aDb[iDb].p
3c30: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b  Schema->idxHash;
3c40: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
3c50: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  te3HashInsert(pH
3c60: 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30  ash, zIdxName, 0
3c70: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
3c80: 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69  pIndex) ){.    i
3c90: 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  f( pIndex->pTabl
3ca0: 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65  e->pIndex==pInde
3cb0: 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  x ){.      pInde
3cc0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
3cd0: 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  x = pIndex->pNex
3ce0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
3cf0: 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
3d00: 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61      /* Justifica
3d10: 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29  tion of ALWAYS()
3d20: 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d 75 73  ;  The index mus
3d30: 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69 73 74  t be on the list
3d40: 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64   of.      ** ind
3d50: 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ices. */.      p
3d60: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
3d70: 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  e->pIndex;.     
3d80: 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
3d90: 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70  ) && p->pNext!=p
3da0: 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e  Index ){ p = p->
3db0: 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20 20 69  pNext; }.      i
3dc0: 66 28 20 41 4c 57 41 59 53 28 70 20 26 26 20 70  f( ALWAYS(p && p
3dd0: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29  ->pNext==pIndex)
3de0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   ){.        p->p
3df0: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
3e00: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
3e10: 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65    }.    freeInde
3e20: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
3e30: 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c   }.  db->flags |
3e40: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
3e50: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
3e60: 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20 74 68   Look through th
3e70: 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20 64  e list of open d
3e80: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 69 6e  atabase files in
3e90: 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64 20 69   db->aDb[] and i
3ea0: 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20 62 65  f.** any have be
3eb0: 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d 6f 76  en closed, remov
3ec0: 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20  e them from the 
3ed0: 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63 61 74  list.  Reallocat
3ee0: 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61 44 62  e the.** db->aDb
3ef0: 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  [] structure to 
3f00: 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65 2c 20  a smaller size, 
3f10: 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a  if possible..**.
3f20: 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68 65 20  ** Entry 0 (the 
3f30: 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73 65 29  "main" database)
3f40: 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28 74 68   and entry 1 (th
3f50: 65 20 22 74 65 6d 70 22 20 64 61 74 61 62 61 73  e "temp" databas
3f60: 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65 72 20  e).** are never 
3f70: 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 62  candidates for b
3f80: 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64 2e 0a  eing collapsed..
3f90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
3fa0: 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41  ollapseDatabaseA
3fb0: 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62  rray(sqlite3 *db
3fc0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
3fd0: 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62   for(i=j=2; i<db
3fe0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
3ff0: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
4000: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
4010: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
4020: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
4030: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
4040: 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 3b 0a 20 20  b->zDbSName);.  
4050: 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d      pDb->zDbSNam
4060: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  e = 0;.      con
4070: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
4080: 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20   if( j<i ){.    
4090: 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64    db->aDb[j] = d
40a0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d  b->aDb[i];.    }
40b0: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
40c0: 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69  db->nDb = j;.  i
40d0: 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26  f( db->nDb<=2 &&
40e0: 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44   db->aDb!=db->aD
40f0: 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d  bStatic ){.    m
4100: 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61  emcpy(db->aDbSta
4110: 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a  tic, db->aDb, 2*
4120: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30  sizeof(db->aDb[0
4130: 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ]));.    sqlite3
4140: 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61  DbFree(db, db->a
4150: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
4160: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
4170: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
4180: 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20  eset the schema 
4190: 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
41a0: 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e 20 20   at index iDb.  
41b0: 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65 0a 2a  Also reset the.*
41c0: 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 0a 2a  * TEMP schema..*
41d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
41e0: 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c  setOneSchema(sql
41f0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
4200: 62 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20  b){.  Db *pDb;. 
4210: 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d   assert( iDb<db-
4220: 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  >nDb );..  /* Ca
4230: 73 65 20 31 3a 20 20 52 65 73 65 74 20 74 68 65  se 1:  Reset the
4240: 20 73 69 6e 67 6c 65 20 73 63 68 65 6d 61 20 69   single schema i
4250: 64 65 6e 74 69 66 69 65 64 20 62 79 20 69 44 62  dentified by iDb
4260: 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d   */.  pDb = &db-
4270: 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 61 73 73  >aDb[iDb];.  ass
4280: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
4290: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
42a0: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 61 73 73  iDb, 0) );.  ass
42b0: 65 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d  ert( pDb->pSchem
42c0: 61 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  a!=0 );.  sqlite
42d0: 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62  3SchemaClear(pDb
42e0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 20 20 2f  ->pSchema);..  /
42f0: 2a 20 49 66 20 61 6e 79 20 64 61 74 61 62 61 73  * If any databas
4300: 65 20 6f 74 68 65 72 20 74 68 61 6e 20 54 45 4d  e other than TEM
4310: 50 20 69 73 20 72 65 73 65 74 2c 20 74 68 65 6e  P is reset, then
4320: 20 61 6c 73 6f 20 72 65 73 65 74 20 54 45 4d 50   also reset TEMP
4330: 0a 20 20 2a 2a 20 73 69 6e 63 65 20 54 45 4d 50  .  ** since TEMP
4340: 20 6d 69 67 68 74 20 62 65 20 68 6f 6c 64 69 6e   might be holdin
4350: 67 20 74 72 69 67 67 65 72 73 20 74 68 61 74 20  g triggers that 
4360: 72 65 66 65 72 65 6e 63 65 20 74 61 62 6c 65 73  reference tables
4370: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68   in the.  ** oth
4380: 65 72 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  er database..  *
4390: 2f 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20 29  /.  if( iDb!=1 )
43a0: 7b 0a 20 20 20 20 70 44 62 20 3d 20 26 64 62 2d  {.    pDb = &db-
43b0: 3e 61 44 62 5b 31 5d 3b 0a 20 20 20 20 61 73 73  >aDb[1];.    ass
43c0: 65 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d  ert( pDb->pSchem
43d0: 61 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  a!=0 );.    sqli
43e0: 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70  te3SchemaClear(p
43f0: 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Db->pSchema);.  
4400: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }.  return;.}../
4410: 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73  *.** Erase all s
4420: 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f  chema informatio
4430: 6e 20 66 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63  n from all attac
4440: 68 65 64 20 64 61 74 61 62 61 73 65 73 20 28 69  hed databases (i
4450: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69  ncluding.** "mai
4460: 6e 22 20 61 6e 64 20 22 74 65 6d 70 22 29 20 66  n" and "temp") f
4470: 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
4480: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
4490: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
44a0: 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f  ResetAllSchemasO
44b0: 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69  fConnection(sqli
44c0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
44d0: 69 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  i;.  sqlite3Btre
44e0: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
44f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
4500: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  nDb; i++){.    D
4510: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
4520: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
4530: 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  b->pSchema ){.  
4540: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
4550: 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68  aClear(pDb->pSch
4560: 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ema);.    }.  }.
4570: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
4580: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
4590: 6e 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 56  nges;.  sqlite3V
45a0: 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62  tabUnlockList(db
45b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
45c0: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20  eLeaveAll(db);. 
45d0: 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65   sqlite3Collapse
45e0: 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62  DatabaseArray(db
45f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
4600: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4610: 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74  ed when a commit
4620: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
4630: 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
4640: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
4650: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62  lite3 *db){.  db
4660: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
4670: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
4680: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
4690: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
46a0: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ed for the colum
46b0: 6e 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62  n names of a tab
46c0: 6c 65 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a  le or view (the.
46d0: 2a 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20  ** Table.aCol[] 
46e0: 61 72 72 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20  array)..*/.void 
46f0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c  sqlite3DeleteCol
4700: 75 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65 33  umnNames(sqlite3
4710: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
4720: 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ble){.  int i;. 
4730: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
4740: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21   assert( pTable!
4750: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f  =0 );.  if( (pCo
4760: 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  l = pTable->aCol
4770: 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  )!=0 ){.    for(
4780: 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  i=0; i<pTable->n
4790: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
47a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
47b0: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
47c0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  >zName);.      s
47d0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
47e0: 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74  (db, pCol->pDflt
47f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4800: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
4810: 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  >zColl);.    }. 
4820: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4830: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f  (db, pTable->aCo
4840: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
4850: 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f   Remove the memo
4860: 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ry data structur
4870: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
4880: 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  th the given.** 
4890: 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67  Table.  No chang
48a0: 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64  es are made to d
48b0: 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74  isk by this rout
48c0: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ine..**.** This 
48d0: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c  routine just del
48e0: 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74  etes the data st
48f0: 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65  ructure.  It doe
4900: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20  s not unlink.** 
4910: 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73  the table data s
4920: 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
4930: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42  e hash table.  B
4940: 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72  ut it does destr
4950: 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72  oy.** memory str
4960: 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69  uctures of the i
4970: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
4980: 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74  gn keys associat
4990: 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20  ed with .** the 
49a0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
49b0: 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 69 73   db parameter is
49c0: 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69   optional.  It i
49d0: 73 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20  s needed if the 
49e0: 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a  Table object .**
49f0: 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73   contains lookas
4a00: 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61  ide memory.  (Ta
4a10: 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 74  ble objects in t
4a20: 68 65 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74  he schema do not
4a30: 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64   use.** lookasid
4a40: 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f  e memory, but so
4a50: 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 54 61 62  me ephemeral Tab
4a60: 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20  le objects do.) 
4a70: 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20 70 61   Or the.** db pa
4a80: 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20 75  rameter can be u
4a90: 73 65 64 20 77 69 74 68 20 64 62 2d 3e 70 6e 42  sed with db->pnB
4aa0: 79 74 65 73 46 72 65 65 64 20 74 6f 20 6d 65 61  ytesFreed to mea
4ab0: 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a  sure the memory.
4ac0: 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 54  ** used by the T
4ad0: 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  able object..*/.
4ae0: 73 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49  static void SQLI
4af0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 64 65 6c 65  TE_NOINLINE dele
4b00: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
4b10: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
4b20: 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  le){.  Index *pI
4b30: 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  ndex, *pNext;.  
4b40: 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 6e 4c  TESTONLY( int nL
4b50: 6f 6f 6b 61 73 69 64 65 3b 20 29 20 2f 2a 20 55  ookaside; ) /* U
4b60: 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 6c 6f  sed to verify lo
4b70: 6f 6b 61 73 69 64 65 20 6e 6f 74 20 75 73 65 64  okaside not used
4b80: 20 66 6f 72 20 73 63 68 65 6d 61 20 2a 2f 0a 0a   for schema */..
4b90: 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
4ba0: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  number of outsta
4bb0: 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20  nding lookaside 
4bc0: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20 73  allocations in s
4bd0: 63 68 65 6d 61 20 54 61 62 6c 65 73 0a 20 20 2a  chema Tables.  *
4be0: 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  * prior to doing
4bf0: 20 61 6e 79 20 66 72 65 65 28 29 20 6f 70 65 72   any free() oper
4c00: 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20 73  ations.  Since s
4c10: 63 68 65 6d 61 20 54 61 62 6c 65 73 20 64 6f 20  chema Tables do 
4c20: 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f  not use.  ** loo
4c30: 6b 61 73 69 64 65 2c 20 74 68 69 73 20 6e 75 6d  kaside, this num
4c40: 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63  ber should not c
4c50: 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 54 45 53 54  hange. */.  TEST
4c60: 4f 4e 4c 59 28 20 6e 4c 6f 6f 6b 61 73 69 64 65  ONLY( nLookaside
4c70: 20 3d 20 28 64 62 20 26 26 20 28 70 54 61 62 6c   = (db && (pTabl
4c80: 65 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  e->tabFlags & TF
4c90: 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 29 20  _Ephemeral)==0) 
4ca0: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
4cb0: 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6c             db->l
4cc0: 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 3a 20  ookaside.nOut : 
4cd0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  0 );..  /* Delet
4ce0: 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73  e all indices as
4cf0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
4d00: 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66  is table. */.  f
4d10: 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62  or(pIndex = pTab
4d20: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  le->pIndex; pInd
4d30: 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74  ex; pIndex=pNext
4d40: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
4d50: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
4d60: 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
4d70: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c  ->pSchema==pTabl
4d80: 65 2d 3e 70 53 63 68 65 6d 61 0a 20 20 20 20 20  e->pSchema.     
4d90: 20 20 20 20 7c 7c 20 28 49 73 56 69 72 74 75 61      || (IsVirtua
4da0: 6c 28 70 54 61 62 6c 65 29 20 26 26 20 70 49 6e  l(pTable) && pIn
4db0: 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51  dex->idxType!=SQ
4dc0: 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50  LITE_IDXTYPE_APP
4dd0: 44 45 46 29 20 29 3b 0a 20 20 20 20 69 66 28 20  DEF) );.    if( 
4de0: 28 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e  (db==0 || db->pn
4df0: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26  BytesFreed==0) &
4e00: 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  & !IsVirtual(pTa
4e10: 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68  ble) ){.      ch
4e20: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64  ar *zName = pInd
4e30: 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20  ex->zName; .    
4e40: 20 20 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64    TESTONLY ( Ind
4e50: 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c  ex *pOld = ) sql
4e60: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 0a  ite3HashInsert(.
4e70: 20 20 20 20 20 20 20 20 20 26 70 49 6e 64 65 78           &pIndex
4e80: 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
4e90: 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20  sh, zName, 0.   
4ea0: 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
4eb0: 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c  rt( db==0 || sql
4ec0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
4ed0: 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65  eld(db, 0, pInde
4ee0: 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  x->pSchema) );. 
4ef0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c       assert( pOl
4f00: 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c  d==pIndex || pOl
4f10: 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  d==0 );.    }.  
4f20: 20 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20    freeIndex(db, 
4f30: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20  pIndex);.  }..  
4f40: 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 66 6f  /* Delete any fo
4f50: 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74 61 63  reign keys attac
4f60: 68 65 64 20 74 6f 20 74 68 69 73 20 74 61 62 6c  hed to this tabl
4f70: 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46  e. */.  sqlite3F
4f80: 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62  kDelete(db, pTab
4f90: 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  le);..  /* Delet
4fa0: 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
4fb0: 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20  cture itself..  
4fc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  */.  sqlite3Dele
4fd0: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62  teColumnNames(db
4fe0: 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c  , pTable);.  sql
4ff0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5000: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Table->zName);. 
5010: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5020: 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41  b, pTable->zColA
5030: 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ff);.  sqlite3Se
5040: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
5050: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b  Table->pSelect);
5060: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
5070: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  stDelete(db, pTa
5080: 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 69  ble->pCheck);.#i
5090: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
50a0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
50b0: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61   sqlite3VtabClea
50c0: 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 23  r(db, pTable);.#
50d0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44  endif.  sqlite3D
50e0: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
50f0: 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
5100: 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69 64  that no lookasid
5110: 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75 73 65  e memory was use
5120: 64 20 62 79 20 73 63 68 65 6d 61 20 74 61 62 6c  d by schema tabl
5130: 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
5140: 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c 7c  nLookaside==0 ||
5150: 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 64 62 2d   nLookaside==db-
5160: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20  >lookaside.nOut 
5170: 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
5180: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  3DeleteTable(sql
5190: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
51a0: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 2f 2a 20 44  *pTable){.  /* D
51b0: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
51c0: 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65   table until the
51d0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
51e0: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a   reaches zero. *
51f0: 2f 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 20  /.  if( !pTable 
5200: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5210: 28 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42  ((!db || db->pnB
5220: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26  ytesFreed==0) &&
5230: 20 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 54 61 62   (--pTable->nTab
5240: 52 65 66 29 3e 30 29 20 29 20 72 65 74 75 72 6e  Ref)>0) ) return
5250: 3b 0a 20 20 64 65 6c 65 74 65 54 61 62 6c 65 28  ;.  deleteTable(
5260: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a  db, pTable);.}..
5270: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68  ./*.** Unlink th
5280: 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72  e given table fr
5290: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
52a0: 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74  es and the delet
52b0: 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73  e the.** table s
52c0: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c  tructure with al
52d0: 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e  l its indices an
52e0: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a  d foreign keys..
52f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55  */.void sqlite3U
5300: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61  nlinkAndDeleteTa
5310: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
5320: 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20   int iDb, const 
5330: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b  char *zTabName){
5340: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44  .  Table *p;.  D
5350: 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72  b *pDb;..  asser
5360: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
5370: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
5380: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
5390: 20 61 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d   assert( zTabNam
53a0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
53b0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
53c0: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
53d0: 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
53e0: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20   zTabName[0]==0 
53f0: 29 3b 20 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67  );  /* Zero-leng
5400: 74 68 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 61  th table names a
5410: 72 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20  re allowed */.  
5420: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
5430: 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  Db];.  p = sqlit
5440: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44  e3HashInsert(&pD
5450: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
5460: 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 30  ash, zTabName, 0
5470: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  );.  sqlite3Dele
5480: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a  teTable(db, p);.
5490: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
54a0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
54b0: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  ges;.}../*.** Gi
54c0: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74  ven a token, ret
54d0: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
54e0: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  t consists of th
54f0: 65 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a  e text of that.*
5500: 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20  * token.  Space 
5510: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
5520: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
5530: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
5540: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
5550: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
5560: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
5570: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  ** function..**.
5580: 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e  ** Any quotation
5590: 20 6d 61 72 6b 73 20 28 65 78 3a 20 20 22 6e 61   marks (ex:  "na
55a0: 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61  me", 'name', [na
55b0: 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20  me], or `name`) 
55c0: 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64  that.** surround
55d0: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
55e0: 20 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76   token are remov
55f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73  ed..**.** Tokens
5600: 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74 20   are often just 
5610: 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68  pointers into th
5620: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74  e original SQL t
5630: 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72  ext and so.** ar
5640: 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69  e not \000 termi
5650: 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f  nated and are no
5660: 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54  t persistent.  T
5670: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
5680: 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65  ng.** is \000 te
5690: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20  rminated and is 
56a0: 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63  persistent..*/.c
56b0: 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65  har *sqlite3Name
56c0: 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65  FromToken(sqlite
56d0: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
56e0: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
56f0: 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  ame;.  if( pName
5700: 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
5710: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
5720: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d  (db, (char*)pNam
5730: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
5740: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
5750: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  ote(zName);.  }e
5760: 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  lse{.    zName =
5770: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5780: 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zName;.}../*.**
5790: 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65   Open the sqlite
57a0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74  _master table st
57b0: 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65  ored in database
57c0: 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a   number iDb for.
57d0: 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20  ** writing. The 
57e0: 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  table is opened 
57f0: 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a  using cursor 0..
5800: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f  */.void sqlite3O
5810: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50  penMasterTable(P
5820: 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62  arse *p, int iDb
5830: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
5840: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29  qlite3GetVdbe(p)
5850: 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  ;.  sqlite3Table
5860: 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53  Lock(p, iDb, MAS
5870: 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53  TER_ROOT, 1, MAS
5880: 54 45 52 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c  TER_NAME);.  sql
5890: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
58a0: 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  t(v, OP_OpenWrit
58b0: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
58c0: 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66  T, iDb, 5);.  if
58d0: 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a  ( p->nTab==0 ){.
58e0: 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b      p->nTab = 1;
58f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  .  }.}../*.** Pa
5900: 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f  rameter zName po
5910: 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65  ints to a nul-te
5920: 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72 20  rminated buffer 
5930: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
5940: 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61  ame.** of a data
5950: 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  base ("main", "t
5960: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
5970: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
5980: 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  db). This.** fun
5990: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
59a0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
59b0: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
59c0: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a   db->aDb[], or.*
59d0: 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  * -1 if the name
59e0: 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66  d db cannot be f
59f0: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
5a00: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73  ite3FindDbName(s
5a10: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
5a20: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
5a30: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20    int i = -1;   
5a40: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
5a50: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66  e number */.  if
5a60: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44  ( zName ){.    D
5a70: 62 20 2a 70 44 62 3b 0a 20 20 20 20 66 6f 72 28  b *pDb;.    for(
5a80: 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70  i=(db->nDb-1), p
5a90: 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20  Db=&db->aDb[i]; 
5aa0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d  i>=0; i--, pDb--
5ab0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
5ac0: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
5ad0: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a  pDb->zDbSName, z
5ae0: 4e 61 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20  Name) ) break;. 
5af0: 20 20 20 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69       /* "main" i
5b00: 73 20 61 6c 77 61 79 73 20 61 6e 20 61 63 63 65  s always an acce
5b10: 70 74 61 62 6c 65 20 61 6c 69 61 73 20 66 6f 72  ptable alias for
5b20: 20 74 68 65 20 70 72 69 6d 61 72 79 20 64 61 74   the primary dat
5b30: 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 65  abase.      ** e
5b40: 76 65 6e 20 69 66 20 69 74 20 68 61 73 20 62 65  ven if it has be
5b50: 65 6e 20 72 65 6e 61 6d 65 64 20 75 73 69 6e 67  en renamed using
5b60: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
5b70: 5f 4d 41 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a  _MAINDBNAME. */.
5b80: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20 26        if( i==0 &
5b90: 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  & 0==sqlite3_str
5ba0: 69 63 6d 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61  icmp("main", zNa
5bb0: 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  me) ) break;.   
5bc0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5bd0: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  i;.}../*.** The 
5be0: 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e  token *pName con
5bf0: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
5c00: 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69  f a database (ei
5c10: 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a  ther "main" or.*
5c20: 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  * "temp" or the 
5c30: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
5c40: 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f  hed db). This ro
5c50: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
5c60: 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68  e.** index of th
5c70: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
5c80: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
5c90: 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  r -1 if the name
5ca0: 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d db .** does no
5cb0: 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  t exist..*/.int 
5cc0: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71  sqlite3FindDb(sq
5cd0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e  lite3 *db, Token
5ce0: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *pName){.  int 
5cf0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d10: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
5d20: 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ber */.  char *z
5d30: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5d50: 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61   Name we are sea
5d60: 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  rching for */.  
5d70: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
5d80: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
5d90: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73   pName);.  i = s
5da0: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
5db0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73  (db, zName);.  s
5dc0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5dd0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
5de0: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74  n i;.}../* The t
5df0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20  able or view or 
5e00: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20  trigger name is 
5e10: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
5e20: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
5e30: 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20  s.** pName1 and 
5e40: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
5e50: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
5e60: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
5e70: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
5e80: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
5e90: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a  xx.yyy (...);.**
5ea0: 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31   .** Then pName1
5eb0: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
5ec0: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
5ed0: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
5ee0: 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74  hand if.** the t
5ef0: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
5f00: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5f10: 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52  , i.e.:.**.** CR
5f20: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
5f30: 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ..);.**.** Then 
5f40: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
5f50: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
5f60: 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54  2 is ""..**.** T
5f70: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
5f80: 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70   the *ppUnqual p
5f90: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
5fa0: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
5fb0: 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65  ame1 or.** pName
5fc0: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
5fd0: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
5fe0: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
5ff0: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
6000: 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69  database "xxx" i
6010: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
6020: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
6030: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
6040: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
6050: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
6060: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
6070: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
6080: 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20  pName1,      /* 
6090: 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65  The "xxx" in the
60a0: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
60b0: 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f  or "xxx" */.  To
60c0: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
60d0: 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69    /* The "yyy" i
60e0: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
60f0: 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  yyy" */.  Token 
6100: 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a  **pUnqual     /*
6110: 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61   Write the unqua
6120: 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61  lified object na
6130: 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  me here */.){.  
6140: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
6150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
6160: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
6170: 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
6180: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
6190: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73  arse->db;..  ass
61a0: 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 29  ert( pName2!=0 )
61b0: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e  ;.  if( pName2->
61c0: 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  n>0 ){.    if( d
61d0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b  b->init.busy ) {
61e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
61f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6200: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
6210: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
6220: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a   -1;.    }.    *
6230: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32  pUnqual = pName2
6240: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
6250: 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e  te3FindDb(db, pN
6260: 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69  ame1);.    if( i
6270: 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  Db<0 ){.      sq
6280: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6290: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64  arse, "unknown d
62a0: 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61  atabase %T", pNa
62b0: 6d 65 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75  me1);.      retu
62c0: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn -1;.    }.  }
62d0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
62e0: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
62f0: 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75  0 || db->init.bu
6300: 73 79 20 7c 7c 20 28 64 62 2d 3e 66 6c 61 67 73  sy || (db->flags
6310: 20 26 20 53 51 4c 49 54 45 5f 56 61 63 75 75 6d   & SQLITE_Vacuum
6320: 29 21 3d 30 29 3b 0a 20 20 20 20 69 44 62 20 3d  )!=0);.    iDb =
6330: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20   db->init.iDb;. 
6340: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
6350: 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame1;.  }.  retu
6360: 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn iDb;.}../*.**
6370: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
6380: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69   used to check i
6390: 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72 69  f the UTF-8 stri
63a0: 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65  ng zName is a le
63b0: 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69  gal.** unqualifi
63c0: 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65  ed name for a ne
63d0: 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  w schema object 
63e0: 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76  (table, index, v
63f0: 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65  iew or.** trigge
6400: 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72  r). All names ar
6410: 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74  e legal except t
6420: 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e 20  hose that begin 
6430: 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a  with the string.
6440: 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e  ** "sqlite_" (in
6450: 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72   upper, lower or
6460: 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54 68   mixed case). Th
6470: 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  is portion of th
6480: 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  e namespace.** i
6490: 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  s reserved for i
64a0: 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a  nternal use..*/.
64b0: 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
64c0: 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65  ObjectName(Parse
64d0: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
64e0: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
64f0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d  if( !pParse->db-
6500: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50  >init.busy && pP
6510: 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
6520: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70  .          && (p
6530: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
6540: 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53   & SQLITE_WriteS
6550: 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20  chema)==0.      
6560: 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
6570: 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c  3StrNICmp(zName,
6580: 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29   "sqlite_", 7) )
6590: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
65a0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
65b0: 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72  bject name reser
65c0: 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ved for internal
65d0: 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65   use: %s", zName
65e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
65f0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
6600: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6610: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
6620: 75 72 6e 20 74 68 65 20 50 52 49 4d 41 52 59 20  urn the PRIMARY 
6630: 4b 45 59 20 69 6e 64 65 78 20 6f 66 20 61 20 74  KEY index of a t
6640: 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  able.*/.Index *s
6650: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
6660: 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61  Index(Table *pTa
6670: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 0a  b){.  Index *p;.
6680: 20 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70 49    for(p=pTab->pI
6690: 6e 64 65 78 3b 20 70 20 26 26 20 21 49 73 50 72  ndex; p && !IsPr
66a0: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 29  imaryKeyIndex(p)
66b0: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a  ; p=p->pNext){}.
66c0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
66d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
66e0: 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
66f0: 70 49 64 78 20 74 68 61 74 20 63 6f 72 72 65 73  pIdx that corres
6700: 70 6f 6e 64 73 20 74 6f 20 74 61 62 6c 65 0a 2a  ponds to table.*
6710: 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20  * column iCol.  
6720: 52 65 74 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74  Return -1 if not
6730: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73   found..*/.i16 s
6740: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
6750: 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78 2c  dex(Index *pIdx,
6760: 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e   i16 iCol){.  in
6770: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
6780: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
6790: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
67a0: 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  Col==pIdx->aiCol
67b0: 75 6d 6e 5b 69 5d 20 29 20 72 65 74 75 72 6e 20  umn[i] ) return 
67c0: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
67d0: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  -1;.}../*.** Beg
67e0: 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20  in constructing 
67f0: 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72  a new table repr
6800: 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65  esentation in me
6810: 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a  mory.  This is.*
6820: 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73  * the first of s
6830: 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f  everal action ro
6840: 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20  utines that get 
6850: 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e  called in respon
6860: 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54  se.** to a CREAT
6870: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
6880: 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61  t.  In particula
6890: 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  r, this routine 
68a0: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74  is called.** aft
68b0: 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73  er seeing tokens
68c0: 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54   "CREATE" and "T
68d0: 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61  ABLE" and the ta
68e0: 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73  ble name. The is
68f0: 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20  Temp.** flag is 
6900: 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c  true if the tabl
6910: 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
6920: 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69  ed in the auxili
6930: 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ary database.** 
6940: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
6950: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
6960: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
6970: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65   is normally the
6980: 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68   case.** when th
6990: 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d  e "TEMP" or "TEM
69a0: 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20  PORARY" keyword 
69b0: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
69c0: 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20  n.** CREATE and 
69d0: 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TABLE..**.** The
69e0: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
69f0: 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  d is initialized
6a00: 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72   and put in pPar
6a10: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a  se->pNewTable..*
6a20: 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65  * As more of the
6a30: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
6a40: 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
6a50: 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63  d, additional ac
6a60: 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73  tion.** routines
6a70: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
6a80: 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f  to add more info
6a90: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
6aa0: 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68  record..** At th
6ab0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
6ac0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
6ad0: 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33  ent, the sqlite3
6ae0: 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69  EndTable() routi
6af0: 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
6b00: 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
6b10: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20  construction of 
6b20: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65  the new table re
6b30: 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  cord..*/.void sq
6b40: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
6b50: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6b60: 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f  ,   /* Parser co
6b70: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
6b80: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46   *pName1,   /* F
6b90: 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65  irst part of the
6ba0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
6bb0: 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  le or view */.  
6bc0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
6bd0: 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
6be0: 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  of the name of t
6bf0: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
6c00: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
6c10: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
6c20: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
6c30: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
6c40: 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20  isView,      /* 
6c50: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
6c60: 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20  a VIEW */.  int 
6c70: 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20  isVirtual,   /* 
6c80: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
6c90: 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65 20  a VIRTUAL table 
6ca0: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20  */.  int noErr  
6cb0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
6cc0: 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72  ing if table alr
6cd0: 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
6ce0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  {.  Table *pTabl
6cf0: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  e;.  char *zName
6d00: 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d   = 0; /* The nam
6d10: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
6d20: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  le */.  sqlite3 
6d30: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
6d40: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
6d50: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
6d60: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
6d70: 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
6d80: 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54   table in */.  T
6d90: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20  oken *pName;    
6da0: 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
6db0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
6dc0: 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20   to create */.. 
6dd0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
6de0: 73 79 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e  sy && db->init.n
6df0: 65 77 54 6e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20  ewTnum==1 ){.   
6e00: 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
6e10: 3a 20 20 50 61 72 73 69 6e 67 20 74 68 65 20 73  :  Parsing the s
6e20: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 6f 72 20  qlite_master or 
6e30: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
6e40: 65 72 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20  er schema */.   
6e50: 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e   iDb = db->init.
6e60: 69 44 62 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  iDb;.    zName =
6e70: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
6e80: 28 64 62 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  (db, SCHEMA_TABL
6e90: 45 28 69 44 62 29 29 3b 0a 20 20 20 20 70 4e 61  E(iDb));.    pNa
6ea0: 6d 65 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d  me = pName1;.  }
6eb0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
6ec0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
6ed0: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
6ee0: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
6ef0: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
6f00: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
6f10: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
6f20: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 21 4f  turn;.    if( !O
6f30: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
6f40: 54 65 6d 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e  Temp && pName2->
6f50: 6e 3e 30 20 26 26 20 69 44 62 21 3d 31 20 29 7b  n>0 && iDb!=1 ){
6f60: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 63 72 65  .      /* If cre
6f70: 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62  ating a temp tab
6f80: 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79  le, the name may
6f90: 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65   not be qualifie
6fa0: 64 2e 20 55 6e 6c 65 73 73 20 0a 20 20 20 20 20  d. Unless .     
6fb0: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
6fc0: 20 6e 61 6d 65 20 69 73 20 22 74 65 6d 70 22 20   name is "temp" 
6fd0: 61 6e 79 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20  anyway.  */.    
6fe0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6ff0: 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f  g(pParse, "tempo
7000: 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20  rary table name 
7010: 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66  must be unqualif
7020: 69 65 64 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ied");.      ret
7030: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
7040: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
7050: 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62 20  && isTemp ) iDb 
7060: 3d 20 31 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  = 1;.    zName =
7070: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
7080: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
7090: 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
70a0: 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e  sNameToken = *pN
70b0: 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ame;.  if( zName
70c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
70d0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
70e0: 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
70f0: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
7100: 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ame) ){.    goto
7110: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
7120: 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  or;.  }.  if( db
7130: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20  ->init.iDb==1 ) 
7140: 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e  isTemp = 1;.#ifn
7150: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7160: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
7170: 61 73 73 65 72 74 28 20 69 73 54 65 6d 70 3d 3d  assert( isTemp==
7180: 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d 31 20 29  0 || isTemp==1 )
7190: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 56 69  ;.  assert( isVi
71a0: 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d  ew==0 || isView=
71b0: 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20 20 73 74  =1 );.  {.    st
71c0: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 43  atic const u8 aC
71d0: 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ode[] = {.      
71e0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
71f0: 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 4c  ABLE,.       SQL
7200: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
7210: 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51  TABLE,.       SQ
7220: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
7230: 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,.       SQLITE_
7240: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
7250: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68 61 72  .    };.    char
7260: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
7270: 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
7280: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
7290: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
72a0: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
72b0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65  CHEMA_TABLE(isTe
72c0: 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  mp), 0, zDb) ){.
72d0: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
72e0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
72f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56    }.    if( !isV
7300: 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65  irtual && sqlite
7310: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
7320: 65 2c 20 28 69 6e 74 29 61 43 6f 64 65 5b 69 73  e, (int)aCode[is
7330: 54 65 6d 70 2b 32 2a 69 73 56 69 65 77 5d 2c 0a  Temp+2*isView],.
7340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7360: 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 2c         zName, 0,
7370: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
7380: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7390: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  error;.    }.  }
73a0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61  .#endif..  /* Ma
73b0: 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20  ke sure the new 
73c0: 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20  table name does 
73d0: 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  not collide with
73e0: 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a   an existing.  *
73f0: 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
7400: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d   name in the sam
7410: 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73 73  e database.  Iss
7420: 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ue an error mess
7430: 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64  age if.  ** it d
7440: 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70 74 69  oes. The excepti
7450: 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73 74 61  on is if the sta
7460: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72  tement being par
7470: 73 65 64 20 77 61 73 20 70 61 73 73 65 64 0a 20  sed was passed. 
7480: 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65   ** to an sqlite
7490: 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29  3_declare_vtab()
74a0: 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63   call. In that c
74b0: 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c  ase only the col
74c0: 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61  umn names.  ** a
74d0: 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65  nd types will be
74e0: 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20   used, so there 
74f0: 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65  is no need to te
7500: 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65  st for namespace
7510: 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73  .  ** collisions
7520: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e  ..  */.  if( !IN
7530: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b  _DECLARE_VTAB ){
7540: 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  .    char *zDb =
7550: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
7560: 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  bSName;.    if( 
7570: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
7580: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
7590: 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  rse) ){.      go
75a0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
75b0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
75c0: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  pTable = sqlite3
75d0: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
75e0: 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69  ame, zDb);.    i
75f0: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
7600: 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b     if( !noErr ){
7610: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7620: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7630: 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61   "table %T alrea
7640: 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d  dy exists", pNam
7650: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
7660: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7670: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
7680: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
7690: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
76a0: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
76b0: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
76c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
76d0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
76e0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ror;.    }.    i
76f0: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
7700: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  dex(db, zName, z
7710: 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Db)!=0 ){.      
7720: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7730: 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
7740: 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64  s already an ind
7750: 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  ex named %s", zN
7760: 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
7770: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
7780: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  or;.    }.  }.. 
7790: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
77a0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
77b0: 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
77c0: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ;.  if( pTable==
77d0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
77e0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
77f0: 64 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  d );.    pParse-
7800: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
7810: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 70 50 61  EM_BKPT;.    pPa
7820: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
7830: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
7840: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
7850: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
7860: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
7870: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
7880: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20  able->pSchema = 
7890: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
78a0: 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  hema;.  pTable->
78b0: 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 70  nTabRef = 1;.  p
78c0: 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73  Table->nRowLogEs
78d0: 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
78e0: 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
78f0: 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
7900: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
7910: 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29  ->pNewTable==0 )
7920: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  ;.  pParse->pNew
7930: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
7940: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
7950: 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74   the magic sqlit
7960: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
7970: 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63   used by autoinc
7980: 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65  rement,.  ** the
7990: 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74  n record a point
79a0: 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  er to this table
79b0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
79c0: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a  abase structure.
79d0: 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53    ** so that INS
79e0: 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65  ERT can find the
79f0: 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20   table easily.. 
7a00: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
7a10: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
7a20: 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61  EMENT.  if( !pPa
7a30: 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73  rse->nested && s
7a40: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  trcmp(zName, "sq
7a50: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d  lite_sequence")=
7a60: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
7a70: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
7a80: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
7a90: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 54 61 62  , 0) );.    pTab
7aa0: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  le->pSchema->pSe
7ab0: 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20  qTab = pTable;. 
7ac0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
7ad0: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
7ae0: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77   the code that w
7af0: 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74  ill insert the t
7b00: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  able record into
7b10: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  .  ** the SQLITE
7b20: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
7b30: 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c  Note in particul
7b40: 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20  ar that we must 
7b50: 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e  go ahead.  ** an
7b60: 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  d allocate the r
7b70: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
7b80: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
7b90: 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e   now.  Before an
7ba0: 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  y.  ** PRIMARY K
7bb0: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79  EY or UNIQUE key
7bc0: 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64  words are parsed
7bd0: 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64  .  Those keyword
7be0: 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a  s will cause.  *
7bf0: 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20  * indices to be 
7c00: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
7c10: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73  table record mus
7c20: 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68  t come before th
7c30: 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  e .  ** indices.
7c40: 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63    Hence, the rec
7c50: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
7c60: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
7c70: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
7c80: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
7c90: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
7ca0: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
7cb0: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
7cc0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  0 ){.    int add
7cd0: 72 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65  r1;.    int file
7ce0: 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20  Format;.    int 
7cf0: 72 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67 33  reg1, reg2, reg3
7d00: 3b 0a 20 20 20 20 2f 2a 20 6e 75 6c 6c 52 6f 77  ;.    /* nullRow
7d10: 5b 5d 20 69 73 20 61 6e 20 4f 50 5f 52 65 63 6f  [] is an OP_Reco
7d20: 72 64 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61  rd encoding of a
7d30: 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
7d40: 35 20 4e 55 4c 4c 73 20 2a 2f 0a 20 20 20 20 73  5 NULLs */.    s
7d50: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
7d60: 20 6e 75 6c 6c 52 6f 77 5b 5d 20 3d 20 7b 20 36   nullRow[] = { 6
7d70: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20  , 0, 0, 0, 0, 0 
7d80: 7d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  };.    sqlite3Be
7d90: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
7da0: 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
7db0: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
7dc0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7dd0: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56  ABLE.    if( isV
7de0: 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20  irtual ){.      
7df0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7e00: 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b  0(v, OP_VBegin);
7e10: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
7e20: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
7e30: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63  e format and enc
7e40: 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74  oding in the dat
7e50: 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62  abase have not b
7e60: 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a  een set, .    **
7e70: 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20   set them now.. 
7e80: 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d     */.    reg1 =
7e90: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
7ea0: 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
7eb0: 65 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70  em;.    reg2 = p
7ec0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d  Parse->regRoot =
7ed0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
7ee0: 0a 20 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50  .    reg3 = ++pP
7ef0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
7f00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7f10: 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b  3(v, OP_ReadCook
7f20: 69 65 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 42  ie, iDb, reg3, B
7f30: 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  TREE_FILE_FORMAT
7f40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7f50: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
7f60: 44 62 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d  Db);.    addr1 =
7f70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7f80: 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p1(v, OP_If, reg
7f90: 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  3); VdbeCoverage
7fa0: 28 76 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72  (v);.    fileFor
7fb0: 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mat = (db->flags
7fc0: 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79   & SQLITE_Legacy
7fd0: 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20  FileFmt)!=0 ?.  
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ff0: 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  1 : SQLITE_MAX_F
8000: 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20  ILE_FORMAT;.    
8010: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8020: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
8030: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49  e, iDb, BTREE_FI
8040: 4c 45 5f 46 4f 52 4d 41 54 2c 20 66 69 6c 65 46  LE_FORMAT, fileF
8050: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69  ormat);.    sqli
8060: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8070: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
8080: 44 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f 45  Db, BTREE_TEXT_E
8090: 4e 43 4f 44 49 4e 47 2c 20 45 4e 43 28 64 62 29  NCODING, ENC(db)
80a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
80b0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
80c0: 64 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  dr1);..    /* Th
80d0: 69 73 20 6a 75 73 74 20 63 72 65 61 74 65 73 20  is just creates 
80e0: 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72  a place-holder r
80f0: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c  ecord in the sql
8100: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
8110: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  ..    ** The rec
8120: 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f 65 73  ord created does
8130: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79   not contain any
8140: 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77  thing yet.  It w
8150: 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a  ill be replaced.
8160: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65      ** by the re
8170: 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65  al entry in code
8180: 20 67 65 6e 65 72 61 74 65 64 20 61 74 20 73 71   generated at sq
8190: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e  lite3EndTable().
81a0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
81b0: 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
81c0: 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65   new entry is le
81d0: 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 70  ft in register p
81e0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 2e  Parse->regRowid.
81f0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f 74  .    ** The root
8200: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
8210: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 69 73  the new table is
8220: 20 6c 65 66 74 20 69 6e 20 72 65 67 20 70 50 61   left in reg pPa
8230: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20  rse->regRoot..  
8240: 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 61    ** The rowid a
8250: 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  nd root page num
8260: 62 65 72 20 76 61 6c 75 65 73 20 61 72 65 20 6e  ber values are n
8270: 65 65 64 65 64 20 62 79 20 74 68 65 20 63 6f 64  eeded by the cod
8280: 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 73 71  e that.    ** sq
8290: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69  lite3EndTable wi
82a0: 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20  ll generate..   
82b0: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
82c0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
82d0: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
82e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
82f0: 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28  ALTABLE).    if(
8300: 20 69 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72   isView || isVir
8310: 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  tual ){.      sq
8320: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8330: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
8340: 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c  , reg2);.    }el
8350: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
8360: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 64        pParse->ad
8370: 64 72 43 72 54 61 62 20 3d 20 73 71 6c 69 74 65  drCrTab = sqlite
8380: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8390: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 69  P_CreateTable, i
83a0: 44 62 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d  Db, reg2);.    }
83b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
83c0: 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61 72  MasterTable(pPar
83d0: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  se, iDb);.    sq
83e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
83f0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
8400: 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71  0, reg1);.    sq
8410: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
8420: 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c 20 72  v, OP_Blob, 6, r
8430: 65 67 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f 77 2c  eg3, 0, nullRow,
8440: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
8450: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8460: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
8470: 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b   0, reg3, reg1);
8480: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8490: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
84a0: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
84b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
84c0: 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a  0(v, OP_Close);.
84d0: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
84e0: 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74   (non-error) ret
84f0: 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  urn. */.  return
8500: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
8510: 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a  ror occurs, we j
8520: 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69  ump here */.begi
8530: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20  n_table_error:. 
8540: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8550: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
8560: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74 20 70  urn;.}../* Set p
8570: 72 6f 70 65 72 74 69 65 73 20 6f 66 20 61 20 74  roperties of a t
8580: 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 62 61 73 65  able column base
8590: 64 20 6f 6e 20 74 68 65 20 28 6d 61 67 69 63 61  d on the (magica
85a0: 6c 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68  l).** name of th
85b0: 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23 69 66  e column..*/.#if
85c0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 48   SQLITE_ENABLE_H
85d0: 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a 76 6f  IDDEN_COLUMNS.vo
85e0: 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  id sqlite3Column
85f0: 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61  PropertiesFromNa
8600: 6d 65 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  me(Table *pTab, 
8610: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 20  Column *pCol){. 
8620: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
8630: 6e 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  nicmp(pCol->zNam
8640: 65 2c 20 22 5f 5f 68 69 64 64 65 6e 5f 5f 22 2c  e, "__hidden__",
8650: 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70   10)==0 ){.    p
8660: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col->colFlags |=
8670: 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 3b   COLFLAG_HIDDEN;
8680: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61  .  }else if( pTa
8690: 62 20 26 26 20 70 43 6f 6c 21 3d 70 54 61 62 2d  b && pCol!=pTab-
86a0: 3e 61 43 6f 6c 20 26 26 20 28 70 43 6f 6c 5b 2d  >aCol && (pCol[-
86b0: 31 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f  1].colFlags & CO
86c0: 4c 46 4c 41 47 5f 48 49 44 44 45 4e 29 20 29 7b  LFLAG_HIDDEN) ){
86d0: 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
86e0: 61 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48 69 64  ags |= TF_OOOHid
86f0: 64 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  den;.  }.}.#endi
8700: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  f.../*.** Add a 
8710: 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68  new column to th
8720: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
8730: 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
8740: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
8750: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
8760: 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f   routine once fo
8770: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65  r each column de
8780: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  claration.** in 
8790: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
87a0: 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74  tatement.  sqlit
87b0: 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20 67  e3StartTable() g
87c0: 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69  ets called.** fi
87d0: 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67  rst to get thing
87e0: 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74  s going.  Then t
87f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
8800: 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a  alled for each.*
8810: 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69  * column..*/.voi
8820: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
8830: 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mn(Parse *pParse
8840: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20  , Token *pName, 
8850: 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20  Token *pType){. 
8860: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
8870: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   i;.  char *z;. 
8880: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20   char *zType;.  
8890: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
88a0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
88b0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
88c0: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
88d0: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
88e0: 75 72 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  urn;.#if SQLITE_
88f0: 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28  MAX_COLUMN.  if(
8900: 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61   p->nCol+1>db->a
8910: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
8920: 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
8930: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8940: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
8950: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25  any columns on %
8960: 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  s", p->zName);. 
8970: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
8980: 65 6e 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c 69  endif.  z = sqli
8990: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
89a0: 62 2c 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 70 54  b, pName->n + pT
89b0: 79 70 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20 20 69  ype->n + 2);.  i
89c0: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
89d0: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e  ;.  memcpy(z, pN
89e0: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
89f0: 29 3b 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d  );.  z[pName->n]
8a00: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
8a10: 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72  equote(z);.  for
8a20: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
8a30: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
8a40: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
8a50: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  , p->aCol[i].zNa
8a60: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
8a70: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8a80: 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61  pParse, "duplica
8a90: 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  te column name: 
8aa0: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73  %s", z);.      s
8ab0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8ac0: 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   z);.      retur
8ad0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  n;.    }.  }.  i
8ae0: 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78  f( (p->nCol & 0x
8af0: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c  7)==0 ){.    Col
8b00: 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61  umn *aNew;.    a
8b10: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
8b20: 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f  ealloc(db,p->aCo
8b30: 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69  l,(p->nCol+8)*si
8b40: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
8b50: 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d  );.    if( aNew=
8b60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
8b70: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
8b80: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
8b90: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f      }.    p->aCo
8ba0: 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20  l = aNew;.  }.  
8bb0: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
8bc0: 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73  p->nCol];.  mems
8bd0: 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65  et(pCol, 0, size
8be0: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
8bf0: 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d  .  pCol->zName =
8c00: 20 7a 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c   z;.  sqlite3Col
8c10: 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f  umnPropertiesFro
8c20: 6d 4e 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a  mName(p, pCol);.
8c30: 20 0a 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e   .  if( pType->n
8c40: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
8c50: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70   there is no typ
8c60: 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c  e specified, col
8c70: 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64 65  umns have the de
8c80: 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20  fault affinity. 
8c90: 20 20 20 2a 2a 20 27 42 4c 4f 42 27 2e 20 2a 2f     ** 'BLOB'. */
8ca0: 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
8cb0: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
8cc0: 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 2d  _BLOB;.    pCol-
8cd0: 3e 73 7a 45 73 74 20 3d 20 31 3b 0a 20 20 7d 65  >szEst = 1;.  }e
8ce0: 6c 73 65 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  lse{.    zType =
8cf0: 20 7a 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c   z + sqlite3Strl
8d00: 65 6e 33 30 28 7a 29 20 2b 20 31 3b 0a 20 20 20  en30(z) + 1;.   
8d10: 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c 20 70   memcpy(zType, p
8d20: 54 79 70 65 2d 3e 7a 2c 20 70 54 79 70 65 2d 3e  Type->z, pType->
8d30: 6e 29 3b 0a 20 20 20 20 7a 54 79 70 65 5b 70 54  n);.    zType[pT
8d40: 79 70 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20  ype->n] = 0;.   
8d50: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
8d60: 7a 54 79 70 65 29 3b 0a 20 20 20 20 70 43 6f 6c  zType);.    pCol
8d70: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
8d80: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
8d90: 28 7a 54 79 70 65 2c 20 26 70 43 6f 6c 2d 3e 73  (zType, &pCol->s
8da0: 7a 45 73 74 29 3b 0a 20 20 20 20 70 43 6f 6c 2d  zEst);.    pCol-
8db0: 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  >colFlags |= COL
8dc0: 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20 20  FLAG_HASTYPE;.  
8dd0: 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 20  }.  p->nCol++;. 
8de0: 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61   pParse->constra
8df0: 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b 0a 7d  intName.n = 0;.}
8e00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8e10: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
8e20: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
8e30: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
8e40: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
8e50: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
8e60: 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54  atement.  A "NOT
8e70: 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e   NULL" constrain
8e80: 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65  t has.** been se
8e90: 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20  en on a column. 
8ea0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
8eb0: 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66  ts the notNull f
8ec0: 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f  lag on.** the co
8ed0: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
8ee0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
8ef0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
8f00: 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72  e3AddNotNull(Par
8f10: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
8f20: 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c  onError){.  Tabl
8f30: 65 20 2a 70 3b 0a 20 20 70 20 3d 20 70 50 61 72  e *p;.  p = pPar
8f40: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
8f50: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56   if( p==0 || NEV
8f60: 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20  ER(p->nCol<1) ) 
8f70: 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 61 43 6f  return;.  p->aCo
8f80: 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74  l[p->nCol-1].not
8f90: 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72  Null = (u8)onErr
8fa0: 6f 72 3b 0a 20 20 70 2d 3e 74 61 62 46 6c 61 67  or;.  p->tabFlag
8fb0: 73 20 7c 3d 20 54 46 5f 48 61 73 4e 6f 74 4e 75  s |= TF_HasNotNu
8fc0: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61  ll;.}../*.** Sca
8fd0: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  n the column typ
8fe0: 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65  e name zType (le
8ff0: 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20  ngth nType) and 
9000: 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73  return the.** as
9010: 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69 74  sociated affinit
9020: 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  y type..**.** Th
9030: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
9040: 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65  a case-independe
9050: 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79  nt search of zTy
9060: 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73  pe for the .** s
9070: 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65  ubstrings in the
9080: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
9090: 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  . If one of the 
90a0: 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a  substrings is.**
90b0: 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72   found, the corr
90c0: 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69  esponding affini
90d0: 74 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ty is returned. 
90e0: 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e  If zType contain
90f0: 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s.** more than o
9100: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
9110: 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f  ings, entries to
9120: 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20  ward the top of 
9130: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61  .** the table ta
9140: 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72  ke priority. For
9150: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79   example, if zTy
9160: 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c  pe is 'BLOBINT',
9170: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f   .** SQLITE_AFF_
9180: 49 4e 54 45 47 45 52 20 69 73 20 72 65 74 75 72  INTEGER is retur
9190: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74  ned..**.** Subst
91a0: 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e  ring     | Affin
91b0: 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ity.** ---------
91c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91d0: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27  -------.** 'INT'
91e0: 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
91f0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a  E_AFF_INTEGER.**
9200: 20 27 43 48 41 52 27 20 20 20 20 20 20 20 20 7c   'CHAR'        |
9210: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
9220: 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20  .** 'CLOB'      
9230: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
9240: 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20  EXT.** 'TEXT'   
9250: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
9260: 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27  F_TEXT.** 'BLOB'
9270: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
9280: 5f 41 46 46 5f 42 4c 4f 42 0a 2a 2a 20 27 52 45  _AFF_BLOB.** 'RE
9290: 41 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  AL'        | SQL
92a0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20  ITE_AFF_REAL.** 
92b0: 27 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20  'FLOA'        | 
92c0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
92d0: 2a 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20 20  ** 'DOUB'       
92e0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
92f0: 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65  AL.**.** If none
9300: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
9310: 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  gs in the above 
9320: 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c  table are found,
9330: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  .** SQLITE_AFF_N
9340: 55 4d 45 52 49 43 20 69 73 20 72 65 74 75 72 6e  UMERIC is return
9350: 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  ed..*/.char sqli
9360: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
9370: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c  const char *zIn,
9380: 20 75 38 20 2a 70 73 7a 45 73 74 29 7b 0a 20 20   u8 *pszEst){.  
9390: 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61  u32 h = 0;.  cha
93a0: 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41  r aff = SQLITE_A
93b0: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f  FF_NUMERIC;.  co
93c0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72 20  nst char *zChar 
93d0: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
93e0: 7a 49 6e 21 3d 30 20 29 3b 0a 20 20 77 68 69 6c  zIn!=0 );.  whil
93f0: 65 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20  e( zIn[0] ){.   
9400: 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71   h = (h<<8) + sq
9410: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
9420: 72 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a  r[(*zIn)&0xff];.
9430: 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69      zIn++;.    i
9440: 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29  f( h==(('c'<<24)
9450: 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c  +('h'<<16)+('a'<
9460: 3c 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20  <8)+'r') ){     
9470: 20 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20          /* CHAR 
9480: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
9490: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
94a0: 20 20 20 20 20 20 7a 43 68 61 72 20 3d 20 7a 49        zChar = zI
94b0: 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  n;.    }else if(
94c0: 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28   h==(('c'<<24)+(
94d0: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
94e0: 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20  )+'b') ){       
94f0: 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20  /* CLOB */.     
9500: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9510: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
9520: 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c  e if( h==(('t'<<
9530: 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27  24)+('e'<<16)+('
9540: 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20  x'<<8)+'t') ){  
9550: 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a       /* TEXT */.
9560: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9570: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
9580: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
9590: 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'b'<<24)+('l'<<1
95a0: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29  6)+('o'<<8)+'b')
95b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f            /* BLO
95c0: 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  B */.        && 
95d0: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
95e0: 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d  _NUMERIC || aff=
95f0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
9600: 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  ) ){.      aff =
9610: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
9620: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 5b  ;.      if( zIn[
9630: 30 5d 3d 3d 27 28 27 20 29 20 7a 43 68 61 72 20  0]=='(' ) zChar 
9640: 3d 20 7a 49 6e 3b 0a 23 69 66 6e 64 65 66 20 53  = zIn;.#ifndef S
9650: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
9660: 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65  ING_POINT.    }e
9670: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27  lse if( h==(('r'
9680: 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b  <<24)+('e'<<16)+
9690: 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20  ('a'<<8)+'l')   
96a0: 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a         /* REAL *
96b0: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
96c0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
96d0: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
96e0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
96f0: 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EAL;.    }else i
9700: 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29  f( h==(('f'<<24)
9710: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
9720: 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20  <8)+'a')        
9730: 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20    /* FLOA */.   
9740: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
9750: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9760: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
9770: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
9780: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9790: 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27  =(('d'<<24)+('o'
97a0: 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27  <<16)+('u'<<8)+'
97b0: 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b')          /* 
97c0: 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20  DOUB */.        
97d0: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
97e0: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
97f0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9800: 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69  _AFF_REAL;.#endi
9810: 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  f.    }else if( 
9820: 28 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d  (h&0x00FFFFFF)==
9830: 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c  (('i'<<16)+('n'<
9840: 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f  <8)+'t') ){    /
9850: 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61  * INT */.      a
9860: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9870: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62  INTEGER;.      b
9880: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
9890: 0a 20 20 2f 2a 20 49 66 20 70 73 7a 45 73 74 20  .  /* If pszEst 
98a0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f  is not NULL, sto
98b0: 72 65 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  re an estimate o
98c0: 66 20 74 68 65 20 66 69 65 6c 64 20 73 69 7a 65  f the field size
98d0: 2e 20 20 54 68 65 0a 20 20 2a 2a 20 65 73 74 69  .  The.  ** esti
98e0: 6d 61 74 65 20 69 73 20 73 63 61 6c 65 64 20 73  mate is scaled s
98f0: 6f 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  o that the size 
9900: 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 69 73  of an integer is
9910: 20 31 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 73   1.  */.  if( ps
9920: 7a 45 73 74 20 29 7b 0a 20 20 20 20 2a 70 73 7a  zEst ){.    *psz
9930: 45 73 74 20 3d 20 31 3b 20 20 20 2f 2a 20 64 65  Est = 1;   /* de
9940: 66 61 75 6c 74 20 73 69 7a 65 20 69 73 20 61 70  fault size is ap
9950: 70 72 6f 78 20 34 20 62 79 74 65 73 20 2a 2f 0a  prox 4 bytes */.
9960: 20 20 20 20 69 66 28 20 61 66 66 3c 53 51 4c 49      if( aff<SQLI
9970: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
9980: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 68 61  {.      if( zCha
9990: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  r ){.        whi
99a0: 6c 65 28 20 7a 43 68 61 72 5b 30 5d 20 29 7b 0a  le( zChar[0] ){.
99b0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
99c0: 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 43 68  lite3Isdigit(zCh
99d0: 61 72 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  ar[0]) ){.      
99e0: 20 20 20 20 20 20 69 6e 74 20 76 20 3d 20 30 3b        int v = 0;
99f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
9a00: 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 43 68  ite3GetInt32(zCh
9a10: 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20  ar, &v);.       
9a20: 20 20 20 20 20 76 20 3d 20 76 2f 34 20 2b 20 31       v = v/4 + 1
9a30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
9a40: 28 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32 35  ( v>255 ) v = 25
9a50: 35 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  5;.            *
9a60: 70 73 7a 45 73 74 20 3d 20 76 3b 20 2f 2a 20 42  pszEst = v; /* B
9a70: 4c 4f 42 28 6b 29 2c 20 56 41 52 43 48 41 52 28  LOB(k), VARCHAR(
9a80: 6b 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20 72  k), CHAR(k) -> r
9a90: 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20  =(k/4+1) */.    
9aa0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9ab0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9ac0: 20 20 20 20 20 7a 43 68 61 72 2b 2b 3b 0a 20 20       zChar++;.  
9ad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
9ae0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 73  lse{.        *ps
9af0: 7a 45 73 74 20 3d 20 35 3b 20 20 20 2f 2a 20 42  zEst = 5;   /* B
9b00: 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f 42 20  LOB, TEXT, CLOB 
9b10: 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f 78 20  -> r=5  (approx 
9b20: 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20 20 20  20 bytes)*/.    
9b30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9b40: 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f  return aff;.}../
9b50: 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73  *.** The express
9b60: 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ion is the defau
9b70: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
9b80: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
9b90: 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f  dded column.** o
9ba0: 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  f the table curr
9bb0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
9bc0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
9bd0: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78  Default value ex
9be0: 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62  pressions must b
9bf0: 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69  e constant.  Rai
9c00: 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  se an exception 
9c10: 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f  if this.** is no
9c20: 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a  t the case..**.*
9c30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9c40: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
9c50: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
9c60: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
9c70: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
9c80: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
9c90: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
9ca0: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
9cb0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
9cc0: 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e   ExprSpan *pSpan
9cd0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
9ce0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
9cf0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9d00: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d  Parse->db;.  p =
9d10: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9d20: 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29  le;.  if( p!=0 )
9d30: 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70  {.    pCol = &(p
9d40: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
9d50: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c  ]);.    if( !sql
9d60: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
9d70: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 53 70  ntOrFunction(pSp
9d80: 61 6e 2d 3e 70 45 78 70 72 2c 20 64 62 2d 3e 69  an->pExpr, db->i
9d90: 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20  nit.busy) ){.   
9da0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9db0: 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61  sg(pParse, "defa
9dc0: 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c  ult value of col
9dd0: 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20  umn [%s] is not 
9de0: 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20  constant",.     
9df0: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65       pCol->zName
9e00: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9e10: 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
9e20: 20 70 45 78 70 72 20 69 73 20 75 73 65 64 20 69   pExpr is used i
9e30: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 6f 72  nstead of the or
9e40: 69 67 69 6e 61 6c 2c 20 61 73 20 70 45 78 70 72  iginal, as pExpr
9e50: 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
9e60: 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 70  ** tokens that p
9e70: 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c 65  oint to volatile
9e80: 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27 73 70   memory. The 'sp
9e90: 61 6e 27 20 6f 66 20 74 68 65 20 65 78 70 72 65  an' of the expre
9ea0: 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ssion.      ** i
9eb0: 73 20 72 65 71 75 69 72 65 64 20 62 79 20 70 72  s required by pr
9ec0: 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66 6f 2e  agma table_info.
9ed0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9ee0: 45 78 70 72 20 78 3b 0a 20 20 20 20 20 20 73 71  Expr x;.      sq
9ef0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
9f00: 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29  db, pCol->pDflt)
9f10: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
9f20: 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29  x, 0, sizeof(x))
9f30: 3b 0a 20 20 20 20 20 20 78 2e 6f 70 20 3d 20 54  ;.      x.op = T
9f40: 4b 5f 53 50 41 4e 3b 0a 20 20 20 20 20 20 78 2e  K_SPAN;.      x.
9f50: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74  u.zToken = sqlit
9f60: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
9f70: 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53  (char*)pSpan->zS
9f80: 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20  tart,.          
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fa0: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
9fb0: 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53  pSpan->zEnd - pS
9fc0: 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20  pan->zStart));. 
9fd0: 20 20 20 20 20 78 2e 70 4c 65 66 74 20 3d 20 70       x.pLeft = p
9fe0: 53 70 61 6e 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Span->pExpr;.   
9ff0: 20 20 20 78 2e 66 6c 61 67 73 20 3d 20 45 50 5f     x.flags = EP_
a000: 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 43 6f 6c  Skip;.      pCol
a010: 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65  ->pDflt = sqlite
a020: 33 45 78 70 72 44 75 70 28 64 62 2c 20 26 78 2c  3ExprDup(db, &x,
a030: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
a040: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
a050: 62 46 72 65 65 28 64 62 2c 20 78 2e 75 2e 7a 54  bFree(db, x.u.zT
a060: 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  oken);.    }.  }
a070: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
a080: 6c 65 74 65 28 64 62 2c 20 70 53 70 61 6e 2d 3e  lete(db, pSpan->
a090: 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
a0a0: 20 42 61 63 6b 77 61 72 64 73 20 43 6f 6d 70 61   Backwards Compa
a0b0: 74 69 62 69 6c 69 74 79 20 48 61 63 6b 3a 0a 2a  tibility Hack:.*
a0c0: 2a 20 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c  * .** Historical
a0d0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
a0e0: 69 74 65 20 61 63 63 65 70 74 65 64 20 73 74 72  ite accepted str
a0f0: 69 6e 67 73 20 61 73 20 63 6f 6c 75 6d 6e 20 6e  ings as column n
a100: 61 6d 65 73 20 69 6e 0a 2a 2a 20 69 6e 64 65 78  ames in.** index
a110: 65 73 20 61 6e 64 20 50 52 49 4d 41 52 59 20 4b  es and PRIMARY K
a120: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  EY constraints a
a130: 6e 64 20 69 6e 20 55 4e 49 51 55 45 20 63 6f 6e  nd in UNIQUE con
a140: 73 74 72 61 69 6e 74 73 2e 20 20 45 78 61 6d 70  straints.  Examp
a150: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52  le:.**.**     CR
a160: 45 41 54 45 20 54 41 42 4c 45 20 78 79 7a 28 61  EATE TABLE xyz(a
a170: 2c 62 2c 63 2c 64 2c 65 2c 50 52 49 4d 41 52 59  ,b,c,d,e,PRIMARY
a180: 20 4b 45 59 28 27 61 27 29 2c 55 4e 49 51 55 45   KEY('a'),UNIQUE
a190: 28 27 62 27 2c 27 63 27 20 43 4f 4c 4c 41 54 45  ('b','c' COLLATE
a1a0: 20 74 72 69 6d 29 0a 2a 2a 20 20 20 20 20 43 52   trim).**     CR
a1b0: 45 41 54 45 20 49 4e 44 45 58 20 61 62 63 20 4f  EATE INDEX abc O
a1c0: 4e 20 78 79 7a 28 27 63 27 2c 27 64 27 20 44 45  N xyz('c','d' DE
a1d0: 53 43 2c 27 65 27 20 43 4f 4c 4c 41 54 45 20 6e  SC,'e' COLLATE n
a1e0: 6f 63 61 73 65 20 44 45 53 43 29 3b 0a 2a 2a 0a  ocase DESC);.**.
a1f0: 2a 2a 20 54 68 69 73 20 69 73 20 67 6f 6f 66 79  ** This is goofy
a200: 2e 20 20 42 75 74 20 74 6f 20 70 72 65 73 65 72  .  But to preser
a210: 76 65 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  ve backwards com
a220: 70 61 74 69 62 69 6c 69 74 79 20 77 65 20 63 6f  patibility we co
a230: 6e 74 69 6e 75 65 20 74 6f 0a 2a 2a 20 61 63 63  ntinue to.** acc
a240: 65 70 74 20 69 74 2e 20 20 54 68 69 73 20 72 6f  ept it.  This ro
a250: 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 6e  utine does the n
a260: 65 63 65 73 73 61 72 79 20 63 6f 6e 76 65 72 73  ecessary convers
a270: 69 6f 6e 2e 20 20 49 74 20 63 6f 6e 76 65 72 74  ion.  It convert
a280: 73 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73  s.** the express
a290: 69 6f 6e 20 67 69 76 65 6e 20 69 6e 20 69 74 73  ion given in its
a2a0: 20 61 72 67 75 6d 65 6e 74 20 66 72 6f 6d 20 61   argument from a
a2b0: 20 54 4b 5f 53 54 52 49 4e 47 20 69 6e 74 6f 20   TK_STRING into 
a2c0: 61 20 54 4b 5f 49 44 0a 2a 2a 20 69 66 20 74 68  a TK_ID.** if th
a2d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
a2e0: 6a 75 73 74 20 61 20 54 4b 5f 53 54 52 49 4e 47  just a TK_STRING
a2f0: 20 77 69 74 68 20 61 6e 20 6f 70 74 69 6f 6e 61   with an optiona
a300: 6c 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65  l COLLATE clause
a310: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 70 78 72  ..** If the epxr
a320: 65 73 73 69 6f 6e 20 69 73 20 61 6e 79 74 68 69  ession is anythi
a330: 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 54 4b  ng other than TK
a340: 5f 53 54 52 49 4e 47 2c 20 74 68 65 20 65 78 70  _STRING, the exp
a350: 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 75 6e  ression is.** un
a360: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74  changed..*/.stat
a370: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
a380: 74 72 69 6e 67 54 6f 49 64 28 45 78 70 72 20 2a  tringToId(Expr *
a390: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d  p){.  if( p->op=
a3a0: 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20  =TK_STRING ){.  
a3b0: 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b    p->op = TK_ID;
a3c0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
a3d0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26  op==TK_COLLATE &
a3e0: 26 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  & p->pLeft->op==
a3f0: 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20  TK_STRING ){.   
a400: 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20 3d 20   p->pLeft->op = 
a410: 54 4b 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TK_ID;.  }.}../*
a420: 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68  .** Designate th
a430: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f  e PRIMARY KEY fo
a440: 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c  r the table.  pL
a450: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
a460: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f   names .** of co
a470: 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  lumns that form 
a480: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
a490: 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55    If pList is NU
a4a0: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  LL, then the.** 
a4b0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
a4c0: 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ded column of th
a4d0: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70  e table is the p
a4e0: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a  rimary key..**.*
a4f0: 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61  * A table can ha
a500: 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70  ve at most one p
a510: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
a520: 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
a530: 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61  y has.** a prima
a540: 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73  ry key (and this
a550: 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   is the second p
a560: 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e  rimary key) then
a570: 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72   create an.** er
a580: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
a590: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
a5a0: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   on a single col
a5b0: 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79  umn whose dataty
a5c0: 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a  pe is INTEGER,.*
a5d0: 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74  * then we will t
a5e0: 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ry to use that c
a5f0: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77  olumn as the row
a600: 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61 62  id.  Set the Tab
a610: 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c  le.iPKey.** fiel
a620: 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75  d of the table u
a630: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
a640: 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65  n to be the inde
a650: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45  x of the.** INTE
a660: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
a670: 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69  column.  Table.i
a680: 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d  PKey is set to -
a690: 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  1 if there is.**
a6a0: 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d   no INTEGER PRIM
a6b0: 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49  ARY KEY..**.** I
a6c0: 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74  f the key is not
a6d0: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
a6e0: 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72  ARY KEY, then cr
a6f0: 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a  eate a unique.**
a700: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b   index for the k
a710: 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73  ey.  No index is
a720: 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54   created for INT
a730: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
a740: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
a750: 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  e3AddPrimaryKey(
a760: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a770: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
a780: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
a790: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f  rList *pList,  /
a7a0: 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20  * List of field 
a7b0: 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65  names to be inde
a7c0: 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
a7d0: 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68  rror,      /* Wh
a7e0: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20  at to do with a 
a7f0: 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c  uniqueness confl
a800: 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74  ict */.  int aut
a810: 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72  oInc,      /* Tr
a820: 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e  ue if the AUTOIN
a830: 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20  CREMENT keyword 
a840: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
a850: 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20  int sortOrder   
a860: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41    /* SQLITE_SO_A
a870: 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f  SC or SQLITE_SO_
a880: 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  DESC */.){.  Tab
a890: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
a8a0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
a8b0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30  Column *pCol = 0
a8c0: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d  ;.  int iCol = -
a8d0: 31 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65 72  1, i;.  int nTer
a8e0: 6d 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  m;.  if( pTab==0
a8f0: 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f   ) goto primary_
a900: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20  key_exit;.  if( 
a910: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
a920: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
a930: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
a940: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a950: 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c   .      "table \
a960: 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74  "%s\" has more t
a970: 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  han one primary 
a980: 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  key", pTab->zNam
a990: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69  e);.    goto pri
a9a0: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
a9b0: 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c   }.  pTab->tabFl
a9c0: 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 50 72 69  ags |= TF_HasPri
a9d0: 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66 28 20 70  maryKey;.  if( p
a9e0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  List==0 ){.    i
a9f0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  Col = pTab->nCol
aa00: 20 2d 20 31 3b 0a 20 20 20 20 70 43 6f 6c 20 3d   - 1;.    pCol =
aa10: 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
aa20: 6c 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f  l];.    pCol->co
aa30: 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
aa40: 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 6e  G_PRIMKEY;.    n
aa50: 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  Term = 1;.  }els
aa60: 65 7b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 70  e{.    nTerm = p
aa70: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
aa80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72   for(i=0; i<nTer
aa90: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  m; i++){.      E
aaa0: 78 70 72 20 2a 70 43 45 78 70 72 20 3d 20 73 71  xpr *pCExpr = sq
aab0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
aac0: 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  late(pList->a[i]
aad0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 61  .pExpr);.      a
aae0: 73 73 65 72 74 28 20 70 43 45 78 70 72 21 3d 30  ssert( pCExpr!=0
aaf0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
ab00: 33 53 74 72 69 6e 67 54 6f 49 64 28 70 43 45 78  3StringToId(pCEx
ab10: 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
ab20: 43 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  CExpr->op==TK_ID
ab30: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
ab40: 74 20 63 68 61 72 20 2a 7a 43 4e 61 6d 65 20 3d  t char *zCName =
ab50: 20 70 43 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65   pCExpr->u.zToke
ab60: 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  n;.        for(i
ab70: 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62  Col=0; iCol<pTab
ab80: 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  ->nCol; iCol++){
ab90: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
aba0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43  qlite3StrICmp(zC
abb0: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
abc0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  [iCol].zName)==0
abd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
abe0: 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
abf0: 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  ol[iCol];.      
ac00: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46        pCol->colF
ac10: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
ac20: 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20  PRIMKEY;.       
ac30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ac40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ac50: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
ac60: 20 20 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d 3d    }.  if( nTerm=
ac70: 3d 31 0a 20 20 20 26 26 20 70 43 6f 6c 0a 20 20  =1.   && pCol.  
ac80: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
ac90: 6d 70 28 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  mp(sqlite3Column
aca0: 54 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c 20 22  Type(pCol,""), "
acb0: 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20  INTEGER")==0.   
acc0: 26 26 20 73 6f 72 74 4f 72 64 65 72 21 3d 53 51  && sortOrder!=SQ
acd0: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 0a 20 20 29  LITE_SO_DESC.  )
ace0: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  {.    pTab->iPKe
acf0: 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54  y = iCol;.    pT
ad00: 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75  ab->keyConf = (u
ad10: 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61  8)onError;.    a
ad20: 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d  ssert( autoInc==
ad30: 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20  0 || autoInc==1 
ad40: 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  );.    pTab->tab
ad50: 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63  Flags |= autoInc
ad60: 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e  *TF_Autoincremen
ad70: 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  t;.    if( pList
ad80: 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f   ) pParse->iPkSo
ad90: 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 2d  rtOrder = pList-
ada0: 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[0].sortOrder;
adb0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74  .  }else if( aut
adc0: 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20  oInc ){.#ifndef 
add0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
ade0: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71  INCREMENT.    sq
adf0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ae00: 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45  arse, "AUTOINCRE
ae10: 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c  MENT is only all
ae20: 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20  owed on an ".   
ae30: 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49      "INTEGER PRI
ae40: 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64  MARY KEY");.#end
ae50: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
ae60: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
ae70: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
ae80: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
ae90: 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  or, 0,.         
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aeb0: 20 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20    0, sortOrder, 
aec0: 30 2c 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50  0, SQLITE_IDXTYP
aed0: 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20  E_PRIMARYKEY);. 
aee0: 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20     pList = 0;.  
aef0: 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  }..primary_key_e
af00: 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  xit:.  sqlite3Ex
af10: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
af20: 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b  rse->db, pList);
af30: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
af40: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43 48  .** Add a new CH
af50: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  ECK constraint t
af60: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
af70: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
af80: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
af90: 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65 63  d sqlite3AddChec
afa0: 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  kConstraint(.  P
afb0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
afc0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
afd0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
afe0: 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54 68  CheckExpr  /* Th
aff0: 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73 69  e check expressi
b000: 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  on */.){.#ifndef
b010: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
b020: 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  CK.  Table *pTab
b030: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
b040: 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  able;.  sqlite3 
b050: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
b060: 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26 20  ;.  if( pTab && 
b070: 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42  !IN_DECLARE_VTAB
b080: 0a 20 20 20 26 26 20 21 73 71 6c 69 74 65 33 42  .   && !sqlite3B
b090: 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 64  treeIsReadonly(d
b0a0: 62 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e 69 74 2e  b->aDb[db->init.
b0b0: 69 44 62 5d 2e 70 42 74 29 0a 20 20 29 7b 0a 20  iDb].pBt).  ){. 
b0c0: 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20     pTab->pCheck 
b0d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
b0e0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
b0f0: 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43  pTab->pCheck, pC
b100: 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20 20 69  heckExpr);.    i
b110: 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74  f( pParse->const
b120: 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20  raintName.n ){. 
b130: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b140: 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72  ListSetName(pPar
b150: 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  se, pTab->pCheck
b160: 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74  , &pParse->const
b170: 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20  raintName, 1);. 
b180: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e     }.  }else.#en
b190: 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  dif.  {.    sqli
b1a0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
b1b0: 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b  arse->db, pCheck
b1c0: 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Expr);.  }.}../*
b1d0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c  .** Set the coll
b1e0: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f  ation function o
b1f0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
b200: 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c 65  tly parsed table
b210: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68   column.** to th
b220: 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e  e CollSeq given.
b230: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b240: 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50  AddCollateType(P
b250: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
b260: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
b270: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
b280: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  i;.  char *zColl
b290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b2a0: 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20  * Dequoted name 
b2b0: 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  of collation seq
b2c0: 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74  uence */.  sqlit
b2d0: 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28  e3 *db;..  if( (
b2e0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
b2f0: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
b300: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
b310: 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  l-1;.  db = pPar
b320: 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20  se->db;.  zColl 
b330: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
b340: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65  mToken(db, pToke
b350: 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c  n);.  if( !zColl
b360: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
b370: 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  ( sqlite3LocateC
b380: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
b390: 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64  Coll) ){.    Ind
b3a0: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 73 71  ex *pIdx;.    sq
b3b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
b3c0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c  p->aCol[i].zColl
b3d0: 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69  );.    p->aCol[i
b3e0: 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b  ].zColl = zColl;
b3f0: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
b400: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c  e column is decl
b410: 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20  ared as "<name> 
b420: 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c  PRIMARY KEY COLL
b430: 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20  ATE <type>",.   
b440: 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65   ** then an inde
b450: 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  x may have been 
b460: 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20  created on this 
b470: 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68  column before th
b480: 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  e.    ** collati
b490: 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 65  on type was adde
b4a0: 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 20  d. Correct this 
b4b0: 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61 73  if it is the cas
b4c0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
b4d0: 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78  r(pIdx=p->pIndex
b4e0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
b4f0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
b500: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
b510: 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20  KeyCol==1 );.   
b520: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
b530: 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20  olumn[0]==i ){. 
b540: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
b550: 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c  oll[0] = p->aCol
b560: 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [i].zColl;.     
b570: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
b580: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
b590: 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
b5a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
b5b0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
b5c0: 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ns the collation
b5d0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61   sequence for da
b5e0: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74 65  tabase native te
b5f0: 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69  xt.** encoding i
b600: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
b610: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c   string zName, l
b620: 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a  ength nName..**.
b630: 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
b640: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ted collation se
b650: 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76  quence is not av
b660: 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20  ailable, or not 
b670: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20  available.** in 
b680: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 74  the database nat
b690: 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ive encoding, th
b6a0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
b6b0: 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ory is invoked t
b6c0: 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e  o.** request it.
b6d0: 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   If the collatio
b6e0: 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e  n factory does n
b6f0: 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20 61  ot supply such a
b700: 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e   sequence,.** an
b710: 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 69  d the sequence i
b720: 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61  s available in a
b730: 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f  nother text enco
b740: 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20  ding, then that 
b750: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69  is.** returned i
b760: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
b770: 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   no versions of 
b780: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
b790: 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63  llations sequenc
b7a0: 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c  e are available,
b7b0: 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65   or.** another e
b7c0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
b7d0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
b7e0: 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
b7f0: 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  ge written into.
b800: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a  ** pParse..**.**
b810: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
b820: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
b830: 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  d sqlite3FindCol
b840: 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72 6f  lSeq().  This ro
b850: 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73  utine.** invokes
b860: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
b870: 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e 61  actory if the na
b880: 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61  med collation ca
b890: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a  nnot be found.**
b8a0: 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20 61   and generates a
b8b0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  n error message.
b8c0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
b8d0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
b8e0: 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47 65  Seq(), sqlite3Ge
b8f0: 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f  tCollSeq().*/.Co
b900: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f  llSeq *sqlite3Lo
b910: 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73  cateCollSeq(Pars
b920: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
b930: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
b940: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b950: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20  Parse->db;.  u8 
b960: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
b970: 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64   u8 initbusy = d
b980: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20  b->init.busy;.  
b990: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
b9a0: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
b9b0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
b9c0: 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e  , enc, zName, in
b9d0: 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21  itbusy);.  if( !
b9e0: 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70 43  initbusy && (!pC
b9f0: 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78  oll || !pColl->x
ba00: 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c  Cmp) ){.    pCol
ba10: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f  l = sqlite3GetCo
ba20: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 65 6e  llSeq(pParse, en
ba30: 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29  c, pColl, zName)
ba40: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
ba50: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pColl;.}.../*.**
ba60: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
ba70: 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65  hat will increme
ba80: 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  nt the schema co
ba90: 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  okie..**.** The 
baa0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
bab0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
bac0: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
bad0: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
bae0: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
baf0: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
bb00: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
bb10: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
bb20: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
bb30: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
bb40: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
bb50: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
bb60: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
bb70: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
bb80: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
bb90: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
bba0: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
bbb0: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
bbc0: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
bbd0: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
bbe0: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
bbf0: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
bc00: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
bc10: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
bc20: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
bc30: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
bc40: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
bc50: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
bc60: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
bc70: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
bc80: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
bc90: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
bca0: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
bcb0: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
bcc0: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
bcd0: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
bce0: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
bcf0: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
bd00: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
bd10: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
bd20: 20 65 6e 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 49   enough..**.** I
bd30: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
bd40: 3a 20 52 2d 33 34 32 33 30 2d 35 36 30 34 39 20  : R-34230-56049 
bd50: 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74 69 63  SQLite automatic
bd60: 61 6c 6c 79 20 69 6e 63 72 65 6d 65 6e 74 73 0a  ally increments.
bd70: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65  ** the schema-ve
bd80: 72 73 69 6f 6e 20 77 68 65 6e 65 76 65 72 20 74  rsion whenever t
bd90: 68 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  he schema change
bda0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
bdb0: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50  e3ChangeCookie(P
bdc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
bdd0: 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65  t iDb){.  sqlite
bde0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
bdf0: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  db;.  Vdbe *v = 
be00: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
be10: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
be20: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
be30: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
be40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
be50: 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
be60: 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 53  ie, iDb, BTREE_S
be70: 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 0a  CHEMA_VERSION, .
be80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be90: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
bea0: 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
beb0: 5f 63 6f 6f 6b 69 65 2b 31 29 3b 0a 7d 0a 0a 2f  _cookie+1);.}../
bec0: 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65  *.** Measure the
bed0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
bee0: 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20  cters needed to 
bef0: 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  output the given
bf00: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20  .** identifier. 
bf10: 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   The number retu
bf20: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e  rned includes an
bf30: 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a  y quotes used.**
bf40: 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e   but does not in
bf50: 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74  clude the null t
bf60: 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  erminator..**.**
bf70: 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73   The estimate is
bf80: 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20   conservative.  
bf90: 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  It might be larg
bfa0: 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a  er that what is.
bfb0: 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64  ** really needed
bfc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bfd0: 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73  identLength(cons
bfe0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
bff0: 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20  t n;.  for(n=0; 
c000: 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20  *z; n++, z++){. 
c010: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29     if( *z=='"' )
c020: 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72  { n++; }.  }.  r
c030: 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a  eturn n + 2;.}..
c040: 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
c050: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
c060: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74  ointer to an out
c070: 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 65 20  put buffer. The 
c080: 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d  second .** param
c090: 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
c0a0: 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  r to an integer 
c0b0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
c0c0: 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77  e offset at.** w
c0d0: 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e  hich to write in
c0e0: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
c0f0: 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  ffer. This funct
c100: 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a  ion copies the.*
c110: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * nul-terminated
c120: 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20   string pointed 
c130: 74 6f 20 62 79 20 74 68 65 20 74 68 69 72 64 20  to by the third 
c140: 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e  parameter, zSign
c150: 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74  edIdent,.** to t
c160: 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 66 66  he specified off
c170: 73 65 74 20 69 6e 20 74 68 65 20 62 75 66 66 65  set in the buffe
c180: 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70  r and updates *p
c190: 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20  Idx to refer.** 
c1a0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
c1b0: 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  e after the last
c1c0: 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 62 65   byte written be
c1d0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
c1e0: 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74  ** .** If the st
c1f0: 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e  ring zSignedIden
c200: 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  t consists entir
c210: 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d  ely of alpha-num
c220: 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65  eric.** characte
c230: 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  rs, does not beg
c240: 69 6e 20 77 69 74 68 20 61 20 64 69 67 69 74 20  in with a digit 
c250: 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51  and is not an SQ
c260: 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68  L keyword,.** th
c270: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
c280: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
c290: 66 66 65 72 20 65 78 61 63 74 6c 79 20 61 73 20  ffer exactly as 
c2a0: 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65  it is. Otherwise
c2b0: 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65  ,.** it is quote
c2c0: 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71  d using double-q
c2d0: 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  uotes..*/.static
c2e0: 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63   void identPut(c
c2f0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64  har *z, int *pId
c300: 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64  x, char *zSigned
c310: 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e  Ident){.  unsign
c320: 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20  ed char *zIdent 
c330: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
c340: 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a  *)zSignedIdent;.
c350: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64    int i, j, need
c360: 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49  Quote;.  i = *pI
c370: 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  dx;..  for(j=0; 
c380: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
c390: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
c3a0: 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b  3Isalnum(zIdent[
c3b0: 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d  j]) && zIdent[j]
c3c0: 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20  !='_' ) break;. 
c3d0: 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d   }.  needQuote =
c3e0: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
c3f0: 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20  zIdent[0]).     
c400: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
c410: 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64  3KeywordCode(zId
c420: 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20  ent, j)!=TK_ID. 
c430: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 7a 49             || zI
c440: 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20  dent[j]!=0.     
c450: 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a         || j==0;.
c460: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
c470: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
c480: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
c490: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
c4a0: 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74   z[i++] = zIdent
c4b0: 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64  [j];.    if( zId
c4c0: 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b  ent[j]=='"' ) z[
c4d0: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a  i++] = '"';.  }.
c4e0: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
c4f0: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
c500: 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70    z[i] = 0;.  *p
c510: 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  Idx = i;.}../*.*
c520: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45  * Generate a CRE
c530: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
c540: 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20  ent appropriate 
c550: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
c560: 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20   table.  Memory 
c570: 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74  to hold the text
c580: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
c590: 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  t is obtained.**
c5a0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
c5b0: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
c5c0: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
c5d0: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
c5e0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
c5f0: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
c600: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
c610: 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c  le *p){.  int i,
c620: 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a   k, n;.  char *z
c630: 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53  Stmt;.  char *zS
c640: 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e  ep, *zSep2, *zEn
c650: 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  d;.  Column *pCo
c660: 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f  l;.  n = 0;.  fo
c670: 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c  r(pCol = p->aCol
c680: 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  , i=0; i<p->nCol
c690: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
c6a0: 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65      n += identLe
c6b0: 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ngth(pCol->zName
c6c0: 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b  ) + 5;.  }.  n +
c6d0: 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d  = identLength(p-
c6e0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e  >zName);.  if( n
c6f0: 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70  <50 ){ .    zSep
c700: 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32   = "";.    zSep2
c710: 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64   = ",";.    zEnd
c720: 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b   = ")";.  }else{
c730: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20  .    zSep = "\n 
c740: 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20   ";.    zSep2 = 
c750: 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e  ",\n  ";.    zEn
c760: 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20  d = "\n)";.  }. 
c770: 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e   n += 35 + 6*p->
c780: 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20  nCol;.  zStmt = 
c790: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
c7a0: 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20  aw(0, n);.  if( 
c7b0: 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  zStmt==0 ){.    
c7c0: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
c7d0: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
c7e0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
c7f0: 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74  _snprintf(n, zSt
c800: 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c  mt, "CREATE TABL
c810: 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69  E ");.  k = sqli
c820: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d  te3Strlen30(zStm
c830: 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a  t);.  identPut(z
c840: 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61  Stmt, &k, p->zNa
c850: 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b  me);.  zStmt[k++
c860: 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70  ] = '(';.  for(p
c870: 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  Col=p->aCol, i=0
c880: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
c890: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73  , pCol++){.    s
c8a0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c8b0: 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b   * const azType[
c8c0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ] = {.        /*
c8d0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
c8e0: 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20      */ "",.     
c8f0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
c900: 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20 54 45  _TEXT    */ " TE
c910: 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  XT",.        /* 
c920: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
c930: 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20  IC */ " NUM",.  
c940: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
c950: 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22  AFF_INTEGER */ "
c960: 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f   INT",.        /
c970: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  * SQLITE_AFF_REA
c980: 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a  L    */ " REAL".
c990: 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c      };.    int l
c9a0: 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  en;.    const ch
c9b0: 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20  ar *zType;..    
c9c0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
c9d0: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
c9e0: 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d   zSep);.    k +=
c9f0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
ca00: 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20  (&zStmt[k]);.   
ca10: 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20   zSep = zSep2;. 
ca20: 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d     identPut(zStm
ca30: 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  t, &k, pCol->zNa
ca40: 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  me);.    assert(
ca50: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
ca60: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
ca70: 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65  >= 0 );.    asse
ca80: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
ca90: 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  ty-SQLITE_AFF_BL
caa0: 4f 42 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61  OB < ArraySize(a
cab0: 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74 65  zType) );.    te
cac0: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
cad0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
cae0: 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 74  FF_BLOB );.    t
caf0: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
cb00: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
cb10: 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20  AFF_TEXT );.    
cb20: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
cb30: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
cb40: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a  _AFF_NUMERIC );.
cb50: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
cb60: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
cb70: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
cb80: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
cb90: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
cba0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
cbb0: 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54  L );.    .    zT
cbc0: 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f  ype = azType[pCo
cbd0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51  l->affinity - SQ
cbe0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b 0a  LITE_AFF_BLOB];.
cbf0: 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65      len = sqlite
cc00: 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29  3Strlen30(zType)
cc10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
cc20: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
cc30: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a 20  LITE_AFF_BLOB . 
cc40: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43             || pC
cc50: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71  ol->affinity==sq
cc60: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
cc70: 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a 20  e(zType, 0) );. 
cc80: 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74     memcpy(&zStmt
cc90: 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29  [k], zType, len)
cca0: 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a  ;.    k += len;.
ccb0: 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e      assert( k<=n
ccc0: 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
ccd0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20  3_snprintf(n-k, 
cce0: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c  &zStmt[k], "%s",
ccf0: 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e   zEnd);.  return
cd00: 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zStmt;.}../*.**
cd10: 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65 78   Resize an Index
cd20: 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20   object to hold 
cd30: 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e  N columns total.
cd40: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
cd50: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
cd60: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   and SQLITE_NOME
cd70: 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  M on an OOM erro
cd80: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
cd90: 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65   resizeIndexObje
cda0: 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ct(sqlite3 *db, 
cdb0: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74  Index *pIdx, int
cdc0: 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78   N){.  char *zEx
cdd0: 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  tra;.  int nByte
cde0: 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43  ;.  if( pIdx->nC
cdf0: 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72  olumn>=N ) retur
ce00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  n SQLITE_OK;.  a
ce10: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73 52  ssert( pIdx->isR
ce20: 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e  esized==0 );.  n
ce30: 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28 63  Byte = (sizeof(c
ce40: 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69  har*) + sizeof(i
ce50: 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45  16) + 1)*N;.  zE
ce60: 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44 62  xtra = sqlite3Db
ce70: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
ce80: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45 78  Byte);.  if( zEx
ce90: 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tra==0 ) return 
cea0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
ceb0: 54 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74  T;.  memcpy(zExt
cec0: 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  ra, pIdx->azColl
ced0: 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  , sizeof(char*)*
cee0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a  pIdx->nColumn);.
cef0: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d    pIdx->azColl =
cf00: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 7a   (const char**)z
cf10: 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20  Extra;.  zExtra 
cf20: 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  += sizeof(char*)
cf30: 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78  *N;.  memcpy(zEx
cf40: 74 72 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c  tra, pIdx->aiCol
cf50: 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36 29  umn, sizeof(i16)
cf60: 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b  *pIdx->nColumn);
cf70: 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  .  pIdx->aiColum
cf80: 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78 74 72 61  n = (i16*)zExtra
cf90: 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69  ;.  zExtra += si
cfa0: 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20 6d  zeof(i16)*N;.  m
cfb0: 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49  emcpy(zExtra, pI
cfc0: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20  dx->aSortOrder, 
cfd0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a  pIdx->nColumn);.
cfe0: 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64    pIdx->aSortOrd
cff0: 65 72 20 3d 20 28 75 38 2a 29 7a 45 78 74 72 61  er = (u8*)zExtra
d000: 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ;.  pIdx->nColum
d010: 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e 69  n = N;.  pIdx->i
d020: 73 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20 20  sResized = 1;.  
d030: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d040: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  ;.}../*.** Estim
d050: 61 74 65 20 74 68 65 20 74 6f 74 61 6c 20 72 6f  ate the total ro
d060: 77 20 77 69 64 74 68 20 66 6f 72 20 61 20 74 61  w width for a ta
d070: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
d080: 6f 69 64 20 65 73 74 69 6d 61 74 65 54 61 62 6c  oid estimateTabl
d090: 65 57 69 64 74 68 28 54 61 62 6c 65 20 2a 70 54  eWidth(Table *pT
d0a0: 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ab){.  unsigned 
d0b0: 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63 6f  wTable = 0;.  co
d0c0: 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62  nst Column *pTab
d0d0: 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Col;.  int i;.  
d0e0: 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c  for(i=pTab->nCol
d0f0: 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e  , pTabCol=pTab->
d100: 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  aCol; i>0; i--, 
d110: 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  pTabCol++){.    
d120: 77 54 61 62 6c 65 20 2b 3d 20 70 54 61 62 43 6f  wTable += pTabCo
d130: 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20  l->szEst;.  }.  
d140: 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c  if( pTab->iPKey<
d150: 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 20  0 ) wTable++;.  
d160: 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d  pTab->szTabRow =
d170: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77   sqlite3LogEst(w
d180: 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a  Table*4);.}../*.
d190: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
d1a0: 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20  average size of 
d1b0: 61 20 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e 64  a row for an ind
d1c0: 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
d1d0: 69 64 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78  id estimateIndex
d1e0: 57 69 64 74 68 28 49 6e 64 65 78 20 2a 70 49 64  Width(Index *pId
d1f0: 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77  x){.  unsigned w
d200: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e 74  Index = 0;.  int
d210: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75   i;.  const Colu
d220: 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d  mn *aCol = pIdx-
d230: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20  >pTable->aCol;. 
d240: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
d250: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
d260: 0a 20 20 20 20 69 31 36 20 78 20 3d 20 70 49 64  .    i16 x = pId
d270: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  x->aiColumn[i];.
d280: 20 20 20 20 61 73 73 65 72 74 28 20 78 3c 70 49      assert( x<pI
d290: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  dx->pTable->nCol
d2a0: 20 29 3b 0a 20 20 20 20 77 49 6e 64 65 78 20 2b   );.    wIndex +
d2b0: 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f 6c  = x<0 ? 1 : aCol
d2c0: 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  [pIdx->aiColumn[
d2d0: 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20  i]].szEst;.  }. 
d2e0: 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 20   pIdx->szIdxRow 
d2f0: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
d300: 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a  wIndex*4);.}../*
d310: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
d320: 76 61 6c 75 65 20 78 20 69 73 20 66 6f 75 6e 64  value x is found
d330: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69 72 73   any of the firs
d340: 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f  t nCol entries o
d350: 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61  f aiCol[].*/.sta
d360: 74 69 63 20 69 6e 74 20 68 61 73 43 6f 6c 75 6d  tic int hasColum
d370: 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a 61 69 43  n(const i16 *aiC
d380: 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e  ol, int nCol, in
d390: 74 20 78 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e  t x){.  while( n
d3a0: 43 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28 20  Col-- > 0 ) if( 
d3b0: 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 20  x==*(aiCol++) ) 
d3c0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
d3d0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
d3e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
d3f0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 70   at the end of p
d400: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
d410: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
d420: 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 20 57 49  that.** has a WI
d430: 54 48 4f 55 54 20 52 4f 57 49 44 20 63 6c 61 75  THOUT ROWID clau
d440: 73 65 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20  se.  The job of 
d450: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
d460: 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f 74 68 0a  to convert both.
d470: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  ** internal sche
d480: 6d 61 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ma data structur
d490: 65 73 20 61 6e 64 20 74 68 65 20 67 65 6e 65 72  es and the gener
d4a0: 61 74 65 64 20 56 44 42 45 20 63 6f 64 65 20 73  ated VDBE code s
d4b0: 6f 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 61  o that they.** a
d4c0: 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  re appropriate f
d4d0: 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  or a WITHOUT ROW
d4e0: 49 44 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64  ID table instead
d4f0: 20 6f 66 20 61 20 72 6f 77 69 64 20 74 61 62 6c   of a rowid tabl
d500: 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e  e..** Changes in
d510: 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  clude:.**.**    
d520: 20 28 31 29 20 20 53 65 74 20 61 6c 6c 20 63 6f   (1)  Set all co
d530: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49  lumns of the PRI
d540: 4d 41 52 59 20 4b 45 59 20 73 63 68 65 6d 61 20  MARY KEY schema 
d550: 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 4e 4f 54  object to be NOT
d560: 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20 20 28 32   NULL..**     (2
d570: 29 20 20 43 6f 6e 76 65 72 74 20 74 68 65 20 4f  )  Convert the O
d580: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 69 6e  P_CreateTable in
d590: 74 6f 20 61 6e 20 4f 50 5f 43 72 65 61 74 65 49  to an OP_CreateI
d5a0: 6e 64 65 78 2e 20 20 54 68 65 72 65 20 69 73 0a  ndex.  There is.
d5b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 6e 6f 20 72  **          no r
d5c0: 6f 77 69 64 20 62 74 72 65 65 20 66 6f 72 20 61  owid btree for a
d5d0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 20   WITHOUT ROWID. 
d5e0: 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 63 61   Instead, the ca
d5f0: 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 20 20 20 20 20  nonical.**      
d600: 20 20 20 20 64 61 74 61 20 73 74 6f 72 61 67 65      data storage
d610: 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69   is a covering i
d620: 6e 64 65 78 20 62 74 72 65 65 2e 0a 2a 2a 20 20  ndex btree..**  
d630: 20 20 20 28 33 29 20 20 42 79 70 61 73 73 20 74     (3)  Bypass t
d640: 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74  he creation of t
d650: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
d660: 20 74 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20   table entry.** 
d670: 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 68 65           for the
d680: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 73 20   PRIMARY KEY as 
d690: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
d6a0: 69 6e 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a 20  index is now.** 
d6b0: 20 20 20 20 20 20 20 20 20 69 64 65 6e 74 69 66           identif
d6c0: 69 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74  ied by the sqlit
d6d0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65  e_master table e
d6e0: 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c  ntry of the tabl
d6f0: 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20 20  e itself..**    
d700: 20 28 34 29 20 20 53 65 74 20 74 68 65 20 49 6e   (4)  Set the In
d710: 64 65 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65 20  dex.tnum of the 
d720: 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65  PRIMARY KEY Inde
d730: 78 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a  x object in the.
d740: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 68 65  **          sche
d750: 6d 61 20 74 6f 20 74 68 65 20 72 6f 6f 74 70 61  ma to the rootpa
d760: 67 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ge from the main
d770: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 28   table..**     (
d780: 35 29 20 20 41 64 64 20 61 6c 6c 20 74 61 62 6c  5)  Add all tabl
d790: 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65  e columns to the
d7a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64   PRIMARY KEY Ind
d7b0: 65 78 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20  ex object.**    
d7c0: 20 20 20 20 20 20 73 6f 20 74 68 61 74 20 74 68        so that th
d7d0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
d7e0: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
d7f0: 78 2e 20 20 54 68 65 20 73 75 72 70 6c 75 73 0a  x.  The surplus.
d800: 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75  **          colu
d810: 6d 6e 73 20 61 72 65 20 70 61 72 74 20 6f 66 20  mns are part of 
d820: 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64 20  KeyInfo.nXField 
d830: 61 6e 64 20 61 72 65 20 6e 6f 74 20 75 73 65 64  and are not used
d840: 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20   for.**         
d850: 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b   sorting or look
d860: 75 70 20 6f 72 20 75 6e 69 71 75 65 6e 65 73 73  up or uniqueness
d870: 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20 20   checks..**     
d880: 28 36 29 20 20 52 65 70 6c 61 63 65 20 74 68 65  (6)  Replace the
d890: 20 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20 61   rowid tail on a
d8a0: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
d8b0: 20 67 65 6e 65 72 61 74 65 64 20 55 4e 49 51 55   generated UNIQU
d8c0: 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e  E.**          in
d8d0: 64 69 63 65 73 20 77 69 74 68 20 74 68 65 20 50  dices with the P
d8e0: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
d8f0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 76 69  ns..**.** For vi
d900: 72 74 75 61 6c 20 74 61 62 6c 65 73 2c 20 6f 6e  rtual tables, on
d910: 6c 79 20 28 31 29 20 69 73 20 70 65 72 66 6f 72  ly (1) is perfor
d920: 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  med..*/.static v
d930: 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f 57 69 74  oid convertToWit
d940: 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 50  houtRowidTable(P
d950: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
d960: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e  ble *pTab){.  In
d970: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e 64  dex *pIdx;.  Ind
d980: 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20 6e  ex *pPk;.  int n
d990: 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  Pk;.  int i, j;.
d9a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d9b0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
d9c0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
d9d0: 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 4d 61 72  pVdbe;..  /* Mar
d9e0: 6b 20 65 76 65 72 79 20 50 52 49 4d 41 52 59 20  k every PRIMARY 
d9f0: 4b 45 59 20 63 6f 6c 75 6d 6e 20 61 73 20 4e 4f  KEY column as NO
da00: 54 20 4e 55 4c 4c 20 28 65 78 63 65 70 74 20 66  T NULL (except f
da10: 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  or imposter tabl
da20: 65 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es).  */.  if( !
da30: 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65  db->init.imposte
da40: 72 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 6f  rTable ){.    fo
da50: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
da60: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
da70: 20 69 66 28 20 28 70 54 61 62 2d 3e 61 43 6f 6c   if( (pTab->aCol
da80: 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43  [i].colFlags & C
da90: 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21  OLFLAG_PRIMKEY)!
daa0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  =0 ){.        pT
dab0: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e  ab->aCol[i].notN
dac0: 75 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ull = OE_Abort;.
dad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
dae0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 6d 61  }..  /* The rema
daf0: 69 6e 69 6e 67 20 74 72 61 6e 73 66 6f 72 6d 61  ining transforma
db00: 74 69 6f 6e 73 20 6f 6e 6c 79 20 61 70 70 6c 79  tions only apply
db10: 20 74 6f 20 62 2d 74 72 65 65 20 74 61 62 6c 65   to b-tree table
db20: 73 2c 20 6e 6f 74 20 74 6f 0a 20 20 2a 2a 20 76  s, not to.  ** v
db30: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f  irtual tables */
db40: 0a 20 20 69 66 28 20 49 4e 5f 44 45 43 4c 41 52  .  if( IN_DECLAR
db50: 45 5f 56 54 41 42 20 29 20 72 65 74 75 72 6e 3b  E_VTAB ) return;
db60: 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74  ..  /* Convert t
db70: 68 65 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  he OP_CreateTabl
db80: 65 20 6f 70 63 6f 64 65 20 74 68 61 74 20 77 6f  e opcode that wo
db90: 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 63 72 65  uld normally cre
dba0: 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6f  ate the.  ** roo
dbb0: 74 2d 70 61 67 65 20 66 6f 72 20 74 68 65 20 74  t-page for the t
dbc0: 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f  able into an OP_
dbd0: 43 72 65 61 74 65 49 6e 64 65 78 20 6f 70 63 6f  CreateIndex opco
dbe0: 64 65 2e 20 20 54 68 65 20 69 6e 64 65 78 0a 20  de.  The index. 
dbf0: 20 2a 2a 20 63 72 65 61 74 65 64 20 77 69 6c 6c   ** created will
dc00: 20 62 65 63 6f 6d 65 20 74 68 65 20 50 52 49 4d   become the PRIM
dc10: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 0a 20  ARY KEY index.. 
dc20: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
dc30: 2d 3e 61 64 64 72 43 72 54 61 62 20 29 7b 0a 20  ->addrCrTab ){. 
dc40: 20 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a     assert( v );.
dc50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
dc60: 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 70  hangeOpcode(v, p
dc70: 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62  Parse->addrCrTab
dc80: 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  , OP_CreateIndex
dc90: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  );.  }..  /* Loc
dca0: 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ate the PRIMARY 
dcb0: 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20  KEY index.  Or, 
dcc0: 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 77 61  if this table wa
dcd0: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  s originally.  *
dce0: 2a 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  * an INTEGER PRI
dcf0: 4d 41 52 59 20 4b 45 59 20 74 61 62 6c 65 2c 20  MARY KEY table, 
dd00: 63 72 65 61 74 65 20 61 20 6e 65 77 20 50 52 49  create a new PRI
dd10: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20  MARY KEY index. 
dd20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
dd30: 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20  ->iPKey>=0 ){.  
dd40: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
dd50: 74 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 69 70 6b  t;.    Token ipk
dd60: 54 6f 6b 65 6e 3b 0a 20 20 20 20 73 71 6c 69 74  Token;.    sqlit
dd70: 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 69 70 6b  e3TokenInit(&ipk
dd80: 54 6f 6b 65 6e 2c 20 70 54 61 62 2d 3e 61 43 6f  Token, pTab->aCo
dd90: 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a  l[pTab->iPKey].z
dda0: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74  Name);.    pList
ddb0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
ddc0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
ddd0: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
dde0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
ddf0: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49  prAlloc(db, TK_I
de00: 44 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c 20 30 29  D, &ipkToken, 0)
de10: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
de20: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
de30: 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f    pList->a[0].so
de40: 72 74 4f 72 64 65 72 20 3d 20 70 50 61 72 73 65  rtOrder = pParse
de50: 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a  ->iPkSortOrder;.
de60: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
de70: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70  se->pNewTable==p
de80: 54 61 62 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  Tab );.    sqlit
de90: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  e3CreateIndex(pP
dea0: 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70  arse, 0, 0, 0, p
deb0: 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43  List, pTab->keyC
dec0: 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  onf, 0, 0, 0, 0,
ded0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dee0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
def0: 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45  DXTYPE_PRIMARYKE
df00: 59 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  Y);.    if( db->
df10: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
df20: 65 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b 20 3d  eturn;.    pPk =
df30: 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
df40: 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
df50: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
df60: 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   -1;.  }else{.  
df70: 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50    pPk = sqlite3P
df80: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
df90: 54 61 62 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  Tab);..    /*.  
dfa0: 20 20 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20    ** Remove all 
dfb0: 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e  redundant column
dfc0: 73 20 66 72 6f 6d 20 74 68 65 20 50 52 49 4d 41  s from the PRIMA
dfd0: 52 59 20 4b 45 59 2e 20 20 46 6f 72 20 65 78 61  RY KEY.  For exa
dfe0: 6d 70 6c 65 2c 20 63 68 61 6e 67 65 0a 20 20 20  mple, change.   
dff0: 20 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b 45 59   ** "PRIMARY KEY
e000: 28 61 2c 62 2c 61 2c 62 2c 63 2c 62 2c 63 2c 64  (a,b,a,b,c,b,c,d
e010: 29 22 20 69 6e 74 6f 20 6a 75 73 74 20 22 50 52  )" into just "PR
e020: 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 63 2c  IMARY KEY(a,b,c,
e030: 64 29 22 2e 20 20 4c 61 74 65 72 0a 20 20 20 20  d)".  Later.    
e040: 2a 2a 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  ** code assumes 
e050: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
e060: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 65 70 65  contains no repe
e070: 61 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20  ated columns..  
e080: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6a    */.    for(i=j
e090: 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43  =1; i<pPk->nKeyC
e0a0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
e0b0: 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 50  if( hasColumn(pP
e0c0: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20  k->aiColumn, j, 
e0d0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
e0e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 6b  ) ){.        pPk
e0f0: 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20 20  ->nColumn--;.   
e100: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e110: 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b    pPk->aiColumn[
e120: 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f  j++] = pPk->aiCo
e130: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 7d  lumn[i];.      }
e140: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 6b 2d 3e  .    }.    pPk->
e150: 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b 0a 20 20 7d  nKeyCol = j;.  }
e160: 0a 20 20 61 73 73 65 72 74 28 20 70 50 6b 21 3d  .  assert( pPk!=
e170: 30 20 29 3b 0a 20 20 70 50 6b 2d 3e 69 73 43 6f  0 );.  pPk->isCo
e180: 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20 69 66  vering = 1;.  if
e190: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f  ( !db->init.impo
e1a0: 73 74 65 72 54 61 62 6c 65 20 29 20 70 50 6b 2d  sterTable ) pPk-
e1b0: 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31  >uniqNotNull = 1
e1c0: 3b 0a 20 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e  ;.  nPk = pPk->n
e1d0: 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 42 79  KeyCol;..  /* By
e1e0: 70 61 73 73 20 74 68 65 20 63 72 65 61 74 69 6f  pass the creatio
e1f0: 6e 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  n of the PRIMARY
e200: 20 4b 45 59 20 62 74 72 65 65 20 61 6e 64 20 74   KEY btree and t
e210: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
e220: 0a 20 20 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72  .  ** table entr
e230: 79 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20  y. This is only 
e240: 72 65 71 75 69 72 65 64 20 69 66 20 63 75 72 72  required if curr
e250: 65 6e 74 6c 79 20 67 65 6e 65 72 61 74 69 6e 67  ently generating
e260: 20 56 44 42 45 0a 20 20 2a 2a 20 63 6f 64 65 20   VDBE.  ** code 
e270: 66 6f 72 20 61 20 43 52 45 41 54 45 20 54 41 42  for a CREATE TAB
e280: 4c 45 20 28 6e 6f 74 20 77 68 65 6e 20 70 61 72  LE (not when par
e290: 73 69 6e 67 20 6f 6e 65 20 61 73 20 70 61 72 74  sing one as part
e2a0: 20 6f 66 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a   of reading.  **
e2b0: 20 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65   a database sche
e2c0: 6d 61 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 76  ma).  */.  if( v
e2d0: 20 26 26 20 70 50 6b 2d 3e 74 6e 75 6d 3e 30 20   && pPk->tnum>0 
e2e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
e2f0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
e300: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
e310: 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76  beChangeOpcode(v
e320: 2c 20 70 50 6b 2d 3e 74 6e 75 6d 2c 20 4f 50 5f  , pPk->tnum, OP_
e330: 47 6f 74 6f 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Goto);.  }..  /*
e340: 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   The root page o
e350: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
e360: 59 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 72  Y is the table r
e370: 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20 70 50  oot page */.  pP
e380: 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62 2d 3e  k->tnum = pTab->
e390: 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64 61  tnum;..  /* Upda
e3a0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
e3b0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
e3c0: 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45 20 69 6e  of all UNIQUE in
e3d0: 64 69 63 65 73 20 62 79 20 63 6f 6e 76 65 72 74  dices by convert
e3e0: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e  ing.  ** the fin
e3f0: 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20  al rowid column 
e400: 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  into one or more
e410: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
e420: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20 2a  PRIMARY KEY..  *
e430: 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61  /.  for(pIdx=pTa
e440: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
e450: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
e460: 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  t){.    int n;. 
e470: 20 20 20 69 66 28 20 49 73 50 72 69 6d 61 72 79     if( IsPrimary
e480: 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 29  KeyIndex(pIdx) )
e490: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
e4a0: 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b  or(i=n=0; i<nPk;
e4b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
e4c0: 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78   !hasColumn(pIdx
e4d0: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78  ->aiColumn, pIdx
e4e0: 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e  ->nKeyCol, pPk->
e4f0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e  aiColumn[i]) ) n
e500: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
e510: 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
e520: 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 73  /* This index is
e530: 20 61 20 73 75 70 65 72 73 65 74 20 6f 66 20 74   a superset of t
e540: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a  he primary key *
e550: 2f 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 43  /.      pIdx->nC
e560: 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b  olumn = pIdx->nK
e570: 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e  eyCol;.      con
e580: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
e590: 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78   if( resizeIndex
e5a0: 4f 62 6a 65 63 74 28 64 62 2c 20 70 49 64 78 2c  Object(db, pIdx,
e5b0: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e   pIdx->nKeyCol+n
e5c0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ) ) return;.    
e5d0: 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64 78 2d  for(i=0, j=pIdx-
e5e0: 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b  >nKeyCol; i<nPk;
e5f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
e600: 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78   !hasColumn(pIdx
e610: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78  ->aiColumn, pIdx
e620: 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e  ->nKeyCol, pPk->
e630: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a  aiColumn[i]) ){.
e640: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69          pIdx->ai
e650: 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d  Column[j] = pPk-
e660: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
e670: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
e680: 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43  ll[j] = pPk->azC
e690: 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  oll[i];.        
e6a0: 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j++;.      }.   
e6b0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
e6c0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49  Idx->nColumn>=pI
e6d0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b  dx->nKeyCol+n );
e6e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
e6f0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b  x->nColumn>=j );
e700: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61  .  }..  /* Add a
e710: 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  ll table columns
e720: 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20   to the PRIMARY 
e730: 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f 0a 20  KEY index.  */. 
e740: 20 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e   if( nPk<pTab->n
e750: 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 72  Col ){.    if( r
e760: 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74  esizeIndexObject
e770: 28 64 62 2c 20 70 50 6b 2c 20 70 54 61 62 2d 3e  (db, pPk, pTab->
e780: 6e 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 3b 0a  nCol) ) return;.
e790: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e      for(i=0, j=n
e7a0: 50 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  Pk; i<pTab->nCol
e7b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
e7c0: 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b  ( !hasColumn(pPk
e7d0: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69  ->aiColumn, j, i
e7e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
e7f0: 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c  ert( j<pPk->nCol
e800: 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  umn );.        p
e810: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20  Pk->aiColumn[j] 
e820: 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 50 6b  = i;.        pPk
e830: 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 73 71  ->azColl[j] = sq
e840: 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a  lite3StrBINARY;.
e850: 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
e860: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
e870: 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e 43 6f 6c  ssert( pPk->nCol
e880: 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20 20 61 73  umn==j );.    as
e890: 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
e8a0: 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ==j );.  }else{.
e8b0: 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e      pPk->nColumn
e8c0: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20   = pTab->nCol;. 
e8d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
e8e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
e8f0: 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65  ed to report the
e900: 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20   final ")" that 
e910: 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20  terminates.** a 
e920: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
e930: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
e940: 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  e table structur
e950: 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74  e that other act
e960: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76  ion routines hav
e970: 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a  e been building.
e980: 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
e990: 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  he internal hash
e9a0: 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e   tables, assumin
e9b0: 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65  g no errors have
e9c0: 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  .** occurred..**
e9d0: 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72  .** An entry for
e9e0: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61   the table is ma
e9f0: 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  de in the master
ea00: 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20   table on disk, 
ea10: 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69  unless.** this i
ea20: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  s a temporary ta
ea30: 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e  ble or db->init.
ea40: 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64  busy==1.  When d
ea50: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a  b->init.busy==1.
ea60: 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61  ** it means we a
ea70: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73  re reading the s
ea80: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
ea90: 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  le because we ju
eaa0: 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  st.** connected 
eab0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
eac0: 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73  or because the s
ead0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
eae0: 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74  le has.** recent
eaf0: 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74  ly changed, so t
eb00: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69  he entry for thi
eb10: 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  s table already 
eb20: 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65  exists in.** the
eb30: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
eb40: 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  able.  We do not
eb50: 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20   want to create 
eb60: 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  it again..**.** 
eb70: 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61  If the pSelect a
eb80: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
eb90: 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ULL, it means th
eba0: 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  at this routine.
ebb0: 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ** was called to
ebc0: 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   create a table 
ebd0: 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61  generated from a
ebe0: 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42   .** "CREATE TAB
ebf0: 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  LE ... AS SELECT
ec00: 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e   ..." statement.
ec10: 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d    The column nam
ec20: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  es of.** the new
ec30: 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63   table will matc
ec40: 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  h the result set
ec50: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
ec60: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
ec70: 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  ndTable(.  Parse
ec80: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
ec90: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
eca0: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
ecb0: 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20  pCons,          
ecc0: 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65   /* The ',' toke
ecd0: 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  n after the last
ece0: 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f   column defn. */
ecf0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20  .  Token *pEnd, 
ed00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
ed10: 65 20 27 29 27 20 62 65 66 6f 72 65 20 6f 70 74  e ')' before opt
ed20: 69 6f 6e 73 20 69 6e 20 74 68 65 20 43 52 45 41  ions in the CREA
ed30: 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75 38  TE TABLE */.  u8
ed40: 20 74 61 62 4f 70 74 73 2c 20 20 20 20 20 20 20   tabOpts,       
ed50: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 74        /* Extra t
ed60: 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20 55 73  able options. Us
ed70: 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20 53 65  ually 0. */.  Se
ed80: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
ed90: 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20        /* Select 
eda0: 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e  from a "CREATE .
edb0: 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f  .. AS SELECT" */
edc0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 20  .){.  Table *p; 
edd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ede0: 2f 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65  /* The new table
edf0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
ee00: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
ee10: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
ee20: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
ee30: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
ee40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
ee50: 61 62 61 73 65 20 69 6e 20 77 68 69 63 68 20 74  abase in which t
ee60: 68 65 20 74 61 62 6c 65 20 6c 69 76 65 73 20 2a  he table lives *
ee70: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
ee80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ee90: 20 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65   An implied inde
eea0: 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  x of the table *
eeb0: 2f 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d 30  /..  if( pEnd==0
eec0: 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 20 29   && pSelect==0 )
eed0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
eee0: 7d 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  }.  assert( !db-
eef0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
ef00: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
ef10: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
ef20: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  p==0 ) return;..
ef30: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
ef40: 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65  nit.busy || !pSe
ef50: 6c 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  lect );..  /* If
ef60: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
ef70: 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73  sy is 1 it means
ef80: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
ef90: 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a  the SQL off the.
efa0: 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73    ** "sqlite_mas
efb0: 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f  ter" or "sqlite_
efc0: 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62  temp_master" tab
efd0: 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a  le on the disk..
efe0: 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77    ** So do not w
eff0: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
f000: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
f010: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
f020: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
f030: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
f040: 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  e db->init.newTn
f050: 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20  um field.  (The 
f060: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
f070: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
f080: 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74  n put there by t
f090: 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20  he sqliteOpenCb 
f0a0: 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2a 0a 20  routine.).  **. 
f0b0: 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20   ** If the root 
f0c0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 31  page number is 1
f0d0: 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 69  , that means thi
f0e0: 73 20 69 73 20 74 68 65 20 73 71 6c 69 74 65 5f  s is the sqlite_
f0f0: 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c  master.  ** tabl
f100: 65 20 69 74 73 65 6c 66 2e 20 20 53 6f 20 6d 61  e itself.  So ma
f110: 72 6b 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e  rk it read-only.
f120: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
f130: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
f140: 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69   p->tnum = db->i
f150: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20  nit.newTnum;.   
f160: 20 69 66 28 20 70 2d 3e 74 6e 75 6d 3d 3d 31 20   if( p->tnum==1 
f170: 29 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  ) p->tabFlags |=
f180: 20 54 46 5f 52 65 61 64 6f 6e 6c 79 3b 0a 20 20   TF_Readonly;.  
f190: 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  }..  /* Special 
f1a0: 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57  processing for W
f1b0: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 54 61 62  ITHOUT ROWID Tab
f1c0: 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 74 61 62  les */.  if( tab
f1d0: 4f 70 74 73 20 26 20 54 46 5f 57 69 74 68 6f 75  Opts & TF_Withou
f1e0: 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66  tRowid ){.    if
f1f0: 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26  ( (p->tabFlags &
f200: 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e   TF_Autoincremen
f210: 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  t) ){.      sqli
f220: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
f230: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 41  se,.          "A
f240: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6e 6f 74  UTOINCREMENT not
f250: 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 57 49 54 48   allowed on WITH
f260: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73  OUT ROWID tables
f270: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
f280: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f290: 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  (p->tabFlags & T
f2a0: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 29  F_HasPrimaryKey)
f2b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
f2c0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
f2d0: 72 73 65 2c 20 22 50 52 49 4d 41 52 59 20 4b 45  rse, "PRIMARY KE
f2e0: 59 20 6d 69 73 73 69 6e 67 20 6f 6e 20 74 61 62  Y missing on tab
f2f0: 6c 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65  le %s", p->zName
f300: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
f310: 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67 73 20      p->tabFlags 
f320: 7c 3d 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77  |= TF_WithoutRow
f330: 69 64 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c  id | TF_NoVisibl
f340: 65 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 63 6f  eRowid;.      co
f350: 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f  nvertToWithoutRo
f360: 77 69 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  widTable(pParse,
f370: 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   p);.    }.  }..
f380: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
f390: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
f3a0: 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23   p->pSchema);..#
f3b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f3c0: 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65  IT_CHECK.  /* Re
f3d0: 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61  solve names in a
f3e0: 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ll CHECK constra
f3f0: 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  int expressions.
f400: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
f410: 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c  Check ){.    sql
f420: 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52  ite3ResolveSelfR
f430: 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c  eference(pParse,
f440: 20 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20   p, NC_IsCheck, 
f450: 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20  0, p->pCheck);. 
f460: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
f470: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
f480: 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f  T_CHECK) */..  /
f490: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61  * Estimate the a
f4a0: 76 65 72 61 67 65 20 72 6f 77 20 73 69 7a 65 20  verage row size 
f4b0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e  for the table an
f4c0: 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65  d for all implie
f4d0: 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65  d indices */.  e
f4e0: 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74  stimateTableWidt
f4f0: 68 28 70 29 3b 0a 20 20 66 6f 72 28 70 49 64 78  h(p);.  for(pIdx
f500: 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  =p->pIndex; pIdx
f510: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
f520: 78 74 29 7b 0a 20 20 20 20 65 73 74 69 6d 61 74  xt){.    estimat
f530: 65 49 6e 64 65 78 57 69 64 74 68 28 70 49 64 78  eIndexWidth(pIdx
f540: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
f550: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  not initializing
f560: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
f570: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e  record for the n
f580: 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  ew table.  ** in
f590: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
f5a0: 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ER table of the 
f5b0: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20  database..  **. 
f5c0: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
f5d0: 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65   TEMPORARY table
f5e0: 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72  , write the entr
f5f0: 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c  y into the auxil
f600: 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69  iary.  ** file i
f610: 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74  nstead of into t
f620: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
f630: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
f640: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
f650: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20   ){.    int n;. 
f660: 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
f670: 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20  char *zType;    
f680: 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61  /* "view" or "ta
f690: 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  ble" */.    char
f6a0: 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22   *zType2;   /* "
f6b0: 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22  VIEW" or "TABLE"
f6c0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
f6d0: 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20  tmt;    /* Text 
f6e0: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
f6f0: 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49  BLE or CREATE VI
f700: 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EW statement */.
f710: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
f720: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
f730: 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76  .    if( NEVER(v
f740: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  ==0) ) return;..
f750: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f760: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
f770: 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a  e, 0);..    /* .
f780: 20 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a      ** Initializ
f790: 65 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20  e zType for the 
f7a0: 6e 65 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c  new view or tabl
f7b0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
f7c0: 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ( p->pSelect==0 
f7d0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65  ){.      /* A re
f7e0: 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20  gular table */. 
f7f0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61       zType = "ta
f800: 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70  ble";.      zTyp
f810: 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69  e2 = "TABLE";.#i
f820: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f830: 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65  T_VIEW.    }else
f840: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65  {.      /* A vie
f850: 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65  w */.      zType
f860: 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20   = "view";.     
f870: 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22   zType2 = "VIEW"
f880: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
f890: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
f8a0: 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  s a CREATE TABLE
f8b0: 20 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e   xx AS SELECT ..
f8c0: 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53  ., execute the S
f8d0: 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61  ELECT.    ** sta
f8e0: 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61  tement to popula
f8f0: 74 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  te the new table
f900: 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  . The root-page 
f910: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20  number for the. 
f920: 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20     ** new table 
f930: 69 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 70  is in register p
f940: 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a  Parse->regRoot..
f950: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e      **.    ** On
f960: 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61  ce the SELECT ha
f970: 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20  s been coded by 
f980: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c  sqlite3Select(),
f990: 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20   it is in a.    
f9a0: 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74  ** suitable stat
f9b0: 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74  e to query for t
f9c0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
f9d0: 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20  and types to be 
f9e0: 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  used.    ** by t
f9f0: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20  he new table..  
fa00: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68    **.    ** A sh
fa10: 61 72 65 64 2d 63 61 63 68 65 20 77 72 69 74 65  ared-cache write
fa20: 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71  -lock is not req
fa30: 75 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74  uired to write t
fa40: 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c  o the new table,
fa50: 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68  .    ** as a sch
fa60: 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61  ema-lock must ha
fa70: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
fa80: 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61  obtained to crea
fa90: 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20  te it. Since.   
faa0: 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63   ** a schema-loc
fab0: 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f  k excludes all o
fac0: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73  ther database us
fad0: 65 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c  ers, the write-l
fae0: 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a  ock would.    **
faf0: 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20   be redundant.. 
fb00: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
fb10: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53  elect ){.      S
fb20: 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
fb30: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68 65 20     /* Where the 
fb40: 53 45 4c 45 43 54 20 73 68 6f 75 6c 64 20 73 74  SELECT should st
fb50: 6f 72 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ore results */. 
fb60: 20 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c       int regYiel
fb70: 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  d;       /* Regi
fb80: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 2d  ster holding co-
fb90: 72 6f 75 74 69 6e 65 20 65 6e 74 72 79 2d 70 6f  routine entry-po
fba0: 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  int */.      int
fbb0: 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20   addrTop;       
fbc0: 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 63   /* Top of the c
fbd0: 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20  o-routine */.   
fbe0: 20 20 20 69 6e 74 20 72 65 67 52 65 63 3b 20 20     int regRec;  
fbf0: 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 63 6f         /* A reco
fc00: 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74 20  rd to be insert 
fc10: 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62  into the new tab
fc20: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  le */.      int 
fc30: 72 65 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20  regRowid;       
fc40: 2f 2a 20 52 6f 77 69 64 20 6f 66 20 74 68 65 20  /* Rowid of the 
fc50: 6e 65 78 74 20 72 6f 77 20 74 6f 20 69 6e 73 65  next row to inse
fc60: 72 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  rt */.      int 
fc70: 61 64 64 72 49 6e 73 4c 6f 6f 70 3b 20 20 20 20  addrInsLoop;    
fc80: 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f  /* Top of the lo
fc90: 6f 70 20 66 6f 72 20 69 6e 73 65 72 74 69 6e 67  op for inserting
fca0: 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 54   rows */.      T
fcb0: 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20  able *pSelTab;  
fcc0: 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 74 68     /* A table th
fcd0: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
fce0: 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20   SELECT results 
fcf0: 2a 2f 0a 0a 20 20 20 20 20 20 72 65 67 59 69 65  */..      regYie
fd00: 6c 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ld = ++pParse->n
fd10: 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 65  Mem;.      regRe
fd20: 63 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  c = ++pParse->nM
fd30: 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77  em;.      regRow
fd40: 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  id = ++pParse->n
fd50: 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Mem;.      asser
fd60: 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d  t(pParse->nTab==
fd70: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
fd80: 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
fd90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fda0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
fdb0: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70  _OpenWrite, 1, p
fdc0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20  Parse->regRoot, 
fdd0: 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
fde0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
fdf0: 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45  v, OPFLAG_P2ISRE
fe00: 47 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  G);.      pParse
fe10: 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20  ->nTab = 2;.    
fe20: 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
fe30: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
fe40: 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 20 20 20  dr(v) + 1;.     
fe50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fe60: 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
fe70: 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64  outine, regYield
fe80: 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  , 0, addrTop);. 
fe90: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
fea0: 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
feb0: 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
fec0: 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20   regYield);.    
fed0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
fee0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
fef0: 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73   &dest);.      s
ff00: 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
ff10: 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 59 69 65  outine(v, regYie
ff20: 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ld);.      sqlit
ff30: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
ff40: 2c 20 61 64 64 72 54 6f 70 20 2d 20 31 29 3b 0a  , addrTop - 1);.
ff50: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
ff60: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
ff70: 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d  .      pSelTab =
ff80: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
ff90: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
ffa0: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
ffb0: 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30    if( pSelTab==0
ffc0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
ffd0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
ffe0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==0 );.      p->
fff0: 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  nCol = pSelTab->
10000 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61  nCol;.      p->a
10010 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
10020 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  Col;.      pSelT
10030 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
10040 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
10050 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  l = 0;.      sql
10060 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
10070 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  db, pSelTab);.  
10080 20 20 20 20 61 64 64 72 49 6e 73 4c 6f 6f 70 20      addrInsLoop 
10090 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
100a0 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
100b0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
100c0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
100d0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
100e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
100f0 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
10100 20 64 65 73 74 2e 69 53 64 73 74 2c 20 64 65 73   dest.iSdst, des
10110 74 2e 6e 53 64 73 74 2c 20 72 65 67 52 65 63 29  t.nSdst, regRec)
10120 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
10130 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20  ableAffinity(v, 
10140 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  p, 0);.      sql
10150 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10160 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 31  , OP_NewRowid, 1
10170 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
10180 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10190 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
101a0 74 2c 20 31 2c 20 72 65 67 52 65 63 2c 20 72 65  t, 1, regRec, re
101b0 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
101c0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
101d0 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a  , addrInsLoop);.
101e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
101f0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
10200 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  rInsLoop);.     
10210 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10220 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
10230 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1);.    }..    /
10240 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
10250 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
10260 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
10270 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ent */.    if( p
10280 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
10290 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61  zStmt = createTa
102a0 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a  bleStmt(db, p);.
102b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
102c0 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20 3d 20   Token *pEnd2 = 
102d0 74 61 62 4f 70 74 73 20 3f 20 26 70 50 61 72 73  tabOpts ? &pPars
102e0 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20 3a 20  e->sLastToken : 
102f0 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20 3d 20  pEnd;.      n = 
10300 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a 20 2d  (int)(pEnd2->z -
10310 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
10320 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 69 66  ken.z);.      if
10330 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27  ( pEnd2->z[0]!='
10340 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64 32 2d  ;' ) n += pEnd2-
10350 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20  >n;.      zStmt 
10360 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
10370 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (db, .          
10380 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22  "CREATE %s %.*s"
10390 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61  , zType2, n, pPa
103a0 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
103b0 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  z.      );.    }
103c0 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20  ..    /* A slot 
103d0 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68  for the record h
103e0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
103f0 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  allocated in the
10400 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f   .    ** SQLITE_
10410 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57  MASTER table.  W
10420 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75  e just need to u
10430 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20  pdate that slot 
10440 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  with all.    ** 
10450 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
10460 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e  we've collected.
10470 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
10480 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
10490 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50  Parse,.      "UP
104a0 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20  DATE %Q.%s ".   
104b0 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d        "SET type=
104c0 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74  '%s', name=%Q, t
104d0 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74  bl_name=%Q, root
104e0 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51  page=#%d, sql=%Q
104f0 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45   ".       "WHERE
10500 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20   rowid=#%d",.   
10510 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
10520 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52  zDbSName, MASTER
10530 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20 7a 54 79  _NAME,.      zTy
10540 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  pe,.      p->zNa
10550 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  me,.      p->zNa
10560 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65  me,.      pParse
10570 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20  ->regRoot,.     
10580 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50   zStmt,.      pP
10590 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20  arse->regRowid. 
105a0 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
105b0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d  3DbFree(db, zStm
105c0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  t);.    sqlite3C
105d0 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
105e0 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64  se, iDb);..#ifnd
105f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
10600 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
10610 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
10620 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63   if we need to c
10630 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f  reate an sqlite_
10640 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66  sequence table f
10650 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e  or.    ** keepin
10660 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69  g track of autoi
10670 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20  ncrement keys.. 
10680 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
10690 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
106a0 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d  Autoincrement)!=
106b0 30 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70  0 ){.      Db *p
106c0 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
106d0 62 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  b];.      assert
106e0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
106f0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
10700 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66  , 0) );.      if
10710 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
10720 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20  pSeqTab==0 ){.  
10730 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
10740 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
10750 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
10760 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69  TE TABLE %Q.sqli
10770 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65  te_sequence(name
10780 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20  ,seq)",.        
10790 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 0a    pDb->zDbSName.
107a0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
107b0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
107c0 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20  .    /* Reparse 
107d0 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70  everything to up
107e0 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
107f0 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  l data structure
10800 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
10810 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
10820 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20  maOp(v, iDb,.   
10830 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
10840 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f  Printf(db, "tbl_
10850 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79  name='%q' AND ty
10860 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20  pe!='trigger'", 
10870 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a  p->zName));.  }.
10880 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74  ..  /* Add the t
10890 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d  able to the in-m
108a0 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
108b0 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
108c0 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  base..  */.  if(
108d0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
108e0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c  {.    Table *pOl
108f0 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  d;.    Schema *p
10900 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68  Schema = p->pSch
10910 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ema;.    assert(
10920 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
10930 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
10940 20 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20   0) );.    pOld 
10950 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
10960 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  ert(&pSchema->tb
10970 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  lHash, p->zName,
10980 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c   p);.    if( pOl
10990 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  d ){.      asser
109a0 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f  t( p==pOld );  /
109b0 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
109c0 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65  ve failed inside
109d0 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f   HashInsert() */
109e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  .      sqlite3Oo
109f0 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
10a00 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
10a10 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
10a20 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64  Table = 0;.    d
10a30 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
10a40 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
10a50 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
10a60 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c  E_OMIT_ALTERTABL
10a70 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53  E.    if( !p->pS
10a80 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63  elect ){.      c
10a90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
10aa0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
10ab0 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f  )pParse->sNameTo
10ac0 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74  ken.z;.      int
10ad0 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73   nName;.      as
10ae0 73 65 72 74 28 20 21 70 53 65 6c 65 63 74 20 26  sert( !pSelect &
10af0 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20  & pCons && pEnd 
10b00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
10b10 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  ns->z==0 ){.    
10b20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64      pCons = pEnd
10b30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10b40 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28 28 63  nName = (int)((c
10b50 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6e  onst char *)pCon
10b60 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20  s->z - zName);. 
10b70 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66       p->addColOf
10b80 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c 69  fset = 13 + sqli
10b90 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28 7a  te3Utf8CharLen(z
10ba0 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
10bb0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
10bc0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10bd0 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
10be0 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
10bf0 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
10c00 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74  n order to creat
10c10 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a  e a new VIEW.*/.
10c20 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
10c30 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65 20  teView(.  Parse 
10c40 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
10c50 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
10c60 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
10c70 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54  pBegin,     /* T
10c80 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20  he CREATE token 
10c90 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65 20  that begins the 
10ca0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
10cb0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
10cc0 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74    /* The token t
10cd0 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  hat holds the na
10ce0 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a  me of the view *
10cf0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
10d00 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f  2,     /* The to
10d10 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ken that holds t
10d20 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
10d30 69 65 77 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  iew */.  ExprLis
10d40 74 20 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a 20 4f  t *pCNames, /* O
10d50 70 74 69 6f 6e 61 6c 20 6c 69 73 74 20 6f 66 20  ptional list of 
10d60 76 69 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  view column name
10d70 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
10d80 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53  Select,   /* A S
10d90 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
10da0 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
10db0 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f   the new view */
10dc0 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
10dd0 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f        /* TRUE fo
10de0 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69  r a TEMPORARY vi
10df0 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72  ew */.  int noEr
10e00 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75  r          /* Su
10e10 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73  ppress error mes
10e20 73 61 67 65 73 20 69 66 20 56 49 45 57 20 61 6c  sages if VIEW al
10e30 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
10e40 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
10e50 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20   int n;.  const 
10e60 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e  char *z;.  Token
10e70 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72   sEnd;.  DbFixer
10e80 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a   sFix;.  Token *
10e90 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pName = 0;.  int
10ea0 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 20   iDb;.  sqlite3 
10eb0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
10ec0 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
10ed0 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73  >nVar>0 ){.    s
10ee0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
10ef0 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65  Parse, "paramete
10f00 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  rs are not allow
10f10 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20  ed in views");. 
10f20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76     goto create_v
10f30 69 65 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20 20  iew_fail;.  }.  
10f40 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
10f50 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
10f60 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70  , pName2, isTemp
10f70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a  , 1, 0, noErr);.
10f80 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
10f90 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
10fa0 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
10fb0 45 72 72 20 29 20 67 6f 74 6f 20 63 72 65 61 74  Err ) goto creat
10fc0 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 73  e_view_fail;.  s
10fd0 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
10fe0 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
10ff0 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
11000 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  );.  iDb = sqlit
11010 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
11020 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b  db, p->pSchema);
11030 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  .  sqlite3FixIni
11040 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
11050 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e   iDb, "view", pN
11060 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ame);.  if( sqli
11070 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46  te3FixSelect(&sF
11080 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29 20 67  ix, pSelect) ) g
11090 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f  oto create_view_
110a0 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  fail;..  /* Make
110b0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
110c0 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61  ntire SELECT sta
110d0 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
110e0 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
110f0 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72  ** This will for
11100 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e  ce all the Expr.
11110 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74  token.z values t
11120 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
11130 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  .  ** allocated 
11140 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e  rather than poin
11150 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73  t to the input s
11160 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65  tring - which me
11170 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ans that.  ** th
11180 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20  ey will persist 
11190 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
111a0 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  t sqlite3_exec()
111b0 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20   call returns.. 
111c0 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74   */.  p->pSelect
111d0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
111e0 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c  Dup(db, pSelect,
111f0 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
11200 3b 0a 20 20 70 2d 3e 70 43 68 65 63 6b 20 3d 20  ;.  p->pCheck = 
11210 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
11220 75 70 28 64 62 2c 20 70 43 4e 61 6d 65 73 2c 20  up(db, pCNames, 
11230 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b  EXPRDUP_REDUCE);
11240 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
11250 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 63  cFailed ) goto c
11260 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b  reate_view_fail;
11270 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
11280 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
11290 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
112a0 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70  nt.  Make sEnd p
112b0 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65  oint to.  ** the
112c0 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e   end..  */.  sEn
112d0 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73  d = pParse->sLas
112e0 74 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74  tToken;.  assert
112f0 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 29  ( sEnd.z[0]!=0 )
11300 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30  ;.  if( sEnd.z[0
11310 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45  ]!=';' ){.    sE
11320 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a  nd.z += sEnd.n;.
11330 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30    }.  sEnd.n = 0
11340 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73 45  ;.  n = (int)(sE
11350 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a  nd.z - pBegin->z
11360 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30  );.  assert( n>0
11370 20 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e   );.  z = pBegin
11380 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 73 71  ->z;.  while( sq
11390 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e  lite3Isspace(z[n
113a0 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  -1]) ){ n--; }. 
113b0 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31   sEnd.z = &z[n-1
113c0 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b  ];.  sEnd.n = 1;
113d0 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74  ..  /* Use sqlit
113e0 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20  e3EndTable() to 
113f0 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20  add the view to 
11400 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
11410 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  R table */.  sql
11420 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61  ite3EndTable(pPa
11430 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30  rse, 0, &sEnd, 0
11440 2c 20 30 29 3b 0a 0a 63 72 65 61 74 65 5f 76 69  , 0);..create_vi
11450 65 77 5f 66 61 69 6c 3a 0a 20 20 73 71 6c 69 74  ew_fail:.  sqlit
11460 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
11470 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  b, pSelect);.  s
11480 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
11490 6c 65 74 65 28 64 62 2c 20 70 43 4e 61 6d 65 73  lete(db, pCNames
114a0 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23  );.  return;.}.#
114b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
114c0 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69  OMIT_VIEW */..#i
114d0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
114e0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
114f0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
11500 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
11510 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62  E)./*.** The Tab
11520 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61  le structure pTa
11530 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ble is really a 
11540 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74  VIEW.  Fill in t
11550 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  he names of.** t
11560 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
11570 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54  e view in the pT
11580 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20  able structure. 
11590 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
115a0 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e  er.** of errors.
115b0 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73    If an error is
115c0 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65   seen leave an e
115d0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
115e0 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
115f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
11600 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
11610 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
11620 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
11630 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61  .  Table *pSelTa
11640 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74  b;   /* A fake t
11650 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  able from which 
11660 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c  we get the resul
11670 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63  t set */.  Selec
11680 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20  t *pSel;     /* 
11690 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  Copy of the SELE
116a0 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  CT that implemen
116b0 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  ts the view */. 
116c0 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20   int nErr = 0;  
116d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
116e0 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
116f0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ed */.  int n;  
11700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
11710 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74  porarily holds t
11720 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
11730 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f  sors assigned */
11740 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
11750 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a   pParse->db;  /*
11760 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
11770 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20  tion for malloc 
11780 65 72 72 6f 72 73 20 2a 2f 0a 23 69 66 6e 64 65  errors */.#ifnde
11790 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
117a0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 73 71  THORIZATION.  sq
117b0 6c 69 74 65 33 5f 78 61 75 74 68 20 78 41 75 74  lite3_xauth xAut
117c0 68 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65  h;       /* Save
117d0 64 20 78 41 75 74 68 20 70 6f 69 6e 74 65 72 20  d xAuth pointer 
117e0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
117f0 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a  ert( pTable );..
11800 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11810 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
11820 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 74  .  if( sqlite3Vt
11830 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50  abCallConnect(pP
11840 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b  arse, pTable) ){
11850 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11860 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
11870 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
11880 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30  able) ) return 0
11890 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ;.#endif..#ifnde
118a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
118b0 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69  EW.  /* A positi
118c0 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68  ve nCol means th
118d0 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20  e columns names 
118e0 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72  for this view ar
118f0 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b  e.  ** already k
11900 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nown..  */.  if(
11910 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20   pTable->nCol>0 
11920 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
11930 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * A negative nCo
11940 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d  l is a special m
11950 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68  arker meaning th
11960 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e  at we are curren
11970 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20  tly.  ** trying 
11980 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63  to compute the c
11990 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66  olumn names.  If
119a0 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72   we enter this r
119b0 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a  outine with.  **
119c0 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   a negative nCol
119d0 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f  , it means two o
119e0 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72  r more views for
119f0 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74  m a loop, like t
11a00 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
11a10 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f     CREATE VIEW o
11a20 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  ne AS SELECT * F
11a30 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20  ROM two;.  **   
11a40 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77    CREATE VIEW tw
11a50 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  o AS SELECT * FR
11a60 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a  OM one;.  **.  *
11a70 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20  * Actually, the 
11a80 65 72 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e  error above is n
11a90 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f 72 20  ow caught prior 
11aa0 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73  to reaching this
11ab0 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74   point..  ** But
11ac0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
11ad0 65 73 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70  est is still imp
11ae0 6f 72 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65  ortant as it doe
11af0 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69  s come up.  ** i
11b00 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  n the following:
11b10 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20  .  ** .  **     
11b20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69  CREATE TABLE mai
11b30 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20  n.ex1(a);.  **  
11b40 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 56     CREATE TEMP V
11b50 49 45 57 20 65 78 31 20 41 53 20 53 45 4c 45 43  IEW ex1 AS SELEC
11b60 54 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20  T a FROM ex1;.  
11b70 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  **     SELECT * 
11b80 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20  FROM temp.ex1;. 
11b90 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
11ba0 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ->nCol<0 ){.    
11bb0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
11bc0 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73  pParse, "view %s
11bd0 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64   is circularly d
11be0 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d  efined", pTable-
11bf0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
11c00 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 1;.  }.  ass
11c10 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ert( pTable->nCo
11c20 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  l>=0 );..  /* If
11c30 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
11c40 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65  , it means we ne
11c50 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
11c60 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20  e table names.. 
11c70 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
11c80 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
11c90 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
11ca0 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64  ct() will expand
11cb0 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c   any.  ** "*" el
11cc0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65  ements in the re
11cd0 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65  sults set of the
11ce0 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61   view and will a
11cf0 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20  ssign cursors.  
11d00 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e  ** to the elemen
11d10 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ts of the FROM c
11d20 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64  lause.  But we d
11d30 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65  o not want these
11d40 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f   changes.  ** to
11d50 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20   be permanent.  
11d60 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  So the computati
11d70 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20  on is done on a 
11d80 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
11d90 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  CT.  ** statemen
11da0 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
11db0 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20  he view..  */.  
11dc0 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
11dd0 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65  pSelect );.  pSe
11de0 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  l = sqlite3Selec
11df0 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d  tDup(db, pTable-
11e00 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
11e10 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20  if( pSel ){.    
11e20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  n = pParse->nTab
11e30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63  ;.    sqlite3Src
11e40 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
11e50 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e  s(pParse, pSel->
11e60 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62 6c  pSrc);.    pTabl
11e70 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20  e->nCol = -1;.  
11e80 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
11e90 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 23 69 66 6e  bDisable++;.#ifn
11ea0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11eb0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
11ec0 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41    xAuth = db->xA
11ed0 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75  uth;.    db->xAu
11ee0 74 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c  th = 0;.    pSel
11ef0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
11f00 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
11f10 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20  Parse, pSel);.  
11f20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41    db->xAuth = xA
11f30 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70  uth;.#else.    p
11f40 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
11f50 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
11f60 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b  t(pParse, pSel);
11f70 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72  .#endif.    pPar
11f80 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20  se->nTab = n;.  
11f90 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 70 43    if( pTable->pC
11fa0 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  heck ){.      /*
11fb0 20 43 52 45 41 54 45 20 56 49 45 57 20 6e 61 6d   CREATE VIEW nam
11fc0 65 28 61 72 67 6c 69 73 74 29 20 41 53 20 2e 2e  e(arglist) AS ..
11fd0 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e  ..      ** The n
11fe0 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75  ames of the colu
11ff0 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
12000 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 0a   are taken from.
12010 20 20 20 20 20 20 2a 2a 20 61 72 67 6c 69 73 74        ** arglist
12020 20 77 68 69 63 68 20 69 73 20 73 74 6f 72 65 64   which is stored
12030 20 69 6e 20 70 54 61 62 6c 65 2d 3e 70 43 68 65   in pTable->pChe
12040 63 6b 2e 20 20 54 68 65 20 70 43 68 65 63 6b 20  ck.  The pCheck 
12050 66 69 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20 6e  field.      ** n
12060 6f 72 6d 61 6c 6c 79 20 68 6f 6c 64 73 20 43 48  ormally holds CH
12070 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ECK constraints 
12080 6f 6e 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74  on an ordinary t
12090 61 62 6c 65 2c 20 62 75 74 20 66 6f 72 0a 20 20  able, but for.  
120a0 20 20 20 20 2a 2a 20 61 20 56 49 45 57 20 69 74      ** a VIEW it
120b0 20 68 6f 6c 64 73 20 74 68 65 20 6c 69 73 74 20   holds the list 
120c0 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  of column names.
120d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
120e0 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
120f0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
12100 65 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63  e, pTable->pChec
12110 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  k, .            
12120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12130 20 20 20 20 20 26 70 54 61 62 6c 65 2d 3e 6e 43       &pTable->nC
12140 6f 6c 2c 20 26 70 54 61 62 6c 65 2d 3e 61 43 6f  ol, &pTable->aCo
12150 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  l);.      if( db
12160 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
12170 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61  0 .       && pPa
12180 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 0a 20 20 20  rse->nErr==0.   
12190 20 20 20 20 26 26 20 70 54 61 62 6c 65 2d 3e 6e      && pTable->n
121a0 43 6f 6c 3d 3d 70 53 65 6c 2d 3e 70 45 4c 69 73  Col==pSel->pELis
121b0 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 29  t->nExpr.      )
121c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
121d0 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e  3SelectAddColumn
121e0 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
121f0 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 2c  (pParse, pTable,
12200 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   pSel);.      }.
12210 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53      }else if( pS
12220 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20 2f  elTab ){.      /
12230 2a 20 43 52 45 41 54 45 20 56 49 45 57 20 6e 61  * CREATE VIEW na
12240 6d 65 20 41 53 2e 2e 2e 20 20 77 69 74 68 6f 75  me AS...  withou
12250 74 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 6c 69  t an argument li
12260 73 74 2e 20 20 43 6f 6e 73 74 72 75 63 74 0a 20  st.  Construct. 
12270 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75       ** the colu
12280 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68  mn names from th
12290 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
122a0 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
122b0 74 68 65 20 76 69 65 77 2e 0a 20 20 20 20 20 20  the view..      
122c0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
122d0 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30   pTable->aCol==0
122e0 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65   );.      pTable
122f0 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
12300 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54  ->nCol;.      pT
12310 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65  able->aCol = pSe
12320 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
12330 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
12340 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  = 0;.      pSelT
12350 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
12360 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
12370 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
12380 6c 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c 65  ld(db, 0, pTable
12390 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
123a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
123b0 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
123c0 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20  .      nErr++;. 
123d0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
123e0 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
123f0 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 73 71  pSelTab);.    sq
12400 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
12410 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20  e(db, pSel);.   
12420 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
12430 44 69 73 61 62 6c 65 2d 2d 3b 0a 20 20 7d 20 65  Disable--;.  } e
12440 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b  lse {.    nErr++
12450 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e  ;.  }.  pTable->
12460 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 46  pSchema->schemaF
12470 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73  lags |= DB_Unres
12480 65 74 56 69 65 77 73 3b 0a 23 65 6e 64 69 66 20  etViews;.#endif 
12490 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
124a0 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  IEW */.  return 
124b0 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66  nErr;  .}.#endif
124c0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
124d0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
124e0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
124f0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
12500 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  BLE) */..#ifndef
12510 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
12520 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  W./*.** Clear th
12530 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
12540 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69  rom every VIEW i
12550 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a  n database idx..
12560 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
12570 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
12580 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  l(sqlite3 *db, i
12590 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45  nt idx){.  HashE
125a0 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74  lem *i;.  assert
125b0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
125c0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78  utexHeld(db, idx
125d0 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44  , 0) );.  if( !D
125e0 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
125f0 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
12600 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b  Views) ) return;
12610 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48  .  for(i=sqliteH
12620 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44  ashFirst(&db->aD
12630 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[idx].pSchema->
12640 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71  tblHash); i;i=sq
12650 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
12660 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
12670 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
12680 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(i);.    if( p
12690 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
126a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
126b0 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64  eteColumnNames(d
126c0 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
126d0 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  pTab->aCol = 0;.
126e0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
126f0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
12700 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
12710 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
12720 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23  resetViews);.}.#
12730 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71  else.# define sq
12740 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
12750 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20  (A,B).#endif /* 
12760 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
12770 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
12780 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
12790 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74  ed by the VDBE t
127a0 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74  o adjust the int
127b0 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
127c0 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77  used by SQLite w
127d0 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61  hen the btree la
127e0 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c  yer moves a tabl
127f0 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65  e root page. The
12800 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  .** root-page of
12810 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
12820 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44  x in database iD
12830 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72  b has changed fr
12840 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69  om iFrom.** to i
12850 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74  To..**.** Ticket
12860 20 23 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d   #1728:  The sym
12870 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20  bol table might 
12880 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e  still contain in
12890 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20  formation.** on 
128a0 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e  tables and/or in
128b0 64 69 63 65 73 20 74 68 61 74 20 61 72 65 20 74  dices that are t
128c0 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  he process of be
128d0 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20  ing deleted..** 
128e0 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63  If you are unluc
128f0 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  ky, one of those
12900 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73   deleted indices
12910 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74   or tables might
12920 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d  .** have the sam
12930 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65  e rootpage numbe
12940 72 20 61 73 20 74 68 65 20 72 65 61 6c 20 74 61  r as the real ta
12950 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61  ble or index tha
12960 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f  t is.** being mo
12970 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e  ved.  So we cann
12980 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e  ot stop searchin
12990 67 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73  g after the firs
129a0 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61  t match .** beca
129b0 75 73 65 20 74 68 65 20 66 69 72 73 74 20 6d 61  use the first ma
129c0 74 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72  tch might be for
129d0 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65   one of the dele
129e0 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f  ted indices.** o
129f0 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74  r tables and not
12a00 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
12a10 20 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c   that is actuall
12a20 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a  y being moved..*
12a30 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e  * We must contin
12a40 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ue looping until
12a50 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20   all tables and 
12a60 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20  indices with.** 
12a70 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20  rootpage==iFrom 
12a80 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72  have been conver
12a90 74 65 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f  ted to have a ro
12aa0 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a  otpage of iTo.**
12ab0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
12ac0 63 65 72 74 61 69 6e 20 74 68 61 74 20 77 65 20  certain that we 
12ad0 67 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e  got the right on
12ae0 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
12af0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
12b00 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65  CUUM.void sqlite
12b10 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73  3RootPageMoved(s
12b20 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
12b30 69 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  iDb, int iFrom, 
12b40 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68  int iTo){.  Hash
12b50 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48  Elem *pElem;.  H
12b60 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62  ash *pHash;.  Db
12b70 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74   *pDb;..  assert
12b80 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
12b90 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
12ba0 2c 20 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20  , 0) );.  pDb = 
12bb0 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
12bc0 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70   pHash = &pDb->p
12bd0 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b  Schema->tblHash;
12be0 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
12bf0 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61  iteHashFirst(pHa
12c00 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
12c10 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
12c20 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
12c30 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
12c40 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
12c50 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
12c60 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a  >tnum==iFrom ){.
12c70 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d        pTab->tnum
12c80 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20   = iTo;.    }.  
12c90 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62  }.  pHash = &pDb
12ca0 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
12cb0 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  sh;.  for(pElem=
12cc0 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
12cd0 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
12ce0 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
12cf0 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
12d00 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73   Index *pIdx = s
12d10 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
12d20 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49  lem);.    if( pI
12d30 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  dx->tnum==iFrom 
12d40 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74  ){.      pIdx->t
12d50 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d  num = iTo;.    }
12d60 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
12d70 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20  *.** Write code 
12d80 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62  to erase the tab
12d90 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
12da0 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61  e iTable from da
12db0 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41  tabase iDb..** A
12dc0 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74  lso write code t
12dd0 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c  o modify the sql
12de0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
12df0 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63   and internal sc
12e00 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f  hema.** if a roo
12e10 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65  t-page of anothe
12e20 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64  r table is moved
12e30 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61   by the btree-la
12e40 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72  yer whilst.** er
12e50 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68  asing iTable (th
12e60 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69  is can happen wi
12e70 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  th an auto-vacuu
12e80 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20  m database)..*/ 
12e90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
12ea0 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72  troyRootPage(Par
12eb0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
12ec0 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29  iTable, int iDb)
12ed0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
12ee0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
12ef0 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d  rse);.  int r1 =
12f00 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
12f10 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  eg(pParse);.  as
12f20 73 65 72 74 28 20 69 54 61 62 6c 65 3e 31 20 29  sert( iTable>1 )
12f30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12f40 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73 74  ddOp3(v, OP_Dest
12f50 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c  roy, iTable, r1,
12f60 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
12f70 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
12f80 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
12f90 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
12fa0 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  /* OP_Destroy
12fb0 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e   stores an in in
12fc0 74 65 67 65 72 20 72 31 2e 20 49 66 20 74 68 69  teger r1. If thi
12fd0 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69  s integer.  ** i
12fe0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
12ff0 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
13000 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
13010 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a   table moved to.
13020 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54    ** location iT
13030 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  able. The follow
13040 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65  ing code modifie
13050 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  s the sqlite_mas
13060 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a  ter table to.  *
13070 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a  * reflect this..
13080 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23    **.  ** The "#
13090 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53 51 4c 20  NNN" in the SQL 
130a0 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e  is a special con
130b0 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73  stant that means
130c0 20 77 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a   whatever value.
130d0 20 20 2a 2a 20 69 73 20 69 6e 20 72 65 67 69 73    ** is in regis
130e0 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72  ter NNN.  See gr
130f0 61 6d 6d 61 72 20 72 75 6c 65 73 20 61 73 73 6f  ammar rules asso
13100 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
13110 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 2a 2a  TK_REGISTER.  **
13120 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64 69 74   token for addit
13130 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
13140 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  n..  */.  sqlite
13150 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
13160 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41  rse, .     "UPDA
13170 54 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f  TE %Q.%s SET roo
13180 74 70 61 67 65 3d 25 64 20 57 48 45 52 45 20 23  tpage=%d WHERE #
13190 25 64 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d  %d AND rootpage=
131a0 23 25 64 22 2c 0a 20 20 20 20 20 70 50 61 72 73  #%d",.     pPars
131b0 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
131c0 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52  zDbSName, MASTER
131d0 5f 4e 41 4d 45 2c 20 69 54 61 62 6c 65 2c 20 72  _NAME, iTable, r
131e0 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20  1, r1);.#endif. 
131f0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
13200 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
13210 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  1);.}../*.** Wri
13220 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20  te VDBE code to 
13230 65 72 61 73 65 20 74 61 62 6c 65 20 70 54 61 62  erase table pTab
13240 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61   and all associa
13250 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64  ted indices on d
13260 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20  isk..** Code to 
13270 75 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74  update the sqlit
13280 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20  e_master tables 
13290 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  and internal sch
132a0 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a  ema definitions.
132b0 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f  ** in case a roo
132c0 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  t-page belonging
132d0 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   to another tabl
132e0 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
132f0 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a  e btree layer.**
13300 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28   is also added (
13310 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
13320 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63  with an auto-vac
13330 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  uum database)..*
13340 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
13350 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65  stroyTable(Parse
13360 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
13370 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20 53  *pTab){.#ifdef S
13380 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
13390 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70  ACUUM.  Index *p
133a0 49 64 78 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d  Idx;.  int iDb =
133b0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
133c0 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
133d0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
133e0 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  ;.  destroyRootP
133f0 61 67 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  age(pParse, pTab
13400 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
13410 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
13420 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
13430 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
13440 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
13450 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 64 78  age(pParse, pIdx
13460 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
13470 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20  }.#else.  /* If 
13480 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
13490 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   be auto-vacuum 
134a0 63 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49  capable (if SQLI
134b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
134c0 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64  UM.  ** is not d
134d0 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74  efined), then it
134e0 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
134f0 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79   call OP_Destroy
13500 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62   on the.  ** tab
13510 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f  le and index roo
13520 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72  t-pages in order
13530 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
13540 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20  the numerically 
13550 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f  .  ** largest ro
13560 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ot-page number. 
13570 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20  This guarantees 
13580 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65  that none of the
13590 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a   root-pages.  **
135a0 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64   to be destroyed
135b0 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79   is relocated by
135c0 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44   an earlier OP_D
135d0 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20  estroy. i.e. if 
135e0 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  the.  ** followi
135f0 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20  ng were coded:. 
13600 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74   **.  ** OP_Dest
13610 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e  roy 4 0.  ** ...
13620 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
13630 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61   5 0.  **.  ** a
13640 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68  nd root page 5 h
13650 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68  appened to be th
13660 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
13670 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68  age number in th
13680 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c  e.  ** database,
13690 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20   then root page 
136a0 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64  5 would be moved
136b0 20 74 6f 20 70 61 67 65 20 34 20 62 79 20 74 68   to page 4 by th
136c0 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74  e .  ** "OP_Dest
136d0 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e  roy 4 0" opcode.
136e0 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   The subsequent 
136f0 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22  "OP_Destroy 5 0"
13700 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20   would hit.  ** 
13710 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65  a free-list page
13720 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ..  */.  int iTa
13730 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a  b = pTab->tnum;.
13740 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64    int iDestroyed
13750 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
13760 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  1 ){.    Index *
13770 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c  pIdx;.    int iL
13780 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20  argest = 0;..   
13790 20 69 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d   if( iDestroyed=
137a0 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74  =0 || iTab<iDest
137b0 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69  royed ){.      i
137c0 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a  Largest = iTab;.
137d0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49      }.    for(pI
137e0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
137f0 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
13800 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
13810 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d  int iIdx = pIdx-
13820 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73  >tnum;.      ass
13830 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65  ert( pIdx->pSche
13840 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
13850 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  a );.      if( (
13860 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c  iDestroyed==0 ||
13870 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65   (iIdx<iDestroye
13880 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72  d)) && iIdx>iLar
13890 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  gest ){.        
138a0 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b  iLargest = iIdx;
138b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
138c0 20 20 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d     if( iLargest=
138d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
138e0 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rn;.    }else{. 
138f0 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
13900 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
13910 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
13920 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
13930 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44        assert( iD
13940 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72  b>=0 && iDb<pPar
13950 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  se->db->nDb );. 
13960 20 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74       destroyRoot
13970 50 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61  Page(pParse, iLa
13980 72 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20 20  rgest, iDb);.   
13990 20 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20     iDestroyed = 
139a0 69 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a  iLargest;.    }.
139b0 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
139c0 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74 72 69  .** Remove entri
139d0 65 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  es from the sqli
139e0 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 20  te_statN tables 
139f0 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33  (for N in (1,2,3
13a00 29 29 0a 2a 2a 20 61 66 74 65 72 20 61 20 44 52  )).** after a DR
13a10 4f 50 20 49 4e 44 45 58 20 6f 72 20 44 52 4f 50  OP INDEX or DROP
13a20 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a   TABLE command..
13a30 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
13a40 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54  qlite3ClearStatT
13a50 61 62 6c 65 73 28 0a 20 20 50 61 72 73 65 20 2a  ables(.  Parse *
13a60 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
13a70 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
13a80 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
13a90 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  iDb,            
13aa0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
13ab0 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63  se number */.  c
13ac0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
13ad0 2c 20 20 20 20 20 2f 2a 20 22 69 64 78 22 20 6f  ,     /* "idx" o
13ae0 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e  r "tbl" */.  con
13af0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
13b00 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69      /* Name of i
13b10 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f  ndex or table */
13b20 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  .){.  int i;.  c
13b30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
13b40 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  me = pParse->db-
13b50 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
13b60 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  me;.  for(i=1; i
13b70 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  <=4; i++){.    c
13b80 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a 20 20  har zTab[24];.  
13b90 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
13ba0 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 62 29 2c  tf(sizeof(zTab),
13bb0 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f 73 74 61  zTab,"sqlite_sta
13bc0 74 25 64 22 2c 69 29 3b 0a 20 20 20 20 69 66 28  t%d",i);.    if(
13bd0 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
13be0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54  e(pParse->db, zT
13bf0 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29 7b 0a  ab, zDbName) ){.
13c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
13c10 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
13c20 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
13c30 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
13c40 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20 20 20  E %s=%Q",.      
13c50 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62 2c    zDbName, zTab,
13c60 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20 20   zType, zName.  
13c70 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
13c80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
13c90 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f 70 20  te code to drop 
13ca0 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  a table..*/.void
13cb0 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70   sqlite3CodeDrop
13cc0 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
13cd0 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
13ce0 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69  , int iDb, int i
13cf0 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65 20 2a  sView){.  Vdbe *
13d00 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
13d10 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
13d20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
13d30 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20 3d 20  er;.  Db *pDb = 
13d40 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a  &db->aDb[iDb];..
13d50 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
13d60 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
13d70 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
13d80 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
13d90 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
13da0 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23  rse, 1, iDb);..#
13db0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13dc0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
13dd0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
13de0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
13df0 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
13e00 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20  , OP_VBegin);.  
13e10 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  }.#endif..  /* D
13e20 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73  rop all triggers
13e30 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
13e40 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
13e50 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20   dropped. Code. 
13e60 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64   ** is generated
13e70 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69   to remove entri
13e80 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d  es from sqlite_m
13e90 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 2a  aster and/or.  *
13ea0 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  * sqlite_temp_ma
13eb0 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65 64  ster if required
13ec0 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67 67 65  ..  */.  pTrigge
13ed0 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67  r = sqlite3Trigg
13ee0 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  erList(pParse, p
13ef0 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  Tab);.  while( p
13f00 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 61  Trigger ){.    a
13f10 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d  ssert( pTrigger-
13f20 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
13f30 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20  pSchema || .    
13f40 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53      pTrigger->pS
13f50 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
13f60 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ].pSchema );.   
13f70 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67   sqlite3DropTrig
13f80 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70  gerPtr(pParse, p
13f90 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 70 54  Trigger);.    pT
13fa0 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65  rigger = pTrigge
13fb0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23  r->pNext;.  }..#
13fc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13fd0 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
13fe0 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79  .  /* Remove any
13ff0 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20   entries of the 
14000 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
14010 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  table associated
14020 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 74   with.  ** the t
14030 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
14040 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  ed. This is done
14050 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c   before the tabl
14060 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 2a  e is dropped.  *
14070 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20 6c  * at the btree l
14080 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68  evel, in case th
14090 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
140a0 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f  e table needs to
140b0 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20  .  ** move as a 
140c0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72  result of the dr
140d0 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69  op (can happen i
140e0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
140f0 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  de)..  */.  if( 
14100 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
14110 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e   TF_Autoincremen
14120 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
14130 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
14140 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c 45 54  se,.      "DELET
14150 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65  E FROM %Q.sqlite
14160 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45 20  _sequence WHERE 
14170 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20  name=%Q",.      
14180 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 70  pDb->zDbSName, p
14190 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  Tab->zName.    )
141a0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
141b0 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49  /* Drop all SQLI
141c0 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
141d0 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65  and index entrie
141e0 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
141f0 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20  the.  ** table. 
14200 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65  The program name
14210 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74   loops through t
14220 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
14230 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a  and deletes.  **
14240 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20   every row that 
14250 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
14260 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
14270 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65  me as the one be
14280 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64  ing.  ** dropped
14290 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20 68  . Triggers are h
142a0 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c  andled separatel
142b0 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69 67  y because a trig
142c0 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20  ger can be.  ** 
142d0 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74  created in the t
142e0 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61  emp database tha
142f0 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
14300 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20  ble in another. 
14310 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
14320 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74  */.  sqlite3Nest
14330 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
14340 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46  .      "DELETE F
14350 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
14360 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20  tbl_name=%Q and 
14370 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22  type!='trigger'"
14380 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62  ,.      pDb->zDb
14390 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  SName, MASTER_NA
143a0 4d 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  ME, pTab->zName)
143b0 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  ;.  if( !isView 
143c0 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
143d0 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73 74 72  ab) ){.    destr
143e0 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  oyTable(pParse, 
143f0 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pTab);.  }..  /*
14400 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   Remove the tabl
14410 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c  e entry from SQL
14420 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73  ite's internal s
14430 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79  chema and modify
14440 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  .  ** the schema
14450 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20   cookie..  */.  
14460 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
14470 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
14480 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
14490 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44 62  OP_VDestroy, iDb
144a0 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  , 0, 0, pTab->zN
144b0 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  ame, 0);.  }.  s
144c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
144d0 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65  (v, OP_DropTable
144e0 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61  , iDb, 0, 0, pTa
144f0 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
14500 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
14510 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
14520 3b 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65  ;.  sqliteViewRe
14530 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b  setAll(db, iDb);
14540 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
14550 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
14560 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20   to do the work 
14570 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20  of a DROP TABLE 
14580 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e  statement..** pN
14590 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
145a0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
145b0 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76  be dropped..*/.v
145c0 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54  oid sqlite3DropT
145d0 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
145e0 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61  se, SrcList *pNa
145f0 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20  me, int isView, 
14600 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61  int noErr){.  Ta
14610 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62  ble *pTab;.  Vdb
14620 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
14630 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
14640 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
14650 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
14660 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
14670 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14680 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
14690 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
146a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61  );.  assert( pNa
146b0 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
146c0 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 64   if( sqlite3Read
146d0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
146e0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
146f0 74 61 62 6c 65 3b 0a 20 20 69 66 28 20 6e 6f 45  table;.  if( noE
14700 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73  rr ) db->suppres
14710 73 45 72 72 2b 2b 3b 0a 20 20 61 73 73 65 72 74  sErr++;.  assert
14720 28 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69  ( isView==0 || i
14730 73 56 69 65 77 3d 3d 4c 4f 43 41 54 45 5f 56 49  sView==LOCATE_VI
14740 45 57 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73  EW );.  pTab = s
14750 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
14760 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 69 73  eItem(pParse, is
14770 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b  View, &pName->a[
14780 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72  0]);.  if( noErr
14790 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45   ) db->suppressE
147a0 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61  rr--;..  if( pTa
147b0 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  b==0 ){.    if( 
147c0 6e 6f 45 72 72 20 29 20 73 71 6c 69 74 65 33 43  noErr ) sqlite3C
147d0 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
147e0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61  hema(pParse, pNa
147f0 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
14800 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  se);.    goto ex
14810 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
14820 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
14830 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
14840 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
14850 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  a);.  assert( iD
14860 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
14870 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nDb );..  /* If 
14880 70 54 61 62 20 69 73 20 61 20 76 69 72 74 75 61  pTab is a virtua
14890 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69  l table, call Vi
148a0 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
148b0 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a  () to ensure.  *
148c0 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69  * it is initiali
148d0 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  zed..  */.  if( 
148e0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
148f0 26 26 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  && sqlite3ViewGe
14900 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
14910 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20  rse, pTab) ){.  
14920 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
14930 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e  _table;.  }.#ifn
14940 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14950 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
14960 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
14970 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
14980 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
14990 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f  BLE(iDb);.    co
149a0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
149b0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
149c0 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  SName;.    const
149d0 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30   char *zArg2 = 0
149e0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
149f0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
14a00 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
14a10 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29  , zTab, 0, zDb))
14a20 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
14a30 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
14a40 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
14a50 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
14a60 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
14a70 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
14a80 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
14a90 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  DROP_TEMP_VIEW;.
14aa0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14ab0 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
14ac0 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20  TE_DROP_VIEW;.  
14ad0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
14ae0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
14af0 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65  LTABLE.    }else
14b00 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
14b10 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  Tab) ){.      co
14b20 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
14b30 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a  _VTABLE;.      z
14b40 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65  Arg2 = sqlite3Ge
14b50 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
14b60 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a  )->pMod->zName;.
14b70 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
14b80 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
14b90 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
14ba0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
14bb0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
14bc0 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
14bd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14be0 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
14bf0 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  DROP_TABLE;.    
14c00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
14c10 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
14c20 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
14c30 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41   pTab->zName, zA
14c40 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  rg2, zDb) ){.   
14c50 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14c60 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
14c70 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
14c80 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
14c90 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70  SQLITE_DELETE, p
14ca0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  Tab->zName, 0, z
14cb0 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
14cc0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
14cd0 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  e;.    }.  }.#en
14ce0 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65  dif.  if( sqlite
14cf0 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
14d00 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
14d10 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 20  , 7)==0 .    && 
14d20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
14d30 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
14d40 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29 21  lite_stat", 11)!
14d50 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
14d60 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14d70 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
14d80 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
14d90 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
14da0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14db0 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69  p_table;.  }..#i
14dc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14dd0 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75  T_VIEW.  /* Ensu
14de0 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73  re DROP TABLE is
14df0 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76   not used on a v
14e00 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49  iew, and DROP VI
14e10 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20  EW is not used. 
14e20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a   ** on a table..
14e30 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65    */.  if( isVie
14e40 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
14e50 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
14e60 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14e70 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54  rse, "use DROP T
14e80 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74  ABLE to delete t
14e90 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e  able %s", pTab->
14ea0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
14eb0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14ec0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56  ;.  }.  if( !isV
14ed0 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
14ee0 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
14ef0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14f00 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49  se, "use DROP VI
14f10 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65  EW to delete vie
14f20 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  w %s", pTab->zNa
14f30 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
14f40 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
14f50 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
14f60 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
14f70 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
14f80 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
14f90 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
14fa0 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
14fb0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
14fc0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
14fd0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
14fe0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
14ff0 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
15000 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  b);.    sqlite3C
15010 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70  learStatTables(p
15020 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74 62 6c  Parse, iDb, "tbl
15030 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
15040 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44 72  .    sqlite3FkDr
15050 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
15060 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20  pName, pTab);.  
15070 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f    sqlite3CodeDro
15080 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  pTable(pParse, p
15090 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77  Tab, iDb, isView
150a0 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
150b0 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74  p_table:.  sqlit
150c0 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
150d0 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, pName);.}../
150e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
150f0 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  e is called to c
15100 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65  reate a new fore
15110 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74  ign key on the t
15120 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  able.** currentl
15130 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
15140 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20  tion.  pFromCol 
15150 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
15160 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
15170 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
15180 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f   point to the fo
15190 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70  reign key.  If p
151a0 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a  FromCol==0 then.
151b0 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b  ** connect the k
151c0 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63  ey to the last c
151d0 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20  olumn inserted. 
151e0 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65   pTo is the name
151f0 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
15200 20 72 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e   referred to (a.
15210 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74 22  k.a the "parent"
15220 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c   table).  pToCol
15230 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66   is a list.** of
15240 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
15250 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e  arent pTo table.
15260 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
15270 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
15280 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
15290 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
152a0 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
152b0 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
152c0 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
152d0 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
152e0 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
152f0 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
15300 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
15310 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
15320 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
15330 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
15340 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
15350 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
15360 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  field..**.** The
15370 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
15380 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
15390 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
153a0 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
153b0 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
153c0 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
153d0 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
153e0 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
153f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
15400 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
15410 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
15420 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
15430 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
15440 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
15450 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
15460 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
15470 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
15480 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
15490 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
154a0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
154b0 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
154c0 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
154d0 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
154e0 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
154f0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
15500 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
15510 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
15520 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
15530 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
15540 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
15550 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
15560 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
15570 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
15580 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e   = 0;.  FKey *pN
15590 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a  extTo;.  Table *
155a0 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
155b0 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
155c0 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
155d0 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
155e0 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
155f0 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
15600 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  ==0 || IN_DECLAR
15610 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b  E_VTAB ) goto fk
15620 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
15630 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
15640 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
15650 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  l-1;.    if( NEV
15660 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74  ER(iCol<0) ) got
15670 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66  o fk_end;.    if
15680 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
15690 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  ol->nExpr!=1 ){.
156a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
156b0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
156c0 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73  oreign key on %s
156d0 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f  ".         " sho
156e0 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  uld reference on
156f0 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ly one column of
15700 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20   table %T",.    
15710 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f       p->aCol[iCo
15720 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a  l].zName, pTo);.
15730 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
15740 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  d;.    }.    nCo
15750 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l = 1;.  }else i
15760 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
15770 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f  Col->nExpr!=pFro
15780 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  mCol->nExpr ){. 
15790 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
157a0 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
157b0 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
157c0 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
157d0 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
157e0 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
157f0 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
15800 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
15810 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a  renced table");.
15820 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
15830 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
15840 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  ol = pFromCol->n
15850 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  Expr;.  }.  nByt
15860 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
15870 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69  y) + (nCol-1)*si
15880 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
15890 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
158a0 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
158b0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
158c0 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b  i<pToCol->nExpr;
158d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
158e0 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
158f0 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
15900 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
15910 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
15920 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
15930 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
15940 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
15950 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  =0 ){.    goto f
15960 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b  k_end;.  }.  pFK
15970 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
15980 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
15990 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
159a0 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
159b0 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20  y->aCol[nCol];. 
159c0 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b   pFKey->zTo = z;
159d0 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f  .  memcpy(z, pTo
159e0 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20  ->z, pTo->n);.  
159f0 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  z[pTo->n] = 0;. 
15a00 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
15a10 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e  z);.  z += pTo->
15a20 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  n+1;.  pFKey->nC
15a30 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
15a40 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
15a50 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
15a60 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
15a70 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
15a80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
15a90 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
15aa0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
15ab0 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
15ac0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
15ad0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
15ae0 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
15af0 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
15b00 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
15b10 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
15b20 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
15b30 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
15b40 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
15b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
15b60 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
15b70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
15b80 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
15b90 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
15ba0 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
15bb0 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
15bc0 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
15bd0 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
15be0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
15bf0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
15c00 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
15c10 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
15c20 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
15c30 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
15c40 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
15c50 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
15c60 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
15c70 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
15c80 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
15c90 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  z;.      memcpy(
15ca0 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
15cb0 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
15cc0 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
15cd0 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
15ce0 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
15cf0 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
15d00 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30  pFKey->aAction[0
15d10 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26  ] = (u8)(flags &
15d20 20 30 78 66 66 29 3b 20 20 20 20 20 20 20 20 20   0xff);         
15d30 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20     /* ON DELETE 
15d40 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65  action */.  pFKe
15d50 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20  y->aAction[1] = 
15d60 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38  (u8)((flags >> 8
15d70 20 29 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f   ) & 0xff);    /
15d80 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69  * ON UPDATE acti
15d90 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  on */..  assert(
15da0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
15db0 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
15dc0 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
15dd0 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65 79 20  pNextTo = (FKey 
15de0 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  *)sqlite3HashIns
15df0 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d  ert(&p->pSchema-
15e00 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20 20 20  >fkeyHash, .    
15e10 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76    pFKey->zTo, (v
15e20 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b  oid *)pFKey.  );
15e30 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d  .  if( pNextTo==
15e40 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  pFKey ){.    sql
15e50 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
15e60 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
15e70 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65  d;.  }.  if( pNe
15e80 78 74 54 6f 20 29 7b 0a 20 20 20 20 61 73 73 65  xtTo ){.    asse
15e90 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72  rt( pNextTo->pPr
15ea0 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70  evTo==0 );.    p
15eb0 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20  FKey->pNextTo = 
15ec0 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65  pNextTo;.    pNe
15ed0 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20  xtTo->pPrevTo = 
15ee0 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pFKey;.  }..  /*
15ef0 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67   Link the foreig
15f00 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62  n key to the tab
15f10 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73  le as the last s
15f20 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  tep..  */.  p->p
15f30 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20  FKey = pFKey;.  
15f40 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65  pFKey = 0;..fk_e
15f50 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  nd:.  sqlite3DbF
15f60 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a  ree(db, pFKey);.
15f70 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
15f80 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
15f90 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20  OREIGN_KEY) */. 
15fa0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
15fb0 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d  Delete(db, pFrom
15fc0 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Col);.  sqlite3E
15fd0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
15fe0 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a  , pToCol);.}../*
15ff0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16000 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
16010 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  an INITIALLY IMM
16020 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41  EDIATE or INITIA
16030 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20  LLY DEFERRED.** 
16040 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61  clause is seen a
16050 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65  s part of a fore
16060 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
16070 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72  on.  The isDefer
16080 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  red.** parameter
16090 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41   is 1 for INITIA
160a0 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64  LLY DEFERRED and
160b0 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   0 for INITIALLY
160c0 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54   IMMEDIATE..** T
160d0 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
160e0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
160f0 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e   created foreign
16100 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64   key is adjusted
16110 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  .** accordingly.
16120 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
16130 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
16140 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
16150 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a  nt isDeferred){.
16160 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16170 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
16180 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
16190 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20   FKey *pFKey;.  
161a0 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72  if( (pTab = pPar
161b0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
161c0 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54  0 || (pFKey = pT
161d0 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20  ab->pFKey)==0 ) 
161e0 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
161f0 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20  ( isDeferred==0 
16200 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31  || isDeferred==1
16210 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33   ); /* EV: R-303
16220 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70 46  23-21917 */.  pF
16230 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
16240 3d 20 28 75 38 29 69 73 44 65 66 65 72 72 65 64  = (u8)isDeferred
16250 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
16260 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
16270 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20  that will erase 
16280 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78  and refill index
16290 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73   *pIdx.  This is
162a0 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74  .** used to init
162b0 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63  ialize a newly c
162c0 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20  reated index or 
162d0 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65  to recompute the
162e0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  .** content of a
162f0 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f  n index in respo
16300 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58  nse to a REINDEX
16310 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
16320 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69  if memRootPage i
16330 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20  s not negative, 
16340 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
16350 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79  e index is newly
16360 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68  .** created.  Th
16370 65 20 72 65 67 69 73 74 65 72 20 73 70 65 63 69  e register speci
16380 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50  fied by memRootP
16390 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  age contains the
163a0 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  .** root page nu
163b0 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
163c0 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61  x.  If memRootPa
163d0 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
163e0 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65  then.** the inde
163f0 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
16400 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65   and must be cle
16410 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ared before bein
16420 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a  g refilled and.*
16430 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * the root page 
16440 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
16450 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  dex is taken fro
16460 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a  m pIndex->tnum..
16470 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
16480 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
16490 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
164a0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20   Index *pIndex, 
164b0 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29  int memRootPage)
164c0 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
164d0 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
164e0 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  ;  /* The table 
164f0 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20  that is indexed 
16500 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
16510 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
16520 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
16530 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61  sor used for pTa
16540 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20  b */.  int iIdx 
16550 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
16560 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63  ;     /* Btree c
16570 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
16580 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  Index */.  int i
16590 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20 20 20  Sorter;         
165a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
165b0 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 4f 70  sor opened by Op
165c0 65 6e 53 6f 72 74 65 72 20 28 69 66 20 69 6e 20  enSorter (if in 
165d0 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64  use) */.  int ad
165e0 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
165f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
16600 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f  ess of top of lo
16610 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
16620 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
16630 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
16640 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72  s to jump to for
16650 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
16660 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20  */.  int tnum;  
16670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16680 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
16690 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   of index */.  i
166a0 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c  nt iPartIdxLabel
166b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
166c0 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61   Jump to this la
166d0 62 65 6c 20 74 6f 20 73 6b 69 70 20 61 20 72 6f  bel to skip a ro
166e0 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  w */.  Vdbe *v; 
166f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16700 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
16710 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
16720 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
16730 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
16740 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
16750 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20       /* KeyInfo 
16760 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  for index */.  i
16770 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20  nt regRecord;   
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16790 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
167a0 67 20 61 73 73 65 6d 62 6c 65 64 20 69 6e 64 65  g assembled inde
167b0 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
167c0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
167d0 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20  se->db;      /* 
167e0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
167f0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
16800 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
16810 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
16820 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
16830 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
16840 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
16850 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74  TION.  if( sqlit
16860 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
16870 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44  se, SQLITE_REIND
16880 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  EX, pIndex->zNam
16890 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e  e, 0,.      db->
168a0 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
168b0 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e ) ){.    retur
168c0 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
168d0 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77 72   /* Require a wr
168e0 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
168f0 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d  table to perform
16900 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
16910 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  */.  sqlite3Tabl
16920 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
16930 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31  b, pTab->tnum, 1
16940 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
16950 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
16960 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
16970 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
16980 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f  rn;.  if( memRoo
16990 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  tPage>=0 ){.    
169a0 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61  tnum = memRootPa
169b0 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
169c0 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e   tnum = pIndex->
169d0 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79  tnum;.  }.  pKey
169e0 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
169f0 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c  oOfIndex(pParse,
16a00 20 70 49 6e 64 65 78 29 3b 0a 20 20 61 73 73 65   pIndex);.  asse
16a10 72 74 28 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64  rt( pKey!=0 || d
16a20 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
16a30 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
16a40 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  );..  /* Open th
16a50 65 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72 20  e sorter cursor 
16a60 69 66 20 77 65 20 61 72 65 20 74 6f 20 75 73 65  if we are to use
16a70 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53 6f 72 74   one. */.  iSort
16a80 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  er = pParse->nTa
16a90 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  b++;.  sqlite3Vd
16aa0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
16ab0 6f 72 74 65 72 4f 70 65 6e 2c 20 69 53 6f 72 74  orterOpen, iSort
16ac0 65 72 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e  er, 0, pIndex->n
16ad0 4b 65 79 43 6f 6c 2c 20 28 63 68 61 72 2a 29 0a  KeyCol, (char*).
16ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16af0 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
16b00 66 6f 52 65 66 28 70 4b 65 79 29 2c 20 50 34 5f  foRef(pKey), P4_
16b10 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20  KEYINFO);..  /* 
16b20 4f 70 65 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  Open the table. 
16b30 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
16b40 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62   rows of the tab
16b50 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67 20 69 6e  le, inserting in
16b60 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73  dex.  ** records
16b70 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72   into the sorter
16b80 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70  . */.  sqlite3Op
16b90 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
16ba0 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c  iTab, iDb, pTab,
16bb0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
16bc0 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
16bd0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16be0 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30  _Rewind, iTab, 0
16bf0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16c00 76 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20  v);.  regRecord 
16c10 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
16c20 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  Reg(pParse);..  
16c30 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
16c40 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 70  ndexKey(pParse,p
16c50 49 6e 64 65 78 2c 69 54 61 62 2c 72 65 67 52 65  Index,iTab,regRe
16c60 63 6f 72 64 2c 30 2c 26 69 50 61 72 74 49 64 78  cord,0,&iPartIdx
16c70 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a 20 20 73 71  Label,0,0);.  sq
16c80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16c90 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  v, OP_SorterInse
16ca0 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67  rt, iSorter, reg
16cb0 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
16cc0 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49 64 78  e3ResolvePartIdx
16cd0 4c 61 62 65 6c 28 70 50 61 72 73 65 2c 20 69 50  Label(pParse, iP
16ce0 61 72 74 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20  artIdxLabel);.  
16cf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16d00 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  2(v, OP_Next, iT
16d10 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 20 56 64  ab, addr1+1); Vd
16d20 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16d30 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
16d40 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
16d50 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
16d60 65 3c 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  e<0 ) sqlite3Vdb
16d70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
16d80 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b  ear, tnum, iDb);
16d90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16da0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp4(v, OP_OpenW
16db0 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d  rite, iIdx, tnum
16dc0 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20  , iDb, .        
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
16de0 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59  r *)pKey, P4_KEY
16df0 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
16e00 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
16e10 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 28  OPFLAG_BULKCSR|(
16e20 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 29  (memRootPage>=0)
16e30 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 3a  ?OPFLAG_P2ISREG:
16e40 30 29 29 3b 0a 0a 20 20 61 64 64 72 31 20 3d 20  0));..  addr1 = 
16e50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16e60 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f  2(v, OP_SorterSo
16e70 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 30 29 3b  rt, iSorter, 0);
16e80 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
16e90 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75 65  ;.  if( IsUnique
16ea0 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29 7b  Index(pIndex) ){
16eb0 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d 20 73 71  .    int j2 = sq
16ec0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
16ed0 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20 20 20  Addr(v) + 3;.   
16ee0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
16ef0 28 76 2c 20 6a 32 29 3b 0a 20 20 20 20 61 64 64  (v, j2);.    add
16f00 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
16f10 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
16f20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16f30 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53  ddOp4Int(v, OP_S
16f40 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20 69 53  orterCompare, iS
16f50 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67 52 65  orter, j2, regRe
16f60 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20  cord,.          
16f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16f80 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b  Index->nKeyCol);
16f90 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
16fa0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69  ;.    sqlite3Uni
16fb0 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  queConstraint(pP
16fc0 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20  arse, OE_Abort, 
16fd0 70 49 6e 64 65 78 29 3b 0a 20 20 7d 65 6c 73 65  pIndex);.  }else
16fe0 7b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  {.    addr2 = sq
16ff0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
17000 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73  Addr(v);.  }.  s
17010 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
17020 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
17030 61 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52  a, iSorter, regR
17040 65 63 6f 72 64 2c 20 69 49 64 78 29 3b 0a 20 20  ecord, iIdx);.  
17050 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17060 33 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 69 49  3(v, OP_Last, iI
17070 64 78 2c 20 30 2c 20 2d 31 29 3b 0a 20 20 73 71  dx, 0, -1);.  sq
17080 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17090 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
170a0 20 69 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64   iIdx, regRecord
170b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
170c0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
170d0 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
170e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
170f0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
17100 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
17110 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17120 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
17130 65 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64  ext, iSorter, ad
17140 64 72 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61  dr2); VdbeCovera
17150 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
17160 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
17170 61 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74  addr1);..  sqlit
17180 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
17190 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b  OP_Close, iTab);
171a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
171b0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
171c0 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74  , iIdx);.  sqlit
171d0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
171e0 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65  OP_Close, iSorte
171f0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  r);.}../*.** All
17200 6f 63 61 74 65 20 68 65 61 70 20 73 70 61 63 65  ocate heap space
17210 20 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65   to hold an Inde
17220 78 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 43  x object with nC
17230 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a  ol columns..**.*
17240 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 61  * Increase the a
17250 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 74  llocation size t
17260 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 65 78 74  o provide an ext
17270 72 61 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a  ra nExtra bytes.
17280 2a 2a 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69  ** of 8-byte ali
17290 67 6e 65 64 20 73 70 61 63 65 20 61 66 74 65 72  gned space after
172a0 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
172b0 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a  t and return a.*
172c0 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  * pointer to thi
172d0 73 20 65 78 74 72 61 20 73 70 61 63 65 20 69 6e  s extra space in
172e0 20 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e   *ppExtra..*/.In
172f0 64 65 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f  dex *sqlite3Allo
17300 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  cateIndexObject(
17310 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
17320 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
17330 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
17340 2f 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20  /.  i16 nCol,   
17350 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
17360 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  l number of colu
17370 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
17380 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
17390 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ,          /* Nu
173a0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
173b0 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20   extra space to 
173c0 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
173d0 2a 2a 70 70 45 78 74 72 61 20 20 20 20 20 20 20  **ppExtra       
173e0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
173f0 65 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20  e "extra" space 
17400 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
17410 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
17420 41 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20  Allocated index 
17430 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
17440 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
17450 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
17460 63 65 20 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a  ce for Index obj
17470 65 63 74 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a  ect + arrays */.
17480 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
17490 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29  8(sizeof(Index))
174a0 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
174b0 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  /* Index structu
174c0 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  re  */.         
174d0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63   ROUND8(sizeof(c
174e0 68 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20  har*)*nCol) +   
174f0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
17500 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20  zColl     */.   
17510 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69         ROUND8(si
17520 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43  zeof(LogEst)*(nC
17530 6f 6c 2b 31 29 20 2b 20 20 20 20 20 2f 2a 20 49  ol+1) +     /* I
17540 6e 64 65 78 2e 61 69 52 6f 77 4c 6f 67 45 73 74  ndex.aiRowLogEst
17550 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
17560 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 31         sizeof(i1
17570 36 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20  6)*nCol +       
17580 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
17590 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20  Column   */.    
175a0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
175b0 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20  eof(u8)*nCol);  
175c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
175d0 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a  dex.aSortOrder *
175e0 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44  /.  p = sqlite3D
175f0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
17600 6e 42 79 74 65 20 2b 20 6e 45 78 74 72 61 29 3b  nByte + nExtra);
17610 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
17620 63 68 61 72 20 2a 70 45 78 74 72 61 20 3d 20 28  char *pExtra = (
17630 28 63 68 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38  (char*)p)+ROUND8
17640 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b  (sizeof(Index));
17650 0a 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d  .    p->azColl =
17660 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 70   (const char**)p
17670 45 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d  Extra; pExtra +=
17680 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63   ROUND8(sizeof(c
17690 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20  har*)*nCol);.   
176a0 20 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 20   p->aiRowLogEst 
176b0 3d 20 28 4c 6f 67 45 73 74 2a 29 70 45 78 74 72  = (LogEst*)pExtr
176c0 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a  a; pExtra += siz
176d0 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f  eof(LogEst)*(nCo
176e0 6c 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 61 69 43  l+1);.    p->aiC
176f0 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 70 45  olumn = (i16*)pE
17700 78 74 72 61 3b 20 20 20 20 20 20 20 70 45 78 74  xtra;       pExt
17710 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36  ra += sizeof(i16
17720 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61  )*nCol;.    p->a
17730 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
17740 29 70 45 78 74 72 61 3b 0a 20 20 20 20 70 2d 3e  )pExtra;.    p->
17750 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a  nColumn = nCol;.
17760 20 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d      p->nKeyCol =
17770 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 2a   nCol - 1;.    *
17780 70 70 45 78 74 72 61 20 3d 20 28 28 63 68 61 72  ppExtra = ((char
17790 2a 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a 20 20  *)p) + nByte;.  
177a0 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
177b0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
177c0 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e  new index for an
177d0 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61   SQL table.  pNa
177e0 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68  me1.pName2 is th
177f0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
17800 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c  dex .** and pTbl
17810 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65  List is the name
17820 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68   of the table th
17830 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
17840 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20  xed.  Both will 
17850 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20  .** be NULL for 
17860 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
17870 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
17880 73 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74  s created to sat
17890 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45  isfy a.** UNIQUE
178a0 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66   constraint.  If
178b0 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64   pTable and pInd
178c0 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65  ex are NULL, use
178d0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
178e0 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62  le.** as the tab
178f0 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
17900 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
17910 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20  able is a table 
17920 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65  that is.** curre
17930 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
17940 72 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41  ructed by a CREA
17950 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
17960 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  nt..**.** pList 
17970 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c  is a list of col
17980 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
17990 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20  ed.  pList will 
179a0 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a  be NULL if this.
179b0 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20  ** is a primary 
179c0 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f  key or unique-co
179d0 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
179e0 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75  most recent colu
179f0 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74  mn added.** to t
17a00 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
17a10 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
17a20 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64  ction.  .*/.void
17a30 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
17a40 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
17a50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c  arse,     /* All
17a60 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
17a70 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f  ut this parse */
17a80 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
17a90 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ,     /* First p
17aa0 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
17ab0 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
17ac0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
17ad0 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64  2,     /* Second
17ae0 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
17af0 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
17b00 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
17b10 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c  TblName, /* Tabl
17b20 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20  e to index. Use 
17b30 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
17b40 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72  e if 0 */.  Expr
17b50 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
17b60 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  * A list of colu
17b70 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
17b80 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
17b90 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f  or,       /* OE_
17ba0 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65  Abort, OE_Ignore
17bb0 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72  , OE_Replace, or
17bc0 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f   OE_None */.  To
17bd0 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20  ken *pStart,    
17be0 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
17bf0 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
17c00 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
17c10 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50 49 57 68  */.  Expr *pPIWh
17c20 65 72 65 2c 20 20 20 20 2f 2a 20 57 48 45 52 45  ere,    /* WHERE
17c30 20 63 6c 61 75 73 65 20 66 6f 72 20 70 61 72 74   clause for part
17c40 69 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20  ial indices */. 
17c50 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20   int sortOrder, 
17c60 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65      /* Sort orde
17c70 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79  r of primary key
17c80 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c   when pList==NUL
17c90 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74  L */.  int ifNot
17ca0 45 78 69 73 74 2c 20 20 20 20 2f 2a 20 4f 6d 69  Exist,    /* Omi
17cb0 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78  t error if index
17cc0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
17cd0 2a 2f 0a 20 20 75 38 20 69 64 78 54 79 70 65 20  */.  u8 idxType 
17ce0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
17cf0 6e 64 65 78 20 74 79 70 65 20 2a 2f 0a 29 7b 0a  ndex type */.){.
17d00 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
17d10 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  0;     /* Table 
17d20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
17d30 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
17d40 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69   = 0;   /* The i
17d50 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74  ndex to be creat
17d60 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ed */.  char *zN
17d70 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ame = 0;     /* 
17d80 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  Name of the inde
17d90 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  x */.  int nName
17da0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
17db0 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
17dc0 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a  ers in zName */.
17dd0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 44 62    int i, j;.  Db
17de0 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 20  Fixer sFix;     
17df0 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e     /* For assign
17e00 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d  ing database nam
17e10 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a  es to pTable */.
17e20 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d    int sortOrderM
17e30 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68  ask;   /* 1 to h
17e40 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64  onor DESC in ind
17e50 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65  ex.  0 to ignore
17e60 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  . */.  sqlite3 *
17e70 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
17e80 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20  .  Db *pDb;     
17e90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
17ea0 70 65 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f  pecific table co
17eb0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64  ntaining the ind
17ec0 65 78 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f  exed database */
17ed0 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
17ee0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
17ef0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
17f00 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77   that is being w
17f10 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ritten */.  Toke
17f20 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20  n *pName = 0;   
17f30 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
17f40 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
17f50 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20  x to create */. 
17f60 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
17f70 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d  _item *pListItem
17f80 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67  ; /* For looping
17f90 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20   over pList */. 
17fa0 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b   int nExtra = 0;
17fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fc0 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63    /* Space alloc
17fd0 61 74 65 64 20 66 6f 72 20 7a 45 78 74 72 61 5b  ated for zExtra[
17fe0 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  ] */.  int nExtr
17ff0 61 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  aCol;           
18000 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18010 72 20 6f 66 20 65 78 74 72 61 20 63 6f 6c 75 6d  r of extra colum
18020 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 63  ns needed */.  c
18030 68 61 72 20 2a 7a 45 78 74 72 61 20 3d 20 30 3b  har *zExtra = 0;
18040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18050 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20 61  /* Extra space a
18060 66 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f  fter the Index o
18070 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64 65 78  bject */.  Index
18080 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20 20 20   *pPk = 0;      
18090 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  /* PRIMARY KEY i
180a0 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54  ndex for WITHOUT
180b0 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f   ROWID tables */
180c0 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
180d0 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
180e0 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20  se->nErr>0 ){.  
180f0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18100 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
18110 69 66 28 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56  if( IN_DECLARE_V
18120 54 41 42 20 26 26 20 69 64 78 54 79 70 65 21 3d  TAB && idxType!=
18130 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50  SQLITE_IDXTYPE_P
18140 52 49 4d 41 52 59 4b 45 59 20 29 7b 0a 20 20 20  RIMARYKEY ){.   
18150 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18160 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  e_index;.  }.  i
18170 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
18180 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
18190 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67  pParse) ){.    g
181a0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
181b0 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
181c0 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74  .  ** Find the t
181d0 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
181e0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74  be indexed.  Ret
181f0 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74  urn early if not
18200 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69   found..  */.  i
18210 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
18220 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  {..    /* Use th
18230 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78  e two-part index
18240 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
18250 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ne the database 
18260 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63  .    ** to searc
18270 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  h for the table.
18280 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65   'Fix' the table
18290 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62   name to this db
182a0 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c  .    ** before l
182b0 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61  ooking up the ta
182c0 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
182d0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26  assert( pName1 &
182e0 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20  & pName2 );.    
182f0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
18300 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
18310 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
18320 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66   &pName);.    if
18330 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65  ( iDb<0 ) goto e
18340 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18350 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
18360 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20  ame && pName->z 
18370 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
18380 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20  TE_OMIT_TEMPDB. 
18390 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
183a0 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75  ex name was unqu
183b0 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69  alified, check i
183c0 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  f the table.    
183d0 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62  ** is a temp tab
183e0 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74  le. If so, set t
183f0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31  he database to 1
18400 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  . Do not do this
18410 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69  .    ** if initi
18420 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62 61  alising a databa
18430 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a  se schema..    *
18440 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  /.    if( !db->i
18450 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
18460 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
18470 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50  SrcListLookup(pP
18480 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b  arse, pTblName);
18490 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65  .      if( pName
184a0 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20  2->n==0 && pTab 
184b0 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  && pTab->pSchema
184c0 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ==db->aDb[1].pSc
184d0 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20  hema ){.        
184e0 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  iDb = 1;.      }
184f0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
18500 20 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69     sqlite3FixIni
18510 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
18520 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70   iDb, "index", p
18530 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73  Name);.    if( s
18540 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
18550 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65  (&sFix, pTblName
18560 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65  ) ){.      /* Be
18570 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72  cause the parser
18580 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c   constructs pTbl
18590 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67  Name from a sing
185a0 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20  le identifier,. 
185b0 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46       ** sqlite3F
185c0 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65  ixSrcList can ne
185d0 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20  ver fail. */.   
185e0 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
185f0 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73    }.    pTab = s
18600 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
18610 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c  eItem(pParse, 0,
18620 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d   &pTblName->a[0]
18630 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
18640 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
18650 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b  =0 || pTab==0 );
18660 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30  .    if( pTab==0
18670 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
18680 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
18690 66 28 20 69 44 62 3d 3d 31 20 26 26 20 64 62 2d  f( iDb==1 && db-
186a0 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
186b0 61 21 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a!=pTab->pSchema
186c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
186d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
186e0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 63  , .           "c
186f0 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61 20 54  annot create a T
18700 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e  EMP index on non
18710 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c 22 25 73  -TEMP table \"%s
18720 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \"",.           
18730 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
18740 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
18750 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
18760 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f  }.    if( !HasRo
18770 77 69 64 28 70 54 61 62 29 20 29 20 70 50 6b 20  wid(pTab) ) pPk 
18780 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
18790 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
187a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
187b0 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b  ert( pName==0 );
187c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
187d0 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  art==0 );.    pT
187e0 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
187f0 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20  wTable;.    if( 
18800 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69  !pTab ) goto exi
18810 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
18820 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
18830 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
18840 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
18850 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26  );.  }.  pDb = &
18860 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20  db->aDb[iDb];.. 
18870 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
18880 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
18890 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
188a0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
188b0 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
188c0 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
188d0 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  )==0 .       && 
188e0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
188f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52  .#if SQLITE_USER
18900 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
18910 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
18920 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 70  3UserAuthTable(p
18930 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23  Tab->zName)==0.#
18940 65 6e 64 69 66 0a 20 20 20 20 20 20 20 26 26 20  endif.       && 
18950 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
18960 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c  &pTab->zName[7],
18970 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29 21 3d  "altertab_",9)!=
18980 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
18990 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
189a0 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
189b0 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20  ot be indexed", 
189c0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
189d0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
189e0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69  te_index;.  }.#i
189f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18a00 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54 61  T_VIEW.  if( pTa
18a10 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
18a20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
18a30 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 73  g(pParse, "views
18a40 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
18a50 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  xed");.    goto 
18a60 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18a70 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  x;.  }.#endif.#i
18a80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18a90 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
18aa0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
18ab0 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Tab) ){.    sqli
18ac0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
18ad0 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62  se, "virtual tab
18ae0 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  les may not be i
18af0 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f  ndexed");.    go
18b00 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18b10 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ndex;.  }.#endif
18b20 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
18b30 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
18b40 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75   index.  Make su
18b50 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  re there is not 
18b60 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a  already another.
18b70 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
18b80 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ble with the sam
18b90 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20  e name.  .  **. 
18ba0 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20   ** Exception:  
18bb0 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  If we are readin
18bc0 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70  g the names of p
18bd0 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73  ermanent indices
18be0 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73   from the.  ** s
18bf0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
18c00 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65  le (because some
18c10 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
18c20 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d  hanged the schem
18c30 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20  a) and.  ** one 
18c40 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  of the index nam
18c50 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68  es collides with
18c60 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74   the name of a t
18c70 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
18c80 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68  r.  ** index, th
18c90 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  en we will conti
18ca0 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74  nue to process t
18cb0 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  his index..  **.
18cc0 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30    ** If pName==0
18cd0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
18ce0 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69  e are.  ** deali
18cf0 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72  ng with a primar
18d00 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20  y key or UNIQUE 
18d10 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20  constraint.  We 
18d20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f  have to invent o
18d30 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65  ur.  ** own name
18d40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  ..  */.  if( pNa
18d50 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
18d60 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
18d70 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65  mToken(db, pName
18d80 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
18d90 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
18da0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18db0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
18dc0 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  >z!=0 );.    if(
18dd0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
18de0 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
18df0 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
18e00 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
18e10 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18e20 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
18e30 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
18e40 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
18e50 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
18e60 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29  , zName, 0)!=0 )
18e70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18e80 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
18e90 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
18ea0 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65  ady a table name
18eb0 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  d %s", zName);. 
18ec0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
18ed0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18ee0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
18ef0 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
18f00 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
18f10 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 21   pDb->zDbSName)!
18f20 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
18f30 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20  !ifNotExist ){. 
18f40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
18f50 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
18f60 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79  index %s already
18f70 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29   exists", zName)
18f80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18f90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
18fa0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
18fb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18fc0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
18fd0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
18fe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
18ff0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
19000 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  dex;.    }.  }el
19010 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  se{.    int n;. 
19020 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b     Index *pLoop;
19030 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
19040 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31  Tab->pIndex, n=1
19050 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
19060 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b  Loop->pNext, n++
19070 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  ){}.    zName = 
19080 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
19090 62 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69  b, "sqlite_autoi
190a0 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61  ndex_%s_%d", pTa
190b0 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20  b->zName, n);.  
190c0 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
190d0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
190e0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
190f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 75      }..    /* Au
19100 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6e 61  tomatic index na
19110 6d 65 73 20 67 65 6e 65 72 61 74 65 64 20 66 72  mes generated fr
19120 6f 6d 20 77 69 74 68 69 6e 20 73 71 6c 69 74 65  om within sqlite
19130 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29  3_declare_vtab()
19140 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 68 61 76  .    ** must hav
19150 65 20 6e 61 6d 65 73 20 74 68 61 74 20 61 72 65  e names that are
19160 20 64 69 73 74 69 6e 63 74 20 66 72 6f 6d 20 6e   distinct from n
19170 6f 72 6d 61 6c 20 61 75 74 6f 6d 61 74 69 63 20  ormal automatic 
19180 69 6e 64 65 78 20 6e 61 6d 65 73 2e 0a 20 20 20  index names..   
19190 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
191a0 67 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 76  g statement conv
191b0 65 72 74 73 20 22 73 71 6c 69 74 65 33 5f 61 75  erts "sqlite3_au
191c0 74 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e 74 6f  toindex..." into
191d0 0a 20 20 20 20 2a 2a 20 22 73 71 6c 69 74 65 33  .    ** "sqlite3
191e0 5f 62 75 74 6f 69 6e 64 65 78 2e 2e 2e 22 20 69  _butoindex..." i
191f0 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20  n order to make 
19200 74 68 65 20 6e 61 6d 65 73 20 64 69 73 74 69 6e  the names distin
19210 63 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 22  ct..    ** The "
19220 76 74 61 62 5f 65 72 72 2e 74 65 73 74 22 20 74  vtab_err.test" t
19230 65 73 74 20 64 65 6d 6f 6e 73 74 72 61 74 65 73  est demonstrates
19240 20 74 68 65 20 6e 65 65 64 20 6f 66 20 74 68 69   the need of thi
19250 73 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a  s statement. */.
19260 20 20 20 20 69 66 28 20 49 4e 5f 44 45 43 4c 41      if( IN_DECLA
19270 52 45 5f 56 54 41 42 20 29 20 7a 4e 61 6d 65 5b  RE_VTAB ) zName[
19280 37 5d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  7]++;.  }..  /* 
19290 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72  Check for author
192a0 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74  ization to creat
192b0 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f  e an index..  */
192c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
192d0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
192e0 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ON.  {.    const
192f0 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62   char *zDb = pDb
19300 2d 3e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ->zDbSName;.    
19310 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
19320 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
19330 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
19340 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30  MA_TABLE(iDb), 0
19350 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
19360 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19370 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
19380 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45    i = SQLITE_CRE
19390 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  ATE_INDEX;.    i
193a0 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
193b0 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20  && iDb==1 ) i = 
193c0 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
193d0 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
193e0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
193f0 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e  ck(pParse, i, zN
19400 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
19410 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
19420 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19430 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
19440 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
19450 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d  f pList==0, it m
19460 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e  eans this routin
19470 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  e was called to 
19480 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20  make a primary. 
19490 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74   ** key out of t
194a0 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61  he last column a
194b0 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
194c0 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
194d0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72  tion..  ** So cr
194e0 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74  eate a fake list
194f0 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69   to simulate thi
19500 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  s..  */.  if( pL
19510 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54 6f  ist==0 ){.    To
19520 6b 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20 20 20  ken prevCol;.   
19530 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69   sqlite3TokenIni
19540 74 28 26 70 72 65 76 43 6f 6c 2c 20 70 54 61 62  t(&prevCol, pTab
19550 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f  ->aCol[pTab->nCo
19560 6c 2d 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l-1].zName);.   
19570 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
19580 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
19590 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20  Parse, 0,.      
195a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
195b0 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
195c0 49 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20 30 29  ID, &prevCol, 0)
195d0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
195e0 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
195f0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
19600 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
19610 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20  >nExpr==1 );.   
19620 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
19630 53 65 74 53 6f 72 74 4f 72 64 65 72 28 70 4c 69  SetSortOrder(pLi
19640 73 74 2c 20 73 6f 72 74 4f 72 64 65 72 29 3b 0a  st, sortOrder);.
19650 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
19660 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63  ite3ExprListChec
19670 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c 20  kLength(pParse, 
19680 70 4c 69 73 74 2c 20 22 69 6e 64 65 78 22 29 3b  pList, "index");
19690 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
196a0 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62  e out how many b
196b0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 72  ytes of space ar
196c0 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  e required to st
196d0 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20  ore explicitly. 
196e0 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f   ** specified co
196f0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
19700 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66   names..  */.  f
19710 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
19720 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
19730 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
19740 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
19750 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
19760 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 69  Expr!=0 );.    i
19770 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
19780 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20  _COLLATE ){.    
19790 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b    nExtra += (1 +
197a0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
197b0 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
197c0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ));.    }.  }.. 
197d0 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61   /* .  ** Alloca
197e0 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72  te the index str
197f0 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20  ucture. .  */.  
19800 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
19810 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
19820 20 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70 50    nExtraCol = pP
19830 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  k ? pPk->nKeyCol
19840 20 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78 20 3d   : 1;.  pIndex =
19850 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65   sqlite3Allocate
19860 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20  IndexObject(db, 
19870 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e  pList->nExpr + n
19880 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20 20  ExtraCol,.      
19890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198b0 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61 20 2b  nName + nExtra +
198c0 20 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20 20   1, &zExtra);.  
198d0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
198e0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
198f0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19900 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ex;.  }.  assert
19910 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
19920 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61  GNMENT(pIndex->a
19930 69 52 6f 77 4c 6f 67 45 73 74 29 20 29 3b 0a 20  iRowLogEst) );. 
19940 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
19950 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49  YTE_ALIGNMENT(pI
19960 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b  ndex->azColl) );
19970 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
19980 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78   = zExtra;.  zEx
19990 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31  tra += nName + 1
199a0 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65  ;.  memcpy(pInde
199b0 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  x->zName, zName,
199c0 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e   nName+1);.  pIn
199d0 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  dex->pTable = pT
199e0 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e  ab;.  pIndex->on
199f0 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72  Error = (u8)onEr
19a00 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 75  ror;.  pIndex->u
19a10 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45  niqNotNull = onE
19a20 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20  rror!=OE_None;. 
19a30 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65   pIndex->idxType
19a40 20 3d 20 69 64 78 54 79 70 65 3b 0a 20 20 70 49   = idxType;.  pI
19a50 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20  ndex->pSchema = 
19a60 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
19a70 68 65 6d 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  hema;.  pIndex->
19a80 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d  nKeyCol = pList-
19a90 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 70 50  >nExpr;.  if( pP
19aa0 49 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71  IWhere ){.    sq
19ab0 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66  lite3ResolveSelf
19ac0 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65  Reference(pParse
19ad0 2c 20 70 54 61 62 2c 20 4e 43 5f 50 61 72 74 49  , pTab, NC_PartI
19ae0 64 78 2c 20 70 50 49 57 68 65 72 65 2c 20 30 29  dx, pPIWhere, 0)
19af0 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 50  ;.    pIndex->pP
19b00 61 72 74 49 64 78 57 68 65 72 65 20 3d 20 70 50  artIdxWhere = pP
19b10 49 57 68 65 72 65 3b 0a 20 20 20 20 70 50 49 57  IWhere;.    pPIW
19b20 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  here = 0;.  }.  
19b30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
19b40 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
19b50 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20  b, iDb, 0) );.. 
19b60 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
19b70 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f   if we should ho
19b80 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74  nor DESC request
19b90 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d  s on index colum
19ba0 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  ns.  */.  if( pD
19bb0 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65  b->pSchema->file
19bc0 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20  _format>=4 ){.  
19bd0 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20    sortOrderMask 
19be0 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72  = -1;   /* Honor
19bf0 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65   DESC */.  }else
19c00 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
19c10 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  ask = 0;    /* I
19c20 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20  gnore DESC */.  
19c30 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  }..  /* Analyze 
19c40 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
19c50 65 73 73 69 6f 6e 73 20 74 68 61 74 20 66 6f 72  essions that for
19c60 6d 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  m the terms of t
19c70 68 65 20 69 6e 64 65 78 20 61 6e 64 0a 20 20 2a  he index and.  *
19c80 2a 20 72 65 70 6f 72 74 20 61 6e 79 20 65 72 72  * report any err
19c90 6f 72 73 2e 20 20 49 6e 20 74 68 65 20 63 6f 6d  ors.  In the com
19ca0 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
19cb0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
19cc0 20 65 78 61 63 74 6c 79 0a 20 20 2a 2a 20 61 20   exactly.  ** a 
19cd0 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73 74  table column, st
19ce0 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  ore that column 
19cf0 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20  in aiColumn[].  
19d00 46 6f 72 20 67 65 6e 65 72 61 6c 20 65 78 70 72  For general expr
19d10 65 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f  essions,.  ** po
19d20 70 75 6c 61 74 65 20 70 49 6e 64 65 78 2d 3e 61  pulate pIndex->a
19d30 43 6f 6c 45 78 70 72 20 61 6e 64 20 73 74 6f 72  ColExpr and stor
19d40 65 20 58 4e 5f 45 58 50 52 20 28 2d 32 29 20 69  e XN_EXPR (-2) i
19d50 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20  n aiColumn[]..  
19d60 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73  **.  ** TODO: Is
19d70 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66  sue a warning if
19d80 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6c   two or more col
19d90 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
19da0 78 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  x are identical.
19db0 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75  .  ** TODO: Issu
19dc0 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74  e a warning if t
19dd0 68 65 20 74 61 62 6c 65 20 70 72 69 6d 61 72 79  he table primary
19de0 20 6b 65 79 20 69 73 20 75 73 65 64 20 61 73 20   key is used as 
19df0 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  part of the.  **
19e00 20 69 6e 64 65 78 20 6b 65 79 2e 0a 20 20 2a 2f   index key..  */
19e10 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73  .  for(i=0, pLis
19e20 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  tItem=pList->a; 
19e30 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
19e40 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b  i++, pListItem++
19e50 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 43 45  ){.    Expr *pCE
19e60 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
19e70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74        /* The i-t
19e80 68 20 69 6e 64 65 78 20 65 78 70 72 65 73 73 69  h index expressi
19e90 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  on */.    int re
19ea0 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
19eb0 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 53 43 20  ;        /* ASC 
19ec0 6f 72 20 44 45 53 43 20 6f 6e 20 74 68 65 20 69  or DESC on the i
19ed0 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  -th expression *
19ee0 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
19ef0 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *zColl;        
19f00 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f       /* Collatio
19f10 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20  n sequence name 
19f20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 53  */..    sqlite3S
19f30 74 72 69 6e 67 54 6f 49 64 28 70 4c 69 73 74 49  tringToId(pListI
19f40 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
19f50 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
19f60 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61  elfReference(pPa
19f70 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 49 64  rse, pTab, NC_Id
19f80 78 45 78 70 72 2c 20 70 4c 69 73 74 49 74 65 6d  xExpr, pListItem
19f90 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ->pExpr, 0);.   
19fa0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
19fb0 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  r ) goto exit_cr
19fc0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
19fd0 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  pCExpr = sqlite3
19fe0 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
19ff0 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
1a000 29 3b 0a 20 20 20 20 69 66 28 20 70 43 45 78 70  );.    if( pCExp
1a010 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
1a020 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54   ){.      if( pT
1a030 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77  ab==pParse->pNew
1a040 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Table ){.       
1a050 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1a060 28 70 50 61 72 73 65 2c 20 22 65 78 70 72 65 73  (pParse, "expres
1a070 73 69 6f 6e 73 20 70 72 6f 68 69 62 69 74 65 64  sions prohibited
1a080 20 69 6e 20 50 52 49 4d 41 52 59 20 4b 45 59 20   in PRIMARY KEY 
1a090 61 6e 64 20 22 0a 20 20 20 20 20 20 20 20 20 20  and ".          
1a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0b0 20 20 20 20 20 20 22 55 4e 49 51 55 45 20 63 6f        "UNIQUE co
1a0c0 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20  nstraints");.   
1a0d0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1a0e0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1a0f0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1a100 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 3d  Index->aColExpr=
1a110 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  =0 ){.        Ex
1a120 70 72 4c 69 73 74 20 2a 70 43 6f 70 79 20 3d 20  prList *pCopy = 
1a130 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
1a140 75 70 28 64 62 2c 20 70 4c 69 73 74 2c 20 30 29  up(db, pList, 0)
1a150 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ;.        pIndex
1a160 2d 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f  ->aColExpr = pCo
1a170 70 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  py;.        if( 
1a180 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
1a190 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  d ){.          a
1a1a0 73 73 65 72 74 28 20 70 43 6f 70 79 21 3d 30 20  ssert( pCopy!=0 
1a1b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 69  );.          pLi
1a1c0 73 74 49 74 65 6d 20 3d 20 26 70 43 6f 70 79 2d  stItem = &pCopy-
1a1d0 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d  >a[i];.        }
1a1e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a  .      }.      j
1a1f0 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20   = XN_EXPR;.    
1a200 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
1a210 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 45 58 50 52 3b  mn[i] = XN_EXPR;
1a220 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75  .      pIndex->u
1a230 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a  niqNotNull = 0;.
1a240 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a250 20 6a 20 3d 20 70 43 45 78 70 72 2d 3e 69 43 6f   j = pCExpr->iCo
1a260 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 61 73 73 65  lumn;.      asse
1a270 72 74 28 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b  rt( j<=0x7fff );
1a280 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 30 20 29  .      if( j<0 )
1a290 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 54  {.        j = pT
1a2a0 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
1a2b0 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d   }else if( pTab-
1a2c0 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c  >aCol[j].notNull
1a2d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
1a2e0 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75  Index->uniqNotNu
1a2f0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ll = 0;.      }.
1a300 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69        pIndex->ai
1a310 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36  Column[i] = (i16
1a320 29 6a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43  )j;.    }.    zC
1a330 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  oll = 0;.    if(
1a340 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
1a350 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
1a360 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  E ){.      int n
1a370 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  Coll;.      zCol
1a380 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  l = pListItem->p
1a390 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
1a3a0 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71        nColl = sq
1a3b0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
1a3c0 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  oll) + 1;.      
1a3d0 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d  assert( nExtra>=
1a3e0 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d  nColl );.      m
1a3f0 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 7a 43  emcpy(zExtra, zC
1a400 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20  oll, nColl);.   
1a410 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72     zColl = zExtr
1a420 61 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20  a;.      zExtra 
1a430 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  += nColl;.      
1a440 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b  nExtra -= nColl;
1a450 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6a  .    }else if( j
1a460 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f  >=0 ){.      zCo
1a470 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ll = pTab->aCol[
1a480 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  j].zColl;.    }.
1a490 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29      if( !zColl )
1a4a0 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
1a4b0 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 69  StrBINARY;.    i
1a4c0 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
1a4d0 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63  y && !sqlite3Loc
1a4e0 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
1a4f0 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
1a500 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1a510 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
1a520 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43  .    pIndex->azC
1a530 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a  oll[i] = zColl;.
1a540 20 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72      requestedSor
1a550 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74  tOrder = pListIt
1a560 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20  em->sortOrder & 
1a570 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20  sortOrderMask;. 
1a580 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74     pIndex->aSort
1a590 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72  Order[i] = (u8)r
1a5a0 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
1a5b0 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70  r;.  }..  /* App
1a5c0 65 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6b 65  end the table ke
1a5d0 79 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  y to the end of 
1a5e0 74 68 65 20 69 6e 64 65 78 2e 20 20 46 6f 72 20  the index.  For 
1a5f0 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20  WITHOUT ROWID.  
1a600 2a 2a 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20  ** tables (when 
1a610 70 50 6b 21 3d 30 29 20 74 68 69 73 20 77 69 6c  pPk!=0) this wil
1a620 6c 20 62 65 20 74 68 65 20 64 65 63 6c 61 72 65  l be the declare
1a630 64 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  d PRIMARY KEY.  
1a640 46 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  For.  ** normal 
1a650 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b  tables (when pPk
1a660 3d 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62  ==0) this will b
1a670 65 20 74 68 65 20 72 6f 77 69 64 2e 0a 20 20 2a  e the rowid..  *
1a680 2f 0a 20 20 69 66 28 20 70 50 6b 20 29 7b 0a 20  /.  if( pPk ){. 
1a690 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50     for(j=0; j<pP
1a6a0 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29  k->nKeyCol; j++)
1a6b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  {.      int x = 
1a6c0 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  pPk->aiColumn[j]
1a6d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1a6e0 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  x>=0 );.      if
1a6f0 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49 6e 64  ( hasColumn(pInd
1a700 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49  ex->aiColumn, pI
1a710 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78  ndex->nKeyCol, x
1a720 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  ) ){.        pIn
1a730 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20  dex->nColumn--; 
1a740 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1a750 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69        pIndex->ai
1a760 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20  Column[i] = x;. 
1a770 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61         pIndex->a
1a780 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e  zColl[i] = pPk->
1a790 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  azColl[j];.     
1a7a0 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74     pIndex->aSort
1a7b0 4f 72 64 65 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e  Order[i] = pPk->
1a7c0 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20  aSortOrder[j];. 
1a7d0 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
1a7e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
1a7f0 73 65 72 74 28 20 69 3d 3d 70 49 6e 64 65 78 2d  sert( i==pIndex-
1a800 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65  >nColumn );.  }e
1a810 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  lse{.    pIndex-
1a820 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58  >aiColumn[i] = X
1a830 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 70 49 6e  N_ROWID;.    pIn
1a840 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
1a850 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
1a860 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  Y;.  }.  sqlite3
1a870 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49  DefaultRowEst(pI
1a880 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 70 50 61  ndex);.  if( pPa
1a890 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d  rse->pNewTable==
1a8a0 30 20 29 20 65 73 74 69 6d 61 74 65 49 6e 64 65  0 ) estimateInde
1a8b0 78 57 69 64 74 68 28 70 49 6e 64 65 78 29 3b 0a  xWidth(pIndex);.
1a8c0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e  .  /* If this in
1a8d0 64 65 78 20 63 6f 6e 74 61 69 6e 73 20 65 76 65  dex contains eve
1a8e0 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 74 73  ry column of its
1a8f0 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 72   table, then mar
1a900 6b 0a 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63  k.  ** it as a c
1a910 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f  overing index */
1a920 0a 20 20 61 73 73 65 72 74 28 20 48 61 73 52 6f  .  assert( HasRo
1a930 77 69 64 28 70 54 61 62 29 20 0a 20 20 20 20 20  wid(pTab) .     
1a940 20 7c 7c 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c   || pTab->iPKey<
1a950 30 20 7c 7c 20 73 71 6c 69 74 65 33 43 6f 6c 75  0 || sqlite3Colu
1a960 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65 78  mnOfIndex(pIndex
1a970 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79 29 3e 3d  , pTab->iPKey)>=
1a980 30 20 29 3b 0a 20 20 69 66 28 20 70 54 62 6c 4e  0 );.  if( pTblN
1a990 61 6d 65 21 3d 30 20 26 26 20 70 49 6e 64 65 78  ame!=0 && pIndex
1a9a0 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 54 61 62 2d  ->nColumn>=pTab-
1a9b0 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 70 49 6e  >nCol ){.    pIn
1a9c0 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  dex->isCovering 
1a9d0 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  = 1;.    for(j=0
1a9e0 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
1a9f0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
1aa00 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  j==pTab->iPKey )
1aa10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1aa20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6c 75   if( sqlite3Colu
1aa30 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65 78  mnOfIndex(pIndex
1aa40 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ,j)>=0 ) continu
1aa50 65 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  e;.      pIndex-
1aa60 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 30 3b  >isCovering = 0;
1aa70 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1aa80 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1aa90 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65  Tab==pParse->pNe
1aaa0 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  wTable ){.    /*
1aab0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
1aac0 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f  s been called to
1aad0 20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d   create an autom
1aae0 61 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a  atic index as a.
1aaf0 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66      ** result of
1ab00 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
1ab10 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
1ab20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69  on a column defi
1ab30 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a  nition, or.    *
1ab40 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  * a PRIMARY KEY 
1ab50 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65  or UNIQUE clause
1ab60 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63   following the c
1ab70 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
1ab80 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f  s..    ** i.e. o
1ab90 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  ne of:.    **.  
1aba0 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
1abb0 45 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45  E t(x PRIMARY KE
1abc0 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52  Y, y);.    ** CR
1abd0 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20  EATE TABLE t(x, 
1abe0 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29  y, UNIQUE(x, y))
1abf0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1ac00 45 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63  Either way, chec
1ac10 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
1ac20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
1ac30 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e  s such an index.
1ac40 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64   If.    ** so, d
1ac50 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61  on't bother crea
1ac60 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54  ting this one. T
1ac70 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73  his only applies
1ac80 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d   to.    ** autom
1ac90 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64  atically created
1aca0 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20   indices. Users 
1acb0 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77  can do as they w
1acc0 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  ish with.    ** 
1acd0 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73  explicit indices
1ace0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1acf0 54 77 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52  Two UNIQUE or PR
1ad00 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
1ad10 61 69 6e 74 73 20 61 72 65 20 63 6f 6e 73 69 64  aints are consid
1ad20 65 72 65 64 20 65 71 75 69 76 61 6c 65 6e 74 0a  ered equivalent.
1ad30 20 20 20 20 2a 2a 20 28 61 6e 64 20 74 68 75 73      ** (and thus
1ad40 20 73 75 70 70 72 65 73 73 69 6e 67 20 74 68 65   suppressing the
1ad50 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65   second one) eve
1ad60 6e 20 69 66 20 74 68 65 79 20 68 61 76 65 20 64  n if they have d
1ad70 69 66 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20  ifferent.    ** 
1ad80 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20 20 20  sort orders..   
1ad90 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
1ada0 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
1adb0 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
1adc0 65 6e 63 65 73 20 6f 72 20 69 66 20 74 68 65 20  ences or if the 
1add0 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a  columns of.    *
1ade0 2a 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  * the constraint
1adf0 20 6f 63 63 75 72 20 69 6e 20 64 69 66 66 65 72   occur in differ
1ae00 65 6e 74 20 6f 72 64 65 72 73 2c 20 74 68 65 6e  ent orders, then
1ae10 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   the constraints
1ae20 20 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73   are.    ** cons
1ae30 69 64 65 72 65 64 20 64 69 73 74 69 6e 63 74 20  idered distinct 
1ae40 61 6e 64 20 62 6f 74 68 20 72 65 73 75 6c 74 20  and both result 
1ae50 69 6e 20 73 65 70 61 72 61 74 65 20 69 6e 64 69  in separate indi
1ae60 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ces..    */.    
1ae70 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
1ae80 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
1ae90 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
1aea0 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
1aeb0 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  .      int k;.  
1aec0 20 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e      assert( IsUn
1aed0 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20  iqueIndex(pIdx) 
1aee0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1aef0 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 21 3d   pIdx->idxType!=
1af00 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41  SQLITE_IDXTYPE_A
1af10 50 50 44 45 46 20 29 3b 0a 20 20 20 20 20 20 61  PPDEF );.      a
1af20 73 73 65 72 74 28 20 49 73 55 6e 69 71 75 65 49  ssert( IsUniqueI
1af30 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29 3b 0a  ndex(pIndex) );.
1af40 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
1af50 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78  >nKeyCol!=pIndex
1af60 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74  ->nKeyCol ) cont
1af70 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
1af80 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65  k=0; k<pIdx->nKe
1af90 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  yCol; k++){.    
1afa0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1afb0 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  z1;.        cons
1afc0 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20  t char *z2;.    
1afd0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
1afe0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d 30  ->aiColumn[k]>=0
1aff0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1b000 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
1b010 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  ]!=pIndex->aiCol
1b020 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a  umn[k] ) break;.
1b030 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64          z1 = pId
1b040 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
1b050 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65        z2 = pInde
1b060 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
1b070 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1b080 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29  3StrICmp(z1, z2)
1b090 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1b0a0 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70  }.      if( k==p
1b0b0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a  Idx->nKeyCol ){.
1b0c0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
1b0d0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65  ->onError!=pInde
1b0e0 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20  x->onError ){.  
1b0f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
1b100 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74  constraint creat
1b110 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65  es the same inde
1b120 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a  x as a previous.
1b130 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
1b140 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65  straint specifie
1b150 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74  d somewhere in t
1b160 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
1b170 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
1b180 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20       ** However 
1b190 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  the ON CONFLICT 
1b1a0 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66  clauses are diff
1b1b0 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74  erent. If both t
1b1c0 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  his .          *
1b1d0 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  * constraint and
1b1e0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71   the previous eq
1b1f0 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61  uivalent constra
1b200 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69  int have explici
1b210 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f  t.          ** O
1b220 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
1b230 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72  es this is an er
1b240 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ror. Otherwise, 
1b250 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  use the.        
1b260 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20    ** explicitly 
1b270 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69  specified behavi
1b280 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
1b290 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1b2a0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
1b2b0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
1b2c0 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64  _Default || pInd
1b2d0 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
1b2e0 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20  Default) ){.    
1b2f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1b300 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1b310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b320 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e   "conflicting ON
1b330 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
1b340 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29  s specified", 0)
1b350 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1b360 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
1b370 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
1b380 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
1b390 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72       pIdx->onErr
1b3a0 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  or = pIndex->onE
1b3b0 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
1b3c0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1b3d0 20 20 20 20 69 66 28 20 69 64 78 54 79 70 65 3d      if( idxType=
1b3e0 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
1b3f0 50 52 49 4d 41 52 59 4b 45 59 20 29 20 70 49 64  PRIMARYKEY ) pId
1b400 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 69 64 78  x->idxType = idx
1b410 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 67 6f  Type;.        go
1b420 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1b430 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
1b440 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69    }.  }..  /* Li
1b450 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78  nk the new Index
1b460 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74   structure to it
1b470 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74  s table and to t
1b480 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e  he other.  ** in
1b490 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1b4a0 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20   structures. .  
1b4b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1b4c0 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a  rse->nErr==0 );.
1b4d0 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
1b4e0 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  usy ){.    Index
1b4f0 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28   *p;.    assert(
1b500 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
1b510 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  B );.    assert(
1b520 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
1b530 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
1b540 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20  Index->pSchema) 
1b550 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  );.    p = sqlit
1b560 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 49  e3HashInsert(&pI
1b570 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69  ndex->pSchema->i
1b580 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  dxHash, .       
1b590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5a0 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
1b5b0 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69  , pIndex);.    i
1b5c0 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73  f( p ){.      as
1b5d0 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20  sert( p==pIndex 
1b5e0 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
1b5f0 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a  st have failed *
1b600 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  /.      sqlite3O
1b610 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
1b620 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1b630 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
1b640 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
1b650 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
1b660 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20  hanges;.    if( 
1b670 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  pTblName!=0 ){. 
1b680 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75       pIndex->tnu
1b690 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
1b6a0 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tnum;.    }.  }.
1b6b0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1b6c0 20 74 68 65 20 69 6e 69 74 69 61 6c 20 43 52 45   the initial CRE
1b6d0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
1b6e0 65 6e 74 20 28 6f 72 20 43 52 45 41 54 45 20 54  ent (or CREATE T
1b6f0 41 42 4c 45 20 69 66 20 74 68 65 0a 20 20 2a 2a  ABLE if the.  **
1b700 20 69 6e 64 65 78 20 69 73 20 61 6e 20 69 6d 70   index is an imp
1b710 6c 69 65 64 20 69 6e 64 65 78 20 66 6f 72 20 61  lied index for a
1b720 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41   UNIQUE or PRIMA
1b730 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
1b740 74 29 20 74 68 65 6e 0a 20 20 2a 2a 20 65 6d 69  t) then.  ** emi
1b750 74 20 63 6f 64 65 20 74 6f 20 61 6c 6c 6f 63 61  t code to alloca
1b760 74 65 20 74 68 65 20 69 6e 64 65 78 20 72 6f 6f  te the index roo
1b770 74 70 61 67 65 20 6f 6e 20 64 69 73 6b 20 61 6e  tpage on disk an
1b780 64 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20  d make an entry 
1b790 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64  for.  ** the ind
1b7a0 65 78 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  ex in the sqlite
1b7b0 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e  _master table an
1b7c0 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 69  d populate the i
1b7d0 6e 64 65 78 20 77 69 74 68 0a 20 20 2a 2a 20 63  ndex with.  ** c
1b7e0 6f 6e 74 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f  ontent.  But, do
1b7f0 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 69 66 20   not do this if 
1b800 77 65 20 61 72 65 20 73 69 6d 70 6c 79 20 72 65  we are simply re
1b810 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
1b820 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62  _master.  ** tab
1b830 6c 65 20 74 6f 20 70 61 72 73 65 20 74 68 65 20  le to parse the 
1b840 73 63 68 65 6d 61 2c 20 6f 72 20 69 66 20 74 68  schema, or if th
1b850 69 73 20 69 6e 64 65 78 20 69 73 20 74 68 65 20  is index is the 
1b860 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
1b870 78 0a 20 20 2a 2a 20 6f 66 20 61 20 57 49 54 48  x.  ** of a WITH
1b880 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e  OUT ROWID table.
1b890 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54  .  **.  ** If pT
1b8a0 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61  blName==0 it mea
1b8b0 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  ns this index is
1b8c0 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 6e   generated as an
1b8d0 20 69 6d 70 6c 69 65 64 20 50 52 49 4d 41 52 59   implied PRIMARY
1b8e0 20 4b 45 59 0a 20 20 2a 2a 20 6f 72 20 55 4e 49   KEY.  ** or UNI
1b8f0 51 55 45 20 69 6e 64 65 78 20 69 6e 20 61 20 43  QUE index in a C
1b900 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
1b910 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68  ement.  Since th
1b920 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73  e table.  ** has
1b930 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74   just been creat
1b940 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  ed, it contains 
1b950 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20  no data and the 
1b960 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61  index initializa
1b970 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63  tion.  ** step c
1b980 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20  an be skipped.. 
1b990 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 48   */.  else if( H
1b9a0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c  asRowid(pTab) ||
1b9b0 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
1b9c0 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
1b9d0 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
1b9e0 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70    int iMem = ++p
1b9f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20  Parse->nMem;..  
1ba00 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
1ba10 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1ba20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
1ba30 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1ba40 64 65 78 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  dex;..    sqlite
1ba50 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
1ba60 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
1ba70 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72  iDb);..    /* Cr
1ba80 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67  eate the rootpag
1ba90 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  e for the index 
1baa0 75 73 69 6e 67 20 43 72 65 61 74 65 49 6e 64 65  using CreateInde
1bab0 78 2e 20 42 75 74 20 62 65 66 6f 72 65 0a 20 20  x. But before.  
1bac0 20 20 2a 2a 20 64 6f 69 6e 67 20 73 6f 2c 20 63    ** doing so, c
1bad0 6f 64 65 20 61 20 4e 6f 6f 70 20 69 6e 73 74 72  ode a Noop instr
1bae0 75 63 74 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65  uction and store
1baf0 20 69 74 73 20 61 64 64 72 65 73 73 20 69 6e 20   its address in 
1bb00 0a 20 20 20 20 2a 2a 20 49 6e 64 65 78 2e 74 6e  .    ** Index.tn
1bb10 75 6d 2e 20 54 68 69 73 20 69 73 20 72 65 71 75  um. This is requ
1bb20 69 72 65 64 20 69 6e 20 63 61 73 65 20 74 68 69  ired in case thi
1bb30 73 20 69 6e 64 65 78 20 69 73 20 61 63 74 75 61  s index is actua
1bb40 6c 6c 79 20 61 20 0a 20 20 20 20 2a 2a 20 50 52  lly a .    ** PR
1bb50 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 74 68  IMARY KEY and th
1bb60 65 20 74 61 62 6c 65 20 69 73 20 61 63 74 75 61  e table is actua
1bb70 6c 6c 79 20 61 20 57 49 54 48 4f 55 54 20 52 4f  lly a WITHOUT RO
1bb80 57 49 44 20 74 61 62 6c 65 2e 20 49 6e 20 0a 20  WID table. In . 
1bb90 20 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20     ** that case 
1bba0 74 68 65 20 63 6f 6e 76 65 72 74 54 6f 57 69 74  the convertToWit
1bbb0 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 29  houtRowidTable()
1bbc0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
1bbd0 70 6c 61 63 65 0a 20 20 20 20 2a 2a 20 74 68 65  place.    ** the
1bbe0 20 4e 6f 6f 70 20 77 69 74 68 20 61 20 47 6f 74   Noop with a Got
1bbf0 6f 20 74 6f 20 6a 75 6d 70 20 6f 76 65 72 20 74  o to jump over t
1bc00 68 65 20 56 44 42 45 20 63 6f 64 65 20 67 65 6e  he VDBE code gen
1bc10 65 72 61 74 65 64 20 62 65 6c 6f 77 2e 20 2a 2f  erated below. */
1bc20 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75  .    pIndex->tnu
1bc30 6d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  m = sqlite3VdbeA
1bc40 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70  ddOp0(v, OP_Noop
1bc50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1bc60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
1bc70 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c  reateIndex, iDb,
1bc80 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20   iMem);..    /* 
1bc90 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c  Gather the compl
1bca0 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
1bcb0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
1bcc0 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20  tement into.    
1bcd0 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72  ** the zStmt var
1bce0 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20  iable.    */.   
1bcf0 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
1bd00 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e       int n = (in
1bd10 74 29 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74  t)(pParse->sLast
1bd20 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d  Token.z - pName-
1bd30 3e 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c  >z) + pParse->sL
1bd40 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20  astToken.n;.    
1bd50 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e    if( pName->z[n
1bd60 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a  -1]==';' ) n--;.
1bd70 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64        /* A named
1bd80 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65   index with an e
1bd90 78 70 6c 69 63 69 74 20 43 52 45 41 54 45 20 49  xplicit CREATE I
1bda0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
1bdb0 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  /.      zStmt = 
1bdc0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
1bdd0 62 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e 44  b, "CREATE%s IND
1bde0 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20  EX %.*s",.      
1bdf0 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f    onError==OE_No
1be00 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51  ne ? "" : " UNIQ
1be10 55 45 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a  UE", n, pName->z
1be20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1be30 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61      /* An automa
1be40 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74 65  tic index create
1be50 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b  d by a PRIMARY K
1be60 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  EY or UNIQUE con
1be70 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20  straint */.     
1be80 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69   /* zStmt = sqli
1be90 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20  te3MPrintf(""); 
1bea0 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  */.      zStmt =
1beb0 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
1bec0 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69  * Add an entry i
1bed0 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  n sqlite_master 
1bee0 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20  for this index. 
1bef0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
1bf00 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
1bf10 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49  rse, .        "I
1bf20 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73  NSERT INTO %Q.%s
1bf30 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c   VALUES('index',
1bf40 25 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c  %Q,%Q,#%d,%Q);",
1bf50 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  .        db->aDb
1bf60 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20  [iDb].zDbSName, 
1bf70 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20  MASTER_NAME,.   
1bf80 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
1bf90 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  me,.        pTab
1bfa0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
1bfb0 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a   iMem,.        z
1bfc0 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Stmt.    );.    
1bfd0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1bfe0 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f  , zStmt);..    /
1bff0 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78  * Fill the index
1c000 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72   with data and r
1c010 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d  eparse the schem
1c020 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78  a. Code an OP_Ex
1c030 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69  pire.    ** to i
1c040 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72  nvalidate all pr
1c050 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  e-compiled state
1c060 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ments..    */.  
1c070 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29    if( pTblName )
1c080 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
1c090 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
1c0a0 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29  e, pIndex, iMem)
1c0b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
1c0c0 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
1c0d0 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
1c0e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61  sqlite3VdbeAddPa
1c0f0 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69  rseSchemaOp(v, i
1c100 44 62 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c  Db,.         sql
1c110 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1c120 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74  "name='%q' AND t
1c130 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 70 49  ype='index'", pI
1c140 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  ndex->zName));. 
1c150 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c160 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 45 78 70  AddOp0(v, OP_Exp
1c170 69 72 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ire);.    }..   
1c180 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1c190 48 65 72 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e  Here(v, pIndex->
1c1a0 74 6e 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  tnum);.  }..  /*
1c1b0 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20   When adding an 
1c1c0 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73  index to the lis
1c1d0 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72  t of indices for
1c1e0 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20   a table, make. 
1c1f0 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64   ** sure all ind
1c200 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f  ices labeled OE_
1c210 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74  Replace come aft
1c220 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62  er all those lab
1c230 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e  eled.  ** OE_Ign
1c240 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ore.  This is ne
1c250 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20  cessary for the 
1c260 63 6f 72 72 65 63 74 20 63 6f 6e 73 74 72 61 69  correct constrai
1c270 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72  nt check.  ** pr
1c280 6f 63 65 73 73 69 6e 67 20 28 69 6e 20 73 71 6c  ocessing (in sql
1c290 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73  ite3GenerateCons
1c2a0 74 72 61 69 6e 74 43 68 65 63 6b 73 28 29 29 20  traintChecks()) 
1c2b0 61 73 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20  as part of.  ** 
1c2c0 55 50 44 41 54 45 20 61 6e 64 20 49 4e 53 45 52  UPDATE and INSER
1c2d0 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a  T statements.  .
1c2e0 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
1c2f0 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c  nit.busy || pTbl
1c300 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Name==0 ){.    i
1c310 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  f( onError!=OE_R
1c320 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e  eplace || pTab->
1c330 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20  pIndex==0.      
1c340 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64     || pTab->pInd
1c350 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
1c360 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20  Replace){.      
1c370 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
1c380 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
1c390 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78      pTab->pIndex
1c3a0 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
1c3b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
1c3c0 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62  x *pOther = pTab
1c3d0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
1c3e0 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70  while( pOther->p
1c3f0 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e  Next && pOther->
1c400 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d  pNext->onError!=
1c410 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20  OE_Replace ){.  
1c420 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70        pOther = p
1c430 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
1c440 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64      }.      pInd
1c450 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68  ex->pNext = pOth
1c460 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
1c470 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d   pOther->pNext =
1c480 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20   pIndex;.    }. 
1c490 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20     pIndex = 0;. 
1c4a0 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75   }..  /* Clean u
1c4b0 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  p before exiting
1c4c0 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f   */.exit_create_
1c4d0 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e  index:.  if( pIn
1c4e0 64 65 78 20 29 20 66 72 65 65 49 6e 64 65 78 28  dex ) freeIndex(
1c4f0 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 73  db, pIndex);.  s
1c500 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1c510 28 64 62 2c 20 70 50 49 57 68 65 72 65 29 3b 0a  (db, pPIWhere);.
1c520 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
1c530 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
1c540 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63  t);.  sqlite3Src
1c550 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1c560 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  TblName);.  sqli
1c570 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
1c580 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ame);.}../*.** F
1c590 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69  ill the Index.ai
1c5a0 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77  RowEst[] array w
1c5b0 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f  ith default info
1c5c0 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d  rmation - inform
1c5d0 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75  ation.** to be u
1c5e0 73 65 64 20 77 68 65 6e 20 77 65 20 68 61 76 65  sed when we have
1c5f0 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41   not run the ANA
1c600 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  LYZE command..**
1c610 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20  .** aiRowEst[0] 
1c620 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20 63  is supposed to c
1c630 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65  ontain the numbe
1c640 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
1c650 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53   the index..** S
1c660 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b  ince we do not k
1c670 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c  now, guess 1 mil
1c680 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b  lion.  aiRowEst[
1c690 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  1] is an estimat
1c6a0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  e of the.** numb
1c6b0 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
1c6c0 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74  e table that mat
1c6d0 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  ch any particula
1c6e0 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a  r value of the.*
1c6f0 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f  * first column o
1c700 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69  f the index.  ai
1c710 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20  RowEst[2] is an 
1c720 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
1c730 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77  number.** of row
1c740 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79  s that match any
1c750 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62   particular comb
1c760 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  ination of the f
1c770 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a  irst 2 columns.*
1c780 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  * of the index. 
1c790 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
1c7a0 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62  It must always b
1c7b0 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
1c7c0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  *.**           a
1c7d0 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f  iRowEst[N]<=aiRo
1c7e0 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20  wEst[N-1].**    
1c7f0 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b         aiRowEst[
1c800 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72  N]>=1.**.** Apar
1c810 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20  t from that, we 
1c820 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67  have little to g
1c830 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74  o on besides int
1c840 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20  uition as to.** 
1c850 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73  how aiRowEst[] s
1c860 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c  hould be initial
1c870 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65  ized.  The numbe
1c880 72 73 20 67 65 6e 65 72 61 74 65 64 20 68 65 72  rs generated her
1c890 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f  e.** are based o
1c8a0 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73  n typical values
1c8b0 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c   found in actual
1c8c0 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69   indices..*/.voi
1c8d0 64 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74  d sqlite3Default
1c8e0 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49  RowEst(Index *pI
1c8f0 64 78 29 7b 0a 20 20 2f 2a 20 20 20 20 20 20 20  dx){.  /*       
1c900 20 20 20 20 20 20 20 20 20 31 30 2c 20 20 39 2c           10,  9,
1c910 20 20 38 2c 20 20 37 2c 20 20 36 20 2a 2f 0a 20    8,  7,  6 */. 
1c920 20 4c 6f 67 45 73 74 20 61 56 61 6c 5b 5d 20 3d   LogEst aVal[] =
1c930 20 7b 20 33 33 2c 20 33 32 2c 20 33 30 2c 20 32   { 33, 32, 30, 2
1c940 38 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f 67 45 73  8, 26 };.  LogEs
1c950 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52  t *a = pIdx->aiR
1c960 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 6e 74 20  owLogEst;.  int 
1c970 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 41 72 72 61  nCopy = MIN(Arra
1c980 79 53 69 7a 65 28 61 56 61 6c 29 2c 20 70 49 64  ySize(aVal), pId
1c990 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 69  x->nKeyCol);.  i
1c9a0 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 6e 64 65  nt i;..  /* Inde
1c9b0 78 65 73 20 77 69 74 68 20 64 65 66 61 75 6c 74  xes with default
1c9c0 20 72 6f 77 20 65 73 74 69 6d 61 74 65 73 20 73   row estimates s
1c9d0 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 73  hould not have s
1c9e0 74 61 74 31 20 64 61 74 61 20 2a 2f 0a 20 20 61  tat1 data */.  a
1c9f0 73 73 65 72 74 28 20 21 70 49 64 78 2d 3e 68 61  ssert( !pIdx->ha
1ca00 73 53 74 61 74 31 20 29 3b 0a 0a 20 20 2f 2a 20  sStat1 );..  /* 
1ca10 53 65 74 20 74 68 65 20 66 69 72 73 74 20 65 6e  Set the first en
1ca20 74 72 79 20 28 6e 75 6d 62 65 72 20 6f 66 20 72  try (number of r
1ca30 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  ows in the index
1ca40 29 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74  ) to the estimat
1ca50 65 64 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  ed .  ** number 
1ca60 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
1ca70 61 62 6c 65 2c 20 6f 72 20 68 61 6c 66 20 74 68  able, or half th
1ca80 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
1ca90 20 69 6e 20 74 68 65 20 74 61 62 6c 65 0a 20 20   in the table.  
1caa0 2a 2a 20 66 6f 72 20 61 20 70 61 72 74 69 61 6c  ** for a partial
1cab0 20 69 6e 64 65 78 2e 20 20 20 42 75 74 20 64 6f   index.   But do
1cac0 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 65 73 74   not let the est
1cad0 69 6d 61 74 65 20 64 72 6f 70 20 62 65 6c 6f 77  imate drop below
1cae0 20 31 30 2e 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d   10. */.  a[0] =
1caf0 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e   pIdx->pTable->n
1cb00 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 66 28  RowLogEst;.  if(
1cb10 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
1cb20 68 65 72 65 21 3d 30 20 29 20 61 5b 30 5d 20 2d  here!=0 ) a[0] -
1cb30 3d 20 31 30 3b 20 20 61 73 73 65 72 74 28 20 31  = 10;  assert( 1
1cb40 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
1cb50 28 32 29 20 29 3b 0a 20 20 69 66 28 20 61 5b 30  (2) );.  if( a[0
1cb60 5d 3c 33 33 20 29 20 61 5b 30 5d 20 3d 20 33 33  ]<33 ) a[0] = 33
1cb70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cb80 20 20 20 61 73 73 65 72 74 28 20 33 33 3d 3d 73     assert( 33==s
1cb90 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29  qlite3LogEst(10)
1cba0 20 29 3b 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61   );..  /* Estima
1cbb0 74 65 20 74 68 61 74 20 61 5b 31 5d 20 69 73 20  te that a[1] is 
1cbc0 31 30 2c 20 61 5b 32 5d 20 69 73 20 39 2c 20 61  10, a[2] is 9, a
1cbd0 5b 33 5d 20 69 73 20 38 2c 20 61 5b 34 5d 20 69  [3] is 8, a[4] i
1cbe0 73 20 37 2c 20 61 5b 35 5d 20 69 73 0a 20 20 2a  s 7, a[5] is.  *
1cbf0 2a 20 36 20 61 6e 64 20 65 61 63 68 20 73 75 62  * 6 and each sub
1cc00 73 65 71 75 65 6e 74 20 76 61 6c 75 65 20 28 69  sequent value (i
1cc10 66 20 61 6e 79 29 20 69 73 20 35 2e 20 20 2a 2f  f any) is 5.  */
1cc20 0a 20 20 6d 65 6d 63 70 79 28 26 61 5b 31 5d 2c  .  memcpy(&a[1],
1cc30 20 61 56 61 6c 2c 20 6e 43 6f 70 79 2a 73 69 7a   aVal, nCopy*siz
1cc40 65 6f 66 28 4c 6f 67 45 73 74 29 29 3b 0a 20 20  eof(LogEst));.  
1cc50 66 6f 72 28 69 3d 6e 43 6f 70 79 2b 31 3b 20 69  for(i=nCopy+1; i
1cc60 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  <=pIdx->nKeyCol;
1cc70 20 69 2b 2b 29 7b 0a 20 20 20 20 61 5b 69 5d 20   i++){.    a[i] 
1cc80 3d 20 32 33 3b 20 20 20 20 20 20 20 20 20 20 20  = 23;           
1cc90 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1cca0 20 32 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   23==sqlite3LogE
1ccb0 73 74 28 35 29 20 29 3b 0a 20 20 7d 0a 0a 20 20  st(5) );.  }..  
1ccc0 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
1ccd0 65 33 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20  e3LogEst(1) );. 
1cce0 20 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64   if( IsUniqueInd
1ccf0 65 78 28 70 49 64 78 29 20 29 20 61 5b 70 49 64  ex(pIdx) ) a[pId
1cd00 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20 3d 20 30 3b  x->nKeyCol] = 0;
1cd10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1cd20 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70  outine will drop
1cd30 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d   an existing nam
1cd40 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20  ed index.  This 
1cd50 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65  routine.** imple
1cd60 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49  ments the DROP I
1cd70 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a  NDEX statement..
1cd80 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
1cd90 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a  ropIndex(Parse *
1cda0 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
1cdb0 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78  *pName, int ifEx
1cdc0 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a  ists){.  Index *
1cdd0 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a  pIndex;.  Vdbe *
1cde0 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
1cdf0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1ce00 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73 73   int iDb;..  ass
1ce10 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
1ce20 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76  r==0 );   /* Nev
1ce30 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  er called with p
1ce40 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20  rior errors */. 
1ce50 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1ce60 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
1ce70 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1ce80 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  x;.  }.  assert(
1ce90 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
1cea0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
1ceb0 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
1cec0 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
1ced0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
1cee0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
1cef0 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
1cf00 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70  3FindIndex(db, p
1cf10 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
1cf20 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
1cf30 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20  atabase);.  if( 
1cf40 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20  pIndex==0 ){.   
1cf50 20 69 66 28 20 21 69 66 45 78 69 73 74 73 20 29   if( !ifExists )
1cf60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1cf70 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1cf80 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
1cf90 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a  %S", pName, 0);.
1cfa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cfb0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
1cfc0 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50  fyNamedSchema(pP
1cfd0 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  arse, pName->a[0
1cfe0 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
1cff0 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
1d000 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
1d010 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
1d020 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
1d030 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 64 78   if( pIndex->idx
1d040 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58  Type!=SQLITE_IDX
1d050 54 59 50 45 5f 41 50 50 44 45 46 20 29 7b 0a 20  TYPE_APPDEF ){. 
1d060 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1d070 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
1d080 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
1d090 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20  h UNIQUE ".     
1d0a0 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59   "or PRIMARY KEY
1d0b0 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e   constraint cann
1d0c0 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
1d0d0 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  0);.    goto exi
1d0e0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1d0f0 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
1d100 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
1d110 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  b, pIndex->pSche
1d120 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ma);.#ifndef SQL
1d130 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
1d140 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
1d150 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
1d160 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _DROP_INDEX;.   
1d170 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
1d180 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20  Index->pTable;. 
1d190 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1d1a0 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
1d1b0 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
1d1c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
1d1d0 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
1d1e0 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71  iDb);.    if( sq
1d1f0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1d200 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
1d210 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
1d220 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
1d230 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1d240 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
1d250 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
1d260 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51   iDb ) code = SQ
1d270 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49  LITE_DROP_TEMP_I
1d280 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
1d290 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1d2a0 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e  Parse, code, pIn
1d2b0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62  dex->zName, pTab
1d2c0 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
1d2d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1d2e0 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20  _drop_index;.   
1d2f0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1d300 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1d310 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
1d320 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74  index and from t
1d330 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
1d340 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
1d350 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1d360 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1d370 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
1d380 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
1d390 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 1, iDb);.    
1d3a0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
1d3b0 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
1d3c0 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
1d3d0 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d  Q.%s WHERE name=
1d3e0 25 51 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64  %Q AND type='ind
1d3f0 65 78 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d  ex'",.       db-
1d400 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
1d410 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c  me, MASTER_NAME,
1d420 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20   pIndex->zName. 
1d430 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
1d440 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
1d450 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69  (pParse, iDb, "i
1d460 64 78 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  dx", pIndex->zNa
1d470 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
1d480 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
1d490 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 64  rse, iDb);.    d
1d4a0 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
1d4b0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74  Parse, pIndex->t
1d4c0 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  num, iDb);.    s
1d4d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1d4e0 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78  (v, OP_DropIndex
1d4f0 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e  , iDb, 0, 0, pIn
1d500 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  dex->zName, 0);.
1d510 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69    }..exit_drop_i
1d520 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53  ndex:.  sqlite3S
1d530 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
1d540 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pName);.}../*.*
1d550 2a 20 70 41 72 72 61 79 20 69 73 20 61 20 70 6f  * pArray is a po
1d560 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61  inter to an arra
1d570 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45 61  y of objects. Ea
1d580 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ch object in the
1d590 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45  .** array is szE
1d5a0 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20 73 69  ntry bytes in si
1d5b0 7a 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ze. This routine
1d5c0 20 75 73 65 73 20 73 71 6c 69 74 65 33 44 62 52   uses sqlite3DbR
1d5d0 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65  ealloc().** to e
1d5e0 78 74 65 6e 64 20 74 68 65 20 61 72 72 61 79 20  xtend the array 
1d5f0 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69 73  so that there is
1d600 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77   space for a new
1d610 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20 65   object at the e
1d620 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  nd..**.** When t
1d630 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d640 63 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79  called, *pnEntry
1d650 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 75   contains the cu
1d660 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a  rrent size of.**
1d670 20 74 68 65 20 61 72 72 61 79 20 28 69 6e 20 65   the array (in e
1d680 6e 74 72 69 65 73 20 2d 20 73 6f 20 74 68 65 20  ntries - so the 
1d690 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28 28  allocation is ((
1d6a0 2a 70 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e  *pnEntry) * szEn
1d6b0 74 72 79 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e  try) bytes.** in
1d6c0 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49   total)..**.** I
1d6d0 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20  f the realloc() 
1d6e0 69 73 20 73 75 63 63 65 73 73 66 75 6c 20 28 69  is successful (i
1d6f0 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f  .e. if no OOM co
1d700 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c  ndition occurs),
1d710 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c   the.** space al
1d720 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
1d730 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20 7a 65  new object is ze
1d740 72 6f 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75  roed, *pnEntry u
1d750 70 64 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66  pdated to.** ref
1d760 6c 65 63 74 20 74 68 65 20 6e 65 77 20 73 69 7a  lect the new siz
1d770 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 61  e of the array a
1d780 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
1d790 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
1d7a0 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  on.** returned. 
1d7b0 2a 70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20  *pIdx is set to 
1d7c0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
1d7d0 20 6e 65 77 20 61 72 72 61 79 20 65 6e 74 72 79   new array entry
1d7e0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
1d7f0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1d800 69 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29  if the realloc()
1d810 20 66 61 69 6c 73 2c 20 2a 70 49 64 78 20 69 73   fails, *pIdx is
1d820 20 73 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45   set to -1, *pnE
1d830 6e 74 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20  ntry remains.** 
1d840 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20  unchanged and a 
1d850 63 6f 70 79 20 6f 66 20 70 41 72 72 61 79 20 72  copy of pArray r
1d860 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64  eturned..*/.void
1d870 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c   *sqlite3ArrayAl
1d880 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65  locate(.  sqlite
1d890 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43  3 *db,      /* C
1d8a0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74  onnection to not
1d8b0 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61  ify of malloc fa
1d8c0 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64  ilures */.  void
1d8d0 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a   *pArray,     /*
1d8e0 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   Array of object
1d8f0 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65 61  s.  Might be rea
1d900 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e  llocated */.  in
1d910 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20  t szEntry,      
1d920 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20  /* Size of each 
1d930 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72  object in the ar
1d940 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ray */.  int *pn
1d950 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75  Entry,     /* Nu
1d960 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20  mber of objects 
1d970 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
1d980 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20   */.  int *pIdx 
1d990 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1d9a0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
1d9b0 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f  new slot here */
1d9c0 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
1d9d0 20 69 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e 74 72   int n = *pnEntr
1d9e0 79 3b 0a 20 20 69 66 28 20 28 6e 20 26 20 28 6e  y;.  if( (n & (n
1d9f0 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  -1))==0 ){.    i
1da00 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f  nt sz = (n==0) ?
1da10 20 31 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f   1 : 2*n;.    vo
1da20 69 64 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  id *pNew = sqlit
1da30 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
1da40 70 41 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74  pArray, sz*szEnt
1da50 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ry);.    if( pNe
1da60 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  w==0 ){.      *p
1da70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Idx = -1;.      
1da80 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20  return pArray;. 
1da90 20 20 20 7d 0a 20 20 20 20 70 41 72 72 61 79 20     }.    pArray 
1daa0 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20  = pNew;.  }.  z 
1dab0 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b  = (char*)pArray;
1dac0 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a  .  memset(&z[n *
1dad0 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a   szEntry], 0, sz
1dae0 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20  Entry);.  *pIdx 
1daf0 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72  = n;.  ++*pnEntr
1db00 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72  y;.  return pArr
1db10 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  ay;.}../*.** App
1db20 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  end a new elemen
1db30 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49  t to the given I
1db40 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  dList.  Create a
1db50 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a   new IdList if.*
1db60 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a  * need be..**.**
1db70 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73   A new IdList is
1db80 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
1db90 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66  LL if malloc() f
1dba0 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20  ails..*/.IdList 
1dbb0 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70  *sqlite3IdListAp
1dbc0 70 65 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62  pend(sqlite3 *db
1dbd0 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  , IdList *pList,
1dbe0 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
1dbf0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1dc00 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
1dc10 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44  pList = sqlite3D
1dc20 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
1dc30 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29  sizeof(IdList) )
1dc40 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
1dc50 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1dc60 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20   }.  pList->a = 
1dc70 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
1dc80 63 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a  cate(.      db,.
1dc90 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a        pList->a,.
1dca0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69        sizeof(pLi
1dcb0 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20  st->a[0]),.     
1dcc0 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20   &pList->nId,.  
1dcd0 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66      &i.  );.  if
1dce0 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  ( i<0 ){.    sql
1dcf0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
1dd00 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
1dd10 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1dd20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
1dd30 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
1dd40 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
1dd50 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20  oken);.  return 
1dd60 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
1dd70 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74  Delete an IdList
1dd80 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1dd90 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71  3IdListDelete(sq
1dda0 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
1ddb0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
1ddc0 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1ddd0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
1dde0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1ddf0 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
1de00 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1de10 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  , pList->a[i].zN
1de20 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ame);.  }.  sqli
1de30 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
1de40 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
1de50 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
1de60 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
1de70 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1de80 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65   in pList of the
1de90 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65   identifier name
1dea0 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d  d zId.  Return -
1deb0 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e  1.** if not foun
1dec0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1ded0 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c  3IdListIndex(IdL
1dee0 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73  ist *pList, cons
1def0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
1df00 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1df10 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1df20 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   -1;.  for(i=0; 
1df30 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
1df40 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
1df50 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
1df60 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  ->a[i].zName, zN
1df70 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
1df80 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
1df90 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78   -1;.}../*.** Ex
1dfa0 70 61 6e 64 20 74 68 65 20 73 70 61 63 65 20 61  pand the space a
1dfb0 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
1dfc0 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 20 6f   given SrcList o
1dfd0 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72 65 61  bject by.** crea
1dfe0 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65 77 20  ting nExtra new 
1dff0 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67 20  slots beginning 
1e000 61 74 20 69 53 74 61 72 74 2e 20 20 69 53 74 61  at iStart.  iSta
1e010 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73 65 64  rt is zero based
1e020 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61  ..** New slots a
1e030 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a  re zeroed..**.**
1e040 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 75   For example, su
1e050 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73 74 20  ppose a SrcList 
1e060 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69  initially contai
1e070 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73 3a 20  ns two entries: 
1e080 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e  A,B..** To appen
1e090 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65 73 20  d 3 new entries 
1e0a0 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f  onto the end, do
1e0b0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1e0c0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
1e0d0 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 6c 69  large(db, pSrcli
1e0e0 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a  st, 3, 2);.**.**
1e0f0 20 41 66 74 65 72 20 74 68 65 20 63 61 6c 6c 20   After the call 
1e100 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64 20 63  above it would c
1e110 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e  ontain:  A, B, n
1e120 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a  il, nil, nil..**
1e130 20 49 66 20 74 68 65 20 69 53 74 61 72 74 20 61   If the iStart a
1e140 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65 65 6e  rgument had been
1e150 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20 32 2c   1 instead of 2,
1e160 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
1e170 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62  .** would have b
1e180 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69  een:  A, nil, ni
1e190 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70  l, nil, B.  To p
1e1a0 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73  repend the new s
1e1b0 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74  lots,.** the iSt
1e1c0 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c 64 20  art value would 
1e1d0 62 65 20 30 2e 20 20 54 68 65 20 72 65 73 75 6c  be 0.  The resul
1e1e0 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20  t then would.** 
1e1f0 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69  be: nil, nil, ni
1e200 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49  l, A, B..**.** I
1e210 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
1e220 61 74 69 6f 6e 20 66 61 69 6c 73 20 74 68 65 20  ation fails the 
1e230 53 72 63 4c 69 73 74 20 69 73 20 75 6e 63 68 61  SrcList is uncha
1e240 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a 20 64 62  nged.  The.** db
1e250 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
1e260 6c 61 67 20 77 69 6c 6c 20 62 65 20 73 65 74 20  lag will be set 
1e270 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c  to true..*/.SrcL
1e280 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
1e290 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20 73 71  istEnlarge(.  sq
1e2a0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1e2b0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
1e2c0 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
1e2d0 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f 72 73 20  y of OOM errors 
1e2e0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1e2f0 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 53  rc,     /* The S
1e300 72 63 4c 69 73 74 20 74 6f 20 62 65 20 65 6e 6c  rcList to be enl
1e310 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  arged */.  int n
1e320 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 2f 2a  Extra,        /*
1e330 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77 20 73   Number of new s
1e340 6c 6f 74 73 20 74 6f 20 61 64 64 20 74 6f 20 70  lots to add to p
1e350 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e  Src->a[] */.  in
1e360 74 20 69 53 74 61 72 74 20 20 20 20 20 20 20 20  t iStart        
1e370 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 53 72   /* Index in pSr
1e380 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74 20  c->a[] of first 
1e390 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20  new slot */.){. 
1e3a0 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61   int i;..  /* Sa
1e3b0 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
1e3c0 20 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74   calling paramet
1e3d0 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ers */.  assert(
1e3e0 20 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20   iStart>=0 );.  
1e3f0 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d  assert( nExtra>=
1e400 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
1e410 53 72 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Src!=0 );.  asse
1e420 72 74 28 20 69 53 74 61 72 74 3c 3d 70 53 72 63  rt( iStart<=pSrc
1e430 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20  ->nSrc );..  /* 
1e440 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74 69 6f  Allocate additio
1e450 6e 61 6c 20 73 70 61 63 65 20 69 66 20 6e 65 65  nal space if nee
1e460 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 28 75 33  ded */.  if( (u3
1e470 32 29 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78  2)pSrc->nSrc+nEx
1e480 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63  tra>pSrc->nAlloc
1e490 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
1e4a0 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e  *pNew;.    int n
1e4b0 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d 3e 6e 53  Alloc = pSrc->nS
1e4c0 72 63 2a 32 2b 6e 45 78 74 72 61 3b 0a 20 20 20  rc*2+nExtra;.   
1e4d0 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20 70   int nGot;.    p
1e4e0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
1e4f0 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c  ealloc(db, pSrc,
1e500 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e510 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b 20  sizeof(*pSrc) + 
1e520 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f  (nAlloc-1)*sizeo
1e530 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b  f(pSrc->a[0]) );
1e540 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
1e550 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1e560 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1e570 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed );.      retu
1e580 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a 20  rn pSrc;.    }. 
1e590 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a     pSrc = pNew;.
1e5a0 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c 69      nGot = (sqli
1e5b0 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
1e5c0 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a 65  db, pNew) - size
1e5d0 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a 65 6f  of(*pSrc))/sizeo
1e5e0 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b  f(pSrc->a[0])+1;
1e5f0 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f  .    pSrc->nAllo
1e600 63 20 3d 20 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20  c = nGot;.  }.. 
1e610 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e   /* Move existin
1e620 67 20 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d  g slots that com
1e630 65 20 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c  e after the newl
1e640 79 20 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73  y inserted slots
1e650 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65  .  ** out of the
1e660 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d   way */.  for(i=
1e670 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e  pSrc->nSrc-1; i>
1e680 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20  =iStart; i--){. 
1e690 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78     pSrc->a[i+nEx
1e6a0 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69  tra] = pSrc->a[i
1e6b0 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e  ];.  }.  pSrc->n
1e6c0 53 72 63 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a  Src += nExtra;..
1e6d0 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65    /* Zero the ne
1e6e0 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c  wly allocated sl
1e6f0 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ots */.  memset(
1e700 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d  &pSrc->a[iStart]
1e710 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63  , 0, sizeof(pSrc
1e720 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b  ->a[0])*nExtra);
1e730 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b  .  for(i=iStart;
1e740 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61   i<iStart+nExtra
1e750 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63  ; i++){.    pSrc
1e760 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d  ->a[i].iCursor =
1e770 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52   -1;.  }..  /* R
1e780 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1e790 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20  to the enlarged 
1e7a0 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74  SrcList */.  ret
1e7b0 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a  urn pSrc;.}.../*
1e7c0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
1e7d0 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
1e7e0 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
1e7f0 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
1e800 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65  SrcList if.** ne
1e810 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e  ed be.  A new en
1e820 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69  try is created i
1e830 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76  n the SrcList ev
1e840 65 6e 20 69 66 20 70 54 61 62 6c 65 20 69 73 20  en if pTable is 
1e850 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72  NULL..**.** A Sr
1e860 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  cList is returne
1e870 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68  d, or NULL if th
1e880 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72  ere is an OOM er
1e890 72 6f 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ror.  The return
1e8a0 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69  ed.** SrcList mi
1e8b0 67 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ght be the same 
1e8c0 61 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  as the SrcList t
1e8d0 68 61 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72  hat was input or
1e8e0 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20   it might be.** 
1e8f0 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61  a new one.  If a
1e900 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73  n OOM error does
1e910 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68   occurs, then th
1e920 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66  e prior value of
1e930 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69   pList.** that i
1e940 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20  s input to this 
1e950 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d  routine is autom
1e960 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a  atically freed..
1e970 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61  **.** If pDataba
1e980 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20  se is not null, 
1e990 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1e9a0 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f  e table has an o
1e9b0 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  ptional.** datab
1e9c0 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e  ase name prefix.
1e9d0 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64    Like this:  "d
1e9e0 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20  atabase.table". 
1e9f0 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a   The pDatabase.*
1ea00 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
1ea10 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
1ea20 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73  he pTable points
1ea30 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1ea40 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72   name..** The Sr
1ea50 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  cList.a[].zName 
1ea60 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20  field is filled 
1ea70 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e  with the table n
1ea80 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a  ame which might.
1ea90 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61  ** come from pTa
1eaa0 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73  ble (if pDatabas
1eab0 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72  e is NULL) or fr
1eac0 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a  om pDatabase.  .
1ead0 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  ** SrcList.a[].z
1eae0 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c  Database is fill
1eaf0 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
1eb00 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70  base name from p
1eb10 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74  Table,.** or wit
1eb20 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74  h NULL if no dat
1eb30 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69  abase is specifi
1eb40 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68  ed..**.** In oth
1eb50 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c  er words, if cal
1eb60 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  l like this:.**.
1eb70 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
1eb80 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1eb90 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,B,0);.**.** 
1eba0 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c  Then B is a tabl
1ebb0 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  e name and the d
1ebc0 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
1ebd0 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66  unspecified.  If
1ebe0 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20   called.** like 
1ebf0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
1ec00 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
1ec10 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43  stAppend(D,A,B,C
1ec20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20  );.**.** Then C 
1ec30 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  is the table nam
1ec40 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64  e and B is the d
1ec50 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49  atabase name.  I
1ec60 66 20 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a  f C is defined.*
1ec70 2a 20 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20  * then so is B. 
1ec80 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1ec90 20 77 65 20 6e 65 76 65 72 20 68 61 76 65 20 61   we never have a
1eca0 20 63 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a   case where:.**.
1ecb0 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
1ecc0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1ecd0 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,0,C);.**.** 
1ece0 42 6f 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20  Both pTable and 
1ecf0 70 44 61 74 61 62 61 73 65 20 61 72 65 20 61 73  pDatabase are as
1ed00 73 75 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74  sumed to be quot
1ed10 65 64 2e 20 20 54 68 65 79 20 61 72 65 20 64 65  ed.  They are de
1ed20 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65  quoted.** before
1ed30 20 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20   being added to 
1ed40 74 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a  the SrcList..*/.
1ed50 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
1ed60 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  SrcListAppend(. 
1ed70 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1ed80 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1ed90 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20  on to notify of 
1eda0 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20  malloc failures 
1edb0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c  */.  SrcList *pL
1edc0 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65  ist,     /* Appe
1edd0 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69  nd to this SrcLi
1ede0 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73  st. NULL creates
1edf0 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a   a new SrcList *
1ee00 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
1ee10 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  e,      /* Table
1ee20 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20   to append */.  
1ee30 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65  Token *pDatabase
1ee40 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1ee50 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
1ee60 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  ){.  struct SrcL
1ee70 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1ee80 0a 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61  .  assert( pData
1ee90 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c  base==0 || pTabl
1eea0 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e  e!=0 );  /* Cann
1eeb0 6f 74 20 68 61 76 65 20 43 20 77 69 74 68 6f 75  ot have C withou
1eec0 74 20 42 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  t B */.  assert(
1eed0 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
1eee0 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
1eef0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44  pList = sqlite3D
1ef00 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
1ef10 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29   sizeof(SrcList)
1ef20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
1ef30 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
1ef40 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
1ef50 6f 63 20 3d 20 31 3b 0a 20 20 20 20 70 4c 69 73  oc = 1;.    pLis
1ef60 74 2d 3e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20  t->nSrc = 1;.   
1ef70 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e   memset(&pList->
1ef80 61 5b 30 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  a[0], 0, sizeof(
1ef90 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
1efa0 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69     pList->a[0].i
1efb0 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d  Cursor = -1;.  }
1efc0 65 6c 73 65 7b 0a 20 20 20 20 70 4c 69 73 74 20  else{.    pList 
1efd0 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1efe0 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c 69 73  Enlarge(db, pLis
1eff0 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72  t, 1, pList->nSr
1f000 63 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  c);.  }.  if( db
1f010 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1f020 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63  {.    sqlite3Src
1f030 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1f040 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72  List);.    retur
1f050 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  n 0;.  }.  pItem
1f060 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
1f070 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69  st->nSrc-1];.  i
1f080 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
1f090 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20  pDatabase->z==0 
1f0a0 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  ){.    pDatabase
1f0b0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
1f0c0 70 44 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20  pDatabase ){.   
1f0d0 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20   Token *pTemp = 
1f0e0 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70  pDatabase;.    p
1f0f0 44 61 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c  Database = pTabl
1f100 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20  e;.    pTable = 
1f110 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74  pTemp;.  }.  pIt
1f120 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
1f130 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1f140 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
1f150 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
1f160 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1f170 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74  omToken(db, pDat
1f180 61 62 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  abase);.  return
1f190 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
1f1a0 20 41 73 73 69 67 6e 20 56 64 62 65 43 75 72 73   Assign VdbeCurs
1f1b0 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 73  or index numbers
1f1c0 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   to all tables i
1f1d0 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76  n a SrcList.*/.v
1f1e0 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
1f1f0 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
1f200 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1f210 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
1f220 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
1f230 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1f240 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28  pItem;.  assert(
1f250 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d  pList || pParse-
1f260 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1f270 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  d );.  if( pList
1f280 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c   ){.    for(i=0,
1f290 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
1f2a0 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20   i<pList->nSrc; 
1f2b0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
1f2c0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1f2d0 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65  iCursor>=0 ) bre
1f2e0 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ak;.      pItem-
1f2f0 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  >iCursor = pPars
1f300 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
1f310 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
1f320 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
1f330 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
1f340 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
1f350 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  e, pItem->pSelec
1f360 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20  t->pSrc);.      
1f370 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
1f380 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
1f390 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e  ntire SrcList in
1f3a0 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20  cluding all its 
1f3b0 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  substructure..*/
1f3c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
1f3d0 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
1f3e0 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20  e3 *db, SrcList 
1f3f0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1f400 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1f410 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1f420 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1f430 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70   return;.  for(p
1f440 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
1f450 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  =0; i<pList->nSr
1f460 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
1f470 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
1f480 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
1f490 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73  Database);.    s
1f4a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1f4b0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
1f4c0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1f4d0 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  e(db, pItem->zAl
1f4e0 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ias);.    if( pI
1f4f0 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
1f500 64 42 79 20 29 20 73 71 6c 69 74 65 33 44 62 46  dBy ) sqlite3DbF
1f510 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75  ree(db, pItem->u
1f520 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20  1.zIndexedBy);. 
1f530 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
1f540 2e 69 73 54 61 62 46 75 6e 63 20 29 20 73 71 6c  .isTabFunc ) sql
1f550 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
1f560 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31  te(db, pItem->u1
1f570 2e 70 46 75 6e 63 41 72 67 29 3b 0a 20 20 20 20  .pFuncArg);.    
1f580 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
1f590 6c 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54  le(db, pItem->pT
1f5a0 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ab);.    sqlite3
1f5b0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
1f5c0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29   pItem->pSelect)
1f5d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1f5e0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  rDelete(db, pIte
1f5f0 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c  m->pOn);.    sql
1f600 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
1f610 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69  (db, pItem->pUsi
1f620 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ng);.  }.  sqlit
1f630 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
1f640 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
1f650 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1f660 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
1f670 72 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e 65  rser to add a ne
1f680 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a  w term to the.**
1f690 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69 6e   end of a growin
1f6a0 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  g FROM clause.  
1f6b0 54 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  The "p" paramete
1f6c0 72 20 69 73 20 74 68 65 20 70 61 72 74 20 6f 66  r is the part of
1f6d0 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
1f6e0 75 73 65 20 74 68 61 74 20 68 61 73 20 61 6c 72  use that has alr
1f6f0 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74 72  eady been constr
1f700 75 63 74 65 64 2e 20 20 22 70 22 20 69 73 20 4e  ucted.  "p" is N
1f710 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69  ULL.** if this i
1f720 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
1f730 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1f740 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e 64  use.  pTable and
1f750 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61 72   pDatabase.** ar
1f760 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
1f770 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74 61  e table and data
1f780 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  base named in th
1f790 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
1f7a0 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  rm..** pDatabase
1f7b0 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   is NULL if the 
1f7c0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71 75  database name qu
1f7d0 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73 69  alifier is missi
1f7e0 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61  ng - the.** usua
1f7f0 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68 65 20  l case.  If the 
1f800 74 65 72 6d 20 68 61 73 20 61 6e 20 61 6c 69 61  term has an alia
1f810 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20 70  s, then pAlias p
1f820 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
1f830 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66  alias token.  If
1f840 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20 73   the term is a s
1f850 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70 53  ubquery, then pS
1f860 75 62 71 75 65 72 79 20 69 73 20 74 68 65 0a 2a  ubquery is the.*
1f870 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
1f880 6e 74 20 74 68 61 74 20 74 68 65 20 73 75 62 71  nt that the subq
1f890 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20 54  uery encodes.  T
1f8a0 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a  he pTable and.**
1f8b0 20 70 44 61 74 61 62 61 73 65 20 70 61 72 61 6d   pDatabase param
1f8c0 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20 66  eters are NULL f
1f8d0 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e 20 20  or subqueries.  
1f8e0 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73 69  The pOn and pUsi
1f8f0 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  ng.** parameters
1f900 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74   are the content
1f910 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20 55   of the ON and U
1f920 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SING clauses..**
1f930 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65 77  .** Return a new
1f940 20 53 72 63 4c 69 73 74 20 77 68 69 63 68 20 65   SrcList which e
1f950 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20 46 52  ncodes is the FR
1f960 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77 0a  OM with the new.
1f970 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a  ** term added..*
1f980 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
1f990 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
1f9a0 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73 65  romTerm(.  Parse
1f9b0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1f9c0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1f9d0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
1f9e0 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  st *p,          
1f9f0 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 70     /* The left p
1fa00 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  art of the FROM 
1fa10 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 73  clause already s
1fa20 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  een */.  Token *
1fa30 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  pTable,         
1fa40 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1fa50 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f 20  table to add to 
1fa60 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1fa70 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74  */.  Token *pDat
1fa80 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  abase,       /* 
1fa90 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
1faa0 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
1fab0 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65  pTable */.  Toke
1fac0 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20 20  n *pAlias,      
1fad0 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
1fae0 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
1faf0 65 20 41 53 20 73 75 62 65 78 70 72 65 73 73 69  e AS subexpressi
1fb00 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
1fb10 70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20 20  pSubquery,      
1fb20 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20 75 73  /* A subquery us
1fb30 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  ed in place of a
1fb40 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   table name */. 
1fb50 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20   Expr *pOn,     
1fb60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1fb70 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a  ON clause of a j
1fb80 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20  oin */.  IdList 
1fb90 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20 20 20  *pUsing         
1fba0 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63 6c   /* The USING cl
1fbb0 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a  ause of a join *
1fbc0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
1fbd0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1fbe0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
1fbf0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1fc00 20 69 66 28 20 21 70 20 26 26 20 28 70 4f 6e 20   if( !p && (pOn 
1fc10 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a 20 20  || pUsing) ){.  
1fc20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1fc30 67 28 70 50 61 72 73 65 2c 20 22 61 20 4a 4f 49  g(pParse, "a JOI
1fc40 4e 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75  N clause is requ
1fc50 69 72 65 64 20 62 65 66 6f 72 65 20 25 73 22 2c  ired before %s",
1fc60 20 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f 20 22   .      (pOn ? "
1fc70 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29 0a 20  ON" : "USING"). 
1fc80 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61     );.    goto a
1fc90 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
1fca0 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
1fcb0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1fcc0 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20  (db, p, pTable, 
1fcd0 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  pDatabase);.  if
1fce0 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28  ( p==0 || NEVER(
1fcf0 70 2d 3e 6e 53 72 63 3d 3d 30 29 20 29 7b 0a 20  p->nSrc==0) ){. 
1fd00 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66     goto append_f
1fd10 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  rom_error;.  }. 
1fd20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70   pItem = &p->a[p
1fd30 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73 73  ->nSrc-1];.  ass
1fd40 65 72 74 28 20 70 41 6c 69 61 73 21 3d 30 20 29  ert( pAlias!=0 )
1fd50 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73 2d 3e  ;.  if( pAlias->
1fd60 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  n ){.    pItem->
1fd70 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  zAlias = sqlite3
1fd80 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1fd90 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20  , pAlias);.  }. 
1fda0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
1fdb0 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20 70  = pSubquery;.  p
1fdc0 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b  Item->pOn = pOn;
1fdd0 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  .  pItem->pUsing
1fde0 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65 74   = pUsing;.  ret
1fdf0 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e 64 5f  urn p;.. append_
1fe00 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 61 73  from_error:.  as
1fe10 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20  sert( p==0 );.  
1fe20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1fe30 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 73 71  e(db, pOn);.  sq
1fe40 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
1fe50 65 28 64 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20  e(db, pUsing);. 
1fe60 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1fe70 6c 65 74 65 28 64 62 2c 20 70 53 75 62 71 75 65  lete(db, pSubque
1fe80 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ry);.  return 0;
1fe90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1fea0 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20 4e   INDEXED BY or N
1feb0 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
1fec0 65 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65  e to the most re
1fed0 63 65 6e 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a  cently added .**
1fee0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
1fef0 73 6f 75 72 63 65 2d 6c 69 73 74 20 70 61 73 73  source-list pass
1ff00 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1ff10 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f   argument..*/.vo
1ff20 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1ff30 74 49 6e 64 65 78 65 64 42 79 28 50 61 72 73 65  tIndexedBy(Parse
1ff40 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
1ff50 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e  t *p, Token *pIn
1ff60 64 65 78 65 64 42 79 29 7b 0a 20 20 61 73 73 65  dexedBy){.  asse
1ff70 72 74 28 20 70 49 6e 64 65 78 65 64 42 79 21 3d  rt( pIndexedBy!=
1ff80 30 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  0 );.  if( p && 
1ff90 41 4c 57 41 59 53 28 70 2d 3e 6e 53 72 63 3e 30  ALWAYS(p->nSrc>0
1ffa0 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ) ){.    struct 
1ffb0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1ffc0 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
1ffd0 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  Src-1];.    asse
1ffe0 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f  rt( pItem->fg.no
1fff0 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20  tIndexed==0 );. 
20000 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
20010 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
20020 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
20030 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54  t( pItem->fg.isT
20040 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  abFunc==0 );.   
20050 20 69 66 28 20 70 49 6e 64 65 78 65 64 42 79 2d   if( pIndexedBy-
20060 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64 65 78  >n==1 && !pIndex
20070 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20  edBy->z ){.     
20080 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45 58   /* A "NOT INDEX
20090 45 44 22 20 63 6c 61 75 73 65 20 77 61 73 20 73  ED" clause was s
200a0 75 70 70 6c 69 65 64 2e 20 53 65 65 20 70 61 72  upplied. See par
200b0 73 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20 63  se.y .      ** c
200c0 6f 6e 73 74 72 75 63 74 20 22 69 6e 64 65 78 65  onstruct "indexe
200d0 64 5f 6f 70 74 22 20 66 6f 72 20 64 65 74 61 69  d_opt" for detai
200e0 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 74  ls. */.      pIt
200f0 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  em->fg.notIndexe
20100 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 1;.    }else
20110 7b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75  {.      pItem->u
20120 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 73  1.zIndexedBy = s
20130 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
20140 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
20150 70 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20  pIndexedBy);.   
20160 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49     pItem->fg.isI
20170 6e 64 65 78 65 64 42 79 20 3d 20 28 70 49 74 65  ndexedBy = (pIte
20180 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
20190 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  !=0);.    }.  }.
201a0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65  }../*.** Add the
201b0 20 6c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f   list of functio
201c0 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  n arguments to t
201d0 68 65 20 53 72 63 4c 69 73 74 20 65 6e 74 72 79  he SrcList entry
201e0 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 2d   for a.** table-
201f0 76 61 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e 2e  valued-function.
20200 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20210 53 72 63 4c 69 73 74 46 75 6e 63 41 72 67 73 28  SrcListFuncArgs(
20220 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
20230 72 63 4c 69 73 74 20 2a 70 2c 20 45 78 70 72 4c  rcList *p, ExprL
20240 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
20250 66 28 20 70 20 29 7b 0a 20 20 20 20 73 74 72 75  f( p ){.    stru
20260 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
20270 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70  *pItem = &p->a[p
20280 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61  ->nSrc-1];.    a
20290 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
202a0 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29  .notIndexed==0 )
202b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
202c0 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
202d0 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  dBy==0 );.    as
202e0 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e  sert( pItem->fg.
202f0 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a  isTabFunc==0 );.
20300 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46      pItem->u1.pF
20310 75 6e 63 41 72 67 20 3d 20 70 4c 69 73 74 3b 0a  uncArg = pList;.
20320 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73      pItem->fg.is
20330 54 61 62 46 75 6e 63 20 3d 20 31 3b 0a 20 20 7d  TabFunc = 1;.  }
20340 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
20350 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
20360 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73  pParse->db, pLis
20370 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
20380 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75   When building u
20390 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  p a FROM clause 
203a0 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20 74  in the parser, t
203b0 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
203c0 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  .** is initially
203d0 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
203e0 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20   left operand.  
203f0 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e  But the code gen
20400 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74  erator.** expect
20410 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  s the join opera
20420 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65  tor to be on the
20430 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20   right operand. 
20440 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
20450 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e   Shifts all join
20460 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20   operators from 
20470 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f  left to right fo
20480 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d  r an entire FROM
20490 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  .** clause..**.*
204a0 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f  * Example: Suppo
204b0 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c  se the join is l
204c0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
204d0 20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74 75            A natu
204e0 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42  ral cross join B
204f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61  .**.** The opera
20500 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20  tor is "natural 
20510 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68  cross join".  Th
20520 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e  e A and B operan
20530 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a  ds are stored.**
20540 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20   in p->a[0] and 
20550 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74  p->a[1], respect
20560 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73  ively.  The pars
20570 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f  er initially sto
20580 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61  res the.** opera
20590 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68 69  tor with A.  Thi
205a0 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73  s routine shifts
205b0 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f   that operator o
205c0 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69  ver to B..*/.voi
205d0 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
205e0 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72  ShiftJoinType(Sr
205f0 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28  cList *p){.  if(
20600 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
20610 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53  .    for(i=p->nS
20620 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  rc-1; i>0; i--){
20630 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 66  .      p->a[i].f
20640 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e  g.jointype = p->
20650 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79  a[i-1].fg.jointy
20660 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  pe;.    }.    p-
20670 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  >a[0].fg.jointyp
20680 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
20690 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
206a0 45 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45 47  E code for a BEG
206b0 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  IN statement..*/
206c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
206d0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  inTransaction(Pa
206e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
206f0 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65   type){.  sqlite
20700 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
20710 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73  ;.  int i;..  as
20720 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
20730 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  );.  db = pParse
20740 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
20750 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  db!=0 );.  if( s
20760 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
20770 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
20780 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47  RANSACTION, "BEG
20790 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  IN", 0, 0) ){.  
207a0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
207b0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
207c0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
207d0 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !v ) return;. 
207e0 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45   if( type!=TK_DE
207f0 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f  FERRED ){.    fo
20800 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
20810 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
20820 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
20830 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
20840 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f  n, i, (type==TK_
20850 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20  EXCLUSIVE)+1);. 
20860 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20870 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 29 3b  UsesBtree(v, i);
20880 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
20890 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
208a0 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 29  , OP_AutoCommit)
208b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
208c0 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f  ate VDBE code fo
208d0 72 20 61 20 43 4f 4d 4d 49 54 20 73 74 61 74 65  r a COMMIT state
208e0 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
208f0 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73  lite3CommitTrans
20900 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
20910 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
20920 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
20930 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
20940 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d  rt( pParse->db!=
20950 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
20960 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
20970 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
20980 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22  ACTION, "COMMIT"
20990 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  , 0, 0) ){.    r
209a0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d  eturn;.  }.  v =
209b0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
209c0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
209d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
209e0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
209f0 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 29 3b 0a  AutoCommit, 1);.
20a00 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
20a10 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
20a20 66 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 73  for a ROLLBACK s
20a30 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
20a40 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63  d sqlite3Rollbac
20a50 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  kTransaction(Par
20a60 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
20a70 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72  dbe *v;..  asser
20a80 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
20a90 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
20aa0 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ->db!=0 );.  if(
20ab0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
20ac0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
20ad0 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52  _TRANSACTION, "R
20ae0 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20  OLLBACK", 0, 0) 
20af0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
20b00 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
20b10 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
20b20 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
20b30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20b40 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
20b50 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d  it, 1, 1);.  }.}
20b60 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20b70 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
20b80 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
20b90 65 6e 20 69 74 20 70 61 72 73 65 73 20 61 20 63  en it parses a c
20ba0 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61 74 65  ommand to create
20bb0 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72 20  ,.** release or 
20bc0 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c 20  rollback an SQL 
20bd0 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76  savepoint. .*/.v
20be0 6f 69 64 20 73 71 6c 69 74 65 33 53 61 76 65 70  oid sqlite3Savep
20bf0 6f 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61 72  oint(Parse *pPar
20c00 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b 65  se, int op, Toke
20c10 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61  n *pName){.  cha
20c20 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
20c30 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
20c40 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
20c50 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  e);.  if( zName 
20c60 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
20c70 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
20c80 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66  pParse);.#ifndef
20c90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
20ca0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 73  HORIZATION.    s
20cb0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
20cc0 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20   * const az[] = 
20cd0 7b 20 22 42 45 47 49 4e 22 2c 20 22 52 45 4c 45  { "BEGIN", "RELE
20ce0 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  ASE", "ROLLBACK"
20cf0 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   };.    assert( 
20d00 21 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e  !SAVEPOINT_BEGIN
20d10 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   && SAVEPOINT_RE
20d20 4c 45 41 53 45 3d 3d 31 20 26 26 20 53 41 56 45  LEASE==1 && SAVE
20d30 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d  POINT_ROLLBACK==
20d40 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  2 );.#endif.    
20d50 69 66 28 20 21 76 20 7c 7c 20 73 71 6c 69 74 65  if( !v || sqlite
20d60 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
20d70 65 2c 20 53 51 4c 49 54 45 5f 53 41 56 45 50 4f  e, SQLITE_SAVEPO
20d80 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61  INT, az[op], zNa
20d90 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  me, 0) ){.      
20da0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
20db0 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29  arse->db, zName)
20dc0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
20dd0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
20de0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
20df0 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70 2c  P_Savepoint, op,
20e00 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50 34   0, 0, zName, P4
20e10 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
20e20 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
20e30 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62  e the TEMP datab
20e40 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ase is open and 
20e50 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
20e60 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  e.  Return.** th
20e70 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
20e80 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20 65  rs.  Leave any e
20e90 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
20ea0 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
20eb0 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cture..*/.int sq
20ec0 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74  lite3OpenTempDat
20ed0 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50 61  abase(Parse *pPa
20ee0 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  rse){.  sqlite3 
20ef0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
20f00 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  ;.  if( db->aDb[
20f10 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50  1].pBt==0 && !pP
20f20 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
20f30 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
20f40 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 20   Btree *pBt;.   
20f50 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e   static const in
20f60 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20 20  t flags = .     
20f70 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
20f80 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20 20  _READWRITE |.   
20f90 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
20fa0 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
20fb0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
20fc0 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20  N_EXCLUSIVE |.  
20fd0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
20fe0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
20ff0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
21000 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
21010 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  B;..    rc = sql
21020 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62  ite3BtreeOpen(db
21030 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20 26  ->pVfs, 0, db, &
21040 70 42 74 2c 20 30 2c 20 66 6c 61 67 73 29 3b 0a  pBt, 0, flags);.
21050 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
21060 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
21070 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
21080 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
21090 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
210a0 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20  ry database ".  
210b0 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20        "file for 
210c0 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72  storing temporar
210d0 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20  y tables");.    
210e0 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72    pParse->rc = r
210f0 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  c;.      return 
21100 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  1;.    }.    db-
21110 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70 42  >aDb[1].pBt = pB
21120 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  t;.    assert( d
21130 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
21140 61 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  a );.    if( SQL
21150 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74  ITE_NOMEM==sqlit
21160 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
21170 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78 74  ze(pBt, db->next
21180 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30 29  Pagesize, -1, 0)
21190 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
211a0 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
211b0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
211c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
211d0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
211e0 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
211f0 61 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  at the schema co
21200 6f 6b 69 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  okie will need t
21210 6f 20 62 65 20 76 65 72 69 66 69 65 64 0a 2a 2a  o be verified.**
21220 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 69 44   for database iD
21230 62 2e 20 20 54 68 65 20 63 6f 64 65 20 74 6f 20  b.  The code to 
21240 61 63 74 75 61 6c 6c 79 20 76 65 72 69 66 79 20  actually verify 
21250 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
21260 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63 63 75 72 20  e.** will occur 
21270 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
21280 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56 44 42 45  e top-level VDBE
21290 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 67 65 6e   and will be gen
212a0 65 72 61 74 65 64 0a 2a 2a 20 6c 61 74 65 72 2c  erated.** later,
212b0 20 62 79 20 73 71 6c 69 74 65 33 46 69 6e 69 73   by sqlite3Finis
212c0 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f  hCoding()..*/.vo
212d0 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  id sqlite3CodeVe
212e0 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65  rifySchema(Parse
212f0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44   *pParse, int iD
21300 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  b){.  Parse *pTo
21310 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
21320 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
21330 61 72 73 65 29 3b 0a 0a 20 20 61 73 73 65 72 74  arse);..  assert
21340 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
21350 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20  pParse->db->nDb 
21360 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
21370 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
21380 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d  ].pBt!=0 || iDb=
21390 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
213a0 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41  iDb<SQLITE_MAX_A
213b0 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 61  TTACHED+2 );.  a
213c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
213d0 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 70 50  hemaMutexHeld(pP
213e0 61 72 73 65 2d 3e 64 62 2c 20 69 44 62 2c 20 30  arse->db, iDb, 0
213f0 29 20 29 3b 0a 20 20 69 66 28 20 44 62 4d 61 73  ) );.  if( DbMas
21400 6b 54 65 73 74 28 70 54 6f 70 6c 65 76 65 6c 2d  kTest(pToplevel-
21410 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62  >cookieMask, iDb
21420 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44 62 4d 61  )==0 ){.    DbMa
21430 73 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d  skSet(pToplevel-
21440 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62  >cookieMask, iDb
21450 29 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  );.    if( !OMIT
21460 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
21470 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
21480 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
21490 73 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20  se(pToplevel);. 
214a0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
214b0 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 44  * If argument zD
214c0 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  b is NULL, then 
214d0 63 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64 65  call sqlite3Code
214e0 56 65 72 69 66 79 53 63 68 65 6d 61 28 29 20 66  VerifySchema() f
214f0 6f 72 20 65 61 63 68 20 0a 2a 2a 20 61 74 74 61  or each .** atta
21500 63 68 65 64 20 64 61 74 61 62 61 73 65 2e 20 4f  ched database. O
21510 74 68 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b 65  therwise, invoke
21520 20 69 74 20 66 6f 72 20 74 68 65 20 64 61 74 61   it for the data
21530 62 61 73 65 20 6e 61 6d 65 64 20 7a 44 62 20 6f  base named zDb o
21540 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nly..*/.void sql
21550 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61  ite3CodeVerifyNa
21560 6d 65 64 53 63 68 65 6d 61 28 50 61 72 73 65 20  medSchema(Parse 
21570 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
21580 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71 6c  har *zDb){.  sql
21590 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
215a0 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  e->db;.  int i;.
215b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
215c0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
215d0 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
215e0 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
215f0 44 62 2d 3e 70 42 74 20 26 26 20 28 21 7a 44 62  Db->pBt && (!zDb
21600 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   || 0==sqlite3St
21610 72 49 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d 3e  rICmp(zDb, pDb->
21620 7a 44 62 53 4e 61 6d 65 29 29 20 29 7b 0a 20 20  zDbSName)) ){.  
21630 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
21640 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
21650 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  se, i);.    }.  
21660 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
21670 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68  ate VDBE code th
21680 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20  at prepares for 
21690 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69  doing an operati
216a0 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74  on that.** might
216b0 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61   change the data
216c0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  base..**.** This
216d0 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20   routine starts 
216e0 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
216f0 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  n if we are not 
21700 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a  already within.*
21710 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  * a transaction.
21720 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65    If we are alre
21730 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61  ady within a tra
21740 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61  nsaction, then a
21750 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69   checkpoint.** i
21760 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74  s set if the set
21770 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65  Statement parame
21780 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20  ter is true.  A 
21790 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
217a0 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20  d.** be set for 
217b0 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20  operations that 
217c0 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20  might fail (due 
217d0 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29  to a constraint)
217e0 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20   part of.** the 
217f0 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20  way through and 
21800 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20  which will need 
21810 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69  to undo some wri
21820 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69  tes without havi
21830 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63  ng to.** rollbac
21840 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e  k the whole tran
21850 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70  saction.  For op
21860 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61  erations where a
21870 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a  ll constraints.*
21880 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64  * can be checked
21890 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e   before any chan
218a0 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
218b0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74  the database, it
218c0 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63   is never.** nec
218d0 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61  essary to undo a
218e0 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63   write and the c
218f0 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
21900 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a   not be set..*/.
21910 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
21920 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
21930 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
21940 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c  nt setStatement,
21950 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72   int iDb){.  Par
21960 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
21970 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
21980 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
21990 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
219a0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
219b0 69 44 62 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65  iDb);.  DbMaskSe
219c0 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69  t(pToplevel->wri
219d0 74 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20  teMask, iDb);.  
219e0 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c  pToplevel->isMul
219f0 74 69 57 72 69 74 65 20 7c 3d 20 73 65 74 53 74  tiWrite |= setSt
21a00 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  atement;.}../*.*
21a10 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
21a20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 75  the statement cu
21a30 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
21a40 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69 67 68 74  nstruction might
21a50 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74   write.** more t
21a60 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28 65  han one entry (e
21a70 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67  xample: deleting
21a80 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20 69 6e   one row then in
21a90 73 65 72 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c  serting another,
21aa0 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d 75  .** inserting mu
21ab0 6c 74 69 70 6c 65 20 72 6f 77 73 20 69 6e 20 61  ltiple rows in a
21ac0 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72   table, or inser
21ad0 74 69 6e 67 20 61 20 72 6f 77 20 61 6e 64 20 69  ting a row and i
21ae0 6e 64 65 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a  ndex entries.).*
21af0 2a 20 49 66 20 61 6e 20 61 62 6f 72 74 20 6f 63  * If an abort oc
21b00 63 75 72 73 20 61 66 74 65 72 20 73 6f 6d 65 20  curs after some 
21b10 6f 66 20 74 68 65 73 65 20 77 72 69 74 65 73 20  of these writes 
21b20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20  have completed, 
21b30 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20  then it will.** 
21b40 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
21b50 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74  undo the complet
21b60 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f  ed writes..*/.vo
21b70 69 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57  id sqlite3MultiW
21b80 72 69 74 65 28 50 61 72 73 65 20 2a 70 50 61 72  rite(Parse *pPar
21b90 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  se){.  Parse *pT
21ba0 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
21bb0 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
21bc0 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65  Parse);.  pTople
21bd0 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  vel->isMultiWrit
21be0 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  e = 1;.}../* .**
21bf0 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
21c00 74 6f 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  tor calls this r
21c10 6f 75 74 69 6e 65 20 69 66 20 69 73 20 64 69 73  outine if is dis
21c20 63 6f 76 65 72 73 20 74 68 61 74 20 69 74 20 69  covers that it i
21c30 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f  s.** possible to
21c40 20 61 62 6f 72 74 20 61 20 73 74 61 74 65 6d 65   abort a stateme
21c50 6e 74 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70  nt prior to comp
21c60 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65  letion.  In orde
21c70 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d  r to .** perform
21c80 20 74 68 69 73 20 61 62 6f 72 74 20 77 69 74 68   this abort with
21c90 6f 75 74 20 63 6f 72 72 75 70 74 69 6e 67 20 74  out corrupting t
21ca0 68 65 20 64 61 74 61 62 61 73 65 2c 20 77 65 20  he database, we 
21cb0 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  need to make.** 
21cc0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73 74  sure that the st
21cd0 61 74 65 6d 65 6e 74 20 69 73 20 70 72 6f 74 65  atement is prote
21ce0 63 74 65 64 20 62 79 20 61 20 73 74 61 74 65 6d  cted by a statem
21cf0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
21d00 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c  .**.** Technical
21d10 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64  ly, we only need
21d20 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 79 41   to set the mayA
21d30 62 6f 72 74 20 66 6c 61 67 20 69 66 20 74 68 65  bort flag if the
21d40 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69 74 65  .** isMultiWrite
21d50 20 66 6c 61 67 20 77 61 73 20 70 72 65 76 69 6f   flag was previo
21d60 75 73 6c 79 20 73 65 74 2e 20 20 54 68 65 72 65  usly set.  There
21d70 20 69 73 20 61 20 74 69 6d 65 20 64 65 70 65 6e   is a time depen
21d80 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74 68  dency.** such th
21d90 61 74 20 74 68 65 20 61 62 6f 72 74 20 6d 75 73  at the abort mus
21da0 74 20 6f 63 63 75 72 20 61 66 74 65 72 20 74 68  t occur after th
21db0 65 20 6d 75 6c 74 69 77 72 69 74 65 2e 20 20 54  e multiwrite.  T
21dc0 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d  his makes.** som
21dd0 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 76  e statements inv
21de0 6f 6c 76 69 6e 67 20 74 68 65 20 52 45 50 4c 41  olving the REPLA
21df0 43 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  CE conflict reso
21e00 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
21e10 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65 20  .** go a little 
21e20 66 61 73 74 65 72 2e 20 20 42 75 74 20 74 61 6b  faster.  But tak
21e30 69 6e 67 20 61 64 76 61 6e 74 61 67 65 20 6f 66  ing advantage of
21e40 20 74 68 69 73 20 74 69 6d 65 20 64 65 70 65 6e   this time depen
21e50 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69  dency.** makes i
21e60 74 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74  t more difficult
21e70 20 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20 74   to prove that t
21e80 68 65 20 63 6f 64 65 20 69 73 20 63 6f 72 72 65  he code is corre
21e90 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69  ct (in .** parti
21ea0 63 75 6c 61 72 2c 20 69 74 20 70 72 65 76 65 6e  cular, it preven
21eb0 74 73 20 75 73 20 66 72 6f 6d 20 77 72 69 74 69  ts us from writi
21ec0 6e 67 20 61 6e 20 65 66 66 65 63 74 69 76 65 0a  ng an effective.
21ed0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
21ee0 6e 20 6f 66 20 73 71 6c 69 74 65 33 41 73 73 65  n of sqlite3Asse
21ef0 72 74 4d 61 79 41 62 6f 72 74 28 29 29 20 61 6e  rtMayAbort()) an
21f00 64 20 73 6f 20 77 65 20 68 61 76 65 20 63 68 6f  d so we have cho
21f10 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74  sen.** to take t
21f20 68 65 20 73 61 66 65 20 72 6f 75 74 65 20 61 6e  he safe route an
21f30 64 20 73 6b 69 70 20 74 68 65 20 6f 70 74 69 6d  d skip the optim
21f40 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ization..*/.void
21f50 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
21f60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
21f70 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
21f80 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
21f90 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
21fa0 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d  e);.  pToplevel-
21fb0 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d  >mayAbort = 1;.}
21fc0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
21fd0 4f 50 5f 48 61 6c 74 20 74 68 61 74 20 63 61 75  OP_Halt that cau
21fe0 73 65 73 20 74 68 65 20 76 64 62 65 20 74 6f 20  ses the vdbe to 
21ff0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45  return an SQLITE
22000 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65  _CONSTRAINT.** e
22010 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f  rror. The onErro
22020 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65  r parameter dete
22030 72 6d 69 6e 65 73 20 77 68 69 63 68 20 28 69 66  rmines which (if
22040 20 61 6e 79 29 20 6f 66 20 74 68 65 20 73 74 61   any) of the sta
22050 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72  tement.** and/or
22060 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
22070 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
22080 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ack..*/.void sql
22090 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
220a0 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
220b0 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
220c0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
220d0 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 20 20 20  int errCode,    
220e0 20 20 2f 2a 20 65 78 74 65 6e 64 65 64 20 65 72    /* extended er
220f0 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  ror code */.  in
22100 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
22110 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79  /* Constraint ty
22120 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34  pe */.  char *p4
22130 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72  ,         /* Err
22140 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20  or message */.  
22150 69 38 20 70 34 74 79 70 65 2c 20 20 20 20 20 20  i8 p4type,      
22160 20 20 2f 2a 20 50 34 5f 53 54 41 54 49 43 20 6f    /* P4_STATIC o
22170 72 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a  r P4_TRANSIENT *
22180 2f 0a 20 20 75 38 20 70 35 45 72 72 6d 73 67 20  /.  u8 p5Errmsg 
22190 20 20 20 20 20 20 2f 2a 20 50 35 5f 45 72 72 4d        /* P5_ErrM
221a0 73 67 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20  sg type */.){.  
221b0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
221c0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
221d0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65 72 72  ;.  assert( (err
221e0 43 6f 64 65 26 30 78 66 66 29 3d 3d 53 51 4c 49  Code&0xff)==SQLI
221f0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b  TE_CONSTRAINT );
22200 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d  .  if( onError==
22210 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
22220 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
22230 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73  pParse);.  }.  s
22240 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
22250 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72 72  (v, OP_Halt, err
22260 43 6f 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 30  Code, onError, 0
22270 2c 20 70 34 2c 20 70 34 74 79 70 65 29 3b 0a 20  , p4, p4type);. 
22280 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
22290 67 65 50 35 28 76 2c 20 70 35 45 72 72 6d 73 67  geP5(v, p5Errmsg
222a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  );.}../*.** Code
222b0 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20   an OP_Halt due 
222c0 74 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49  to UNIQUE or PRI
222d0 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
222e0 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a  int violation..*
222f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
22300 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 0a  iqueConstraint(.
22310 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
22320 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
22330 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
22340 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a  onError,      /*
22350 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65   Constraint type
22360 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
22370 78 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  x       /* The i
22380 6e 64 65 78 20 74 68 61 74 20 74 72 69 67 67 65  ndex that trigge
22390 72 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  rs the constrain
223a0 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  t */.){.  char *
223b0 7a 45 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  zErr;.  int j;. 
223c0 20 53 74 72 41 63 63 75 6d 20 65 72 72 4d 73 67   StrAccum errMsg
223d0 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  ;.  Table *pTab 
223e0 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a  = pIdx->pTable;.
223f0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
22400 75 6d 49 6e 69 74 28 26 65 72 72 4d 73 67 2c 20  umInit(&errMsg, 
22410 70 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20 30  pParse->db, 0, 0
22420 2c 20 32 30 30 29 3b 0a 20 20 69 66 28 20 70 49  , 200);.  if( pI
22430 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 7b 0a  dx->aColExpr ){.
22440 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
22450 74 66 28 26 65 72 72 4d 73 67 2c 20 22 69 6e 64  tf(&errMsg, "ind
22460 65 78 20 27 25 71 27 22 2c 20 70 49 64 78 2d 3e  ex '%q'", pIdx->
22470 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  zName);.  }else{
22480 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
22490 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  pIdx->nKeyCol; j
224a0 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ++){.      char 
224b0 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 61 73 73  *zCol;.      ass
224c0 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ert( pIdx->aiCol
224d0 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20  umn[j]>=0 );.   
224e0 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     zCol = pTab->
224f0 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c  aCol[pIdx->aiCol
22500 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20  umn[j]].zName;. 
22510 20 20 20 20 20 69 66 28 20 6a 20 29 20 73 71 6c       if( j ) sql
22520 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
22530 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2c 20 22  nd(&errMsg, ", "
22540 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
22550 74 65 33 58 50 72 69 6e 74 66 28 26 65 72 72 4d  te3XPrintf(&errM
22560 73 67 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61  sg, "%s.%s", pTa
22570 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b  b->zName, zCol);
22580 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 45 72  .    }.  }.  zEr
22590 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63  r = sqlite3StrAc
225a0 63 75 6d 46 69 6e 69 73 68 28 26 65 72 72 4d 73  cumFinish(&errMs
225b0 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 6c  g);.  sqlite3Hal
225c0 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
225d0 73 65 2c 20 0a 20 20 20 20 49 73 50 72 69 6d 61  se, .    IsPrima
225e0 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
225f0 20 3f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   ? SQLITE_CONSTR
22600 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 20  AINT_PRIMARYKEY 
22610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22620 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 53               : S
22630 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
22640 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45  _UNIQUE,.    onE
22650 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44  rror, zErr, P4_D
22660 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74  YNAMIC, P5_Const
22670 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a  raintUnique);.}.
22680 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
22690 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 6e  OP_Halt due to n
226a0 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 2e  on-unique rowid.
226b0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
226c0 52 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28  RowidConstraint(
226d0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
226e0 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
226f0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
22700 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
22710 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
22720 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20  ution algorithm 
22730 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
22740 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
22750 62 6c 65 20 77 69 74 68 20 74 68 65 20 6e 6f 6e  ble with the non
22760 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 20 2a 2f  -unique rowid */
22770 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73   .){.  char *zMs
22780 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  g;.  int rc;.  i
22790 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d  f( pTab->iPKey>=
227a0 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20  0 ){.    zMsg = 
227b0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
227c0 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25  Parse->db, "%s.%
227d0 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  s", pTab->zName,
227e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
227f0 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
22800 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65  >aCol[pTab->iPKe
22810 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  y].zName);.    r
22820 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
22830 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59  RAINT_PRIMARYKEY
22840 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
22850 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
22860 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
22870 20 22 25 73 2e 72 6f 77 69 64 22 2c 20 70 54 61   "%s.rowid", pTa
22880 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  b->zName);.    r
22890 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
228a0 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d  RAINT_ROWID;.  }
228b0 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f  .  sqlite3HaltCo
228c0 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
228d0 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d   rc, onError, zM
228e0 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a  sg, P4_DYNAMIC,.
228f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22900 20 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73 74          P5_Const
22910 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a  raintUnique);.}.
22920 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
22930 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73  see if pIndex us
22940 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  es the collating
22950 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
22960 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
22970 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
22980 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73  false if it does
22990 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   not..*/.#ifndef
229a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
229b0 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20  NDEX.static int 
229c0 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63  collationMatch(c
229d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
229e0 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29  , Index *pIndex)
229f0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
22a00 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b  ert( zColl!=0 );
22a10 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
22a20 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  ndex->nColumn; i
22a30 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
22a40 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d  har *z = pIndex-
22a50 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
22a60 61 73 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20  assert( z!=0 || 
22a70 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
22a80 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66 28  [i]<0 );.    if(
22a90 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
22aa0 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71  n[i]>=0 && 0==sq
22ab0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
22ac0 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  zColl) ){.      
22ad0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
22ae0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
22af0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
22b00 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
22b10 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68  dices of pTab th
22b20 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61  at use the colla
22b30 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
22b40 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c  oll..** If pColl
22b50 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
22b60 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
22b70 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64  f pTab..*/.#ifnd
22b80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
22b90 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f  EINDEX.static vo
22ba0 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28  id reindexTable(
22bb0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
22bc0 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72  able *pTab, char
22bd0 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a   const *zColl){.
22be0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
22bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22c00 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
22c10 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
22c20 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d  /..  for(pIndex=
22c30 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
22c40 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e  ndex; pIndex=pIn
22c50 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  dex->pNext){.   
22c60 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c   if( zColl==0 ||
22c70 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
22c80 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29  zColl, pIndex) )
22c90 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20  {.      int iDb 
22ca0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
22cb0 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
22cc0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
22cd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22ce0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
22cf0 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
22d00 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
22d10 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
22d20 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
22d30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
22d40 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
22d50 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
22d60 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  es of all tables
22d70 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
22d80 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69  s where the.** i
22d90 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63  ndices use the c
22da0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
22db0 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f  e pColl.  If pCo
22dc0 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d  ll==0 then recom
22dd0 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69  pute.** all indi
22de0 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a  ces everywhere..
22df0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
22e00 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
22e10 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64  tatic void reind
22e20 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72 73  exDatabases(Pars
22e30 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20  e *pParse, char 
22e40 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20  const *zColl){. 
22e50 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
22e60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22e70 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  A single databas
22e80 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ea0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
22eb0 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
22ec0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
22ed0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
22ee0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
22ef0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
22f00 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20   HashElem *k;   
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22f20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
22f30 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a   tables in pDb *
22f40 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
22f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f60 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
22f70 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20  e database */.. 
22f80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
22f90 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
22fa0 65 78 65 73 28 64 62 29 20 29 3b 20 20 2f 2a 20  exes(db) );  /* 
22fb0 4e 65 65 64 65 64 20 66 6f 72 20 73 63 68 65 6d  Needed for schem
22fc0 61 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f  a access */.  fo
22fd0 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d  r(iDb=0, pDb=db-
22fe0 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  >aDb; iDb<db->nD
22ff0 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29  b; iDb++, pDb++)
23000 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44  {.    assert( pD
23010 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  b!=0 );.    for(
23020 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  k=sqliteHashFirs
23030 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t(&pDb->pSchema-
23040 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b  >tblHash);  k; k
23050 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
23060 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  k)){.      pTab 
23070 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65  = (Table*)sqlite
23080 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20  HashData(k);.   
23090 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
230a0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43  pParse, pTab, zC
230b0 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  oll);.    }.  }.
230c0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
230d0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
230e0 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f  r the REINDEX co
230f0 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  mmand..**.**    
23100 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20      REINDEX     
23110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23120 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20         -- 1.**  
23130 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c        REINDEX  <
23140 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20  collation>      
23150 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a           -- 2.**
23160 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
23170 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74   ?<database>.?<t
23180 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a  ablename>  -- 3.
23190 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
231a0 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
231b0 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20  <indexname>  -- 
231c0 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63  4.**.** Form 1 c
231d0 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65  auses all indice
231e0 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65  s in all attache
231f0 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62  d databases to b
23200 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f  e rebuilt..** Fo
23210 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c  rm 2 rebuilds al
23220 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
23230 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
23240 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a  use the named.**
23250 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
23260 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e  ion.  Forms 3 an
23270 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20  d 4 rebuild the 
23280 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61  named index or a
23290 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73  ll.** indices as
232a0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
232b0 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a  e named table..*
232c0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
232d0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f  _OMIT_REINDEX.vo
232e0 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65  id sqlite3Reinde
232f0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
23300 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
23310 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a  Token *pName2){.
23320 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
23330 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
23340 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
23350 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65  nce to be reinde
23360 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  xed, or NULL */.
23370 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
23380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23390 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65   Name of a table
233a0 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63   or index */.  c
233b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20  onst char *zDb; 
233c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
233d0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
233e0 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  se */.  Table *p
233f0 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
23400 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
23410 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
23420 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
23430 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
23440 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f  /* An index asso
23450 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62  ciated with pTab
23460 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
23470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23480 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
23490 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
234a0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
234b0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
234c0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
234d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
234e0 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b  Token *pObjName;
234f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
23500 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
23510 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20   or index to be 
23520 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20  reindexed */..  
23530 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
23540 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
23550 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
23560 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
23570 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
23580 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
23590 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
235a0 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
235b0 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
235c0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
235d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
235e0 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d  }..  if( pName1=
235f0 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  =0 ){.    reinde
23600 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
23610 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  e, 0);.    retur
23620 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e  n;.  }else if( N
23630 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20  EVER(pName2==0) 
23640 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20  || pName2->z==0 
23650 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  ){.    char *zCo
23660 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ll;.    assert( 
23670 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20  pName1->z );.   
23680 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
23690 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
236a0 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31  arse->db, pName1
236b0 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c  );.    if( !zCol
236c0 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  l ) return;.    
236d0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
236e0 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
236f0 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30  NC(db), zColl, 0
23700 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
23710 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65   ){.      reinde
23720 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
23730 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  e, zColl);.     
23740 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
23750 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  b, zColl);.     
23760 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
23770 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
23780 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, zColl);.  }
23790 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
237a0 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
237b0 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
237c0 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a  e2, &pObjName);.
237d0 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
237e0 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  turn;.  z = sqli
237f0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
23800 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a  (db, pObjName);.
23810 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
23820 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d  urn;.  zDb = db-
23830 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
23840 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  me;.  pTab = sql
23850 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
23860 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28  , z, zDb);.  if(
23870 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69   pTab ){.    rei
23880 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
23890 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , pTab, 0);.    
238a0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
238b0 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , z);.    return
238c0 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
238d0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
238e0 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  x(db, z, zDb);. 
238f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
23900 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e  b, z);.  if( pIn
23910 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dex ){.    sqlit
23920 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
23930 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
23940 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
23950 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
23960 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
23970 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
23980 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f   }.  sqlite3Erro
23990 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
239a0 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79  able to identify
239b0 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62   the object to b
239c0 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d  e reindexed");.}
239d0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
239e0 65 74 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20  eturn a KeyInfo 
239f0 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69  structure that i
23a00 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
23a10 72 20 74 68 65 20 67 69 76 65 6e 20 49 6e 64 65  r the given Inde
23a20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  x..**.** The cal
23a30 6c 65 72 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b  ler should invok
23a40 65 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  e sqlite3KeyInfo
23a50 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 72  Unref() on the r
23a60 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 0a 2a  eturned object.*
23a70 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 66 69  * when it has fi
23a80 6e 69 73 68 65 64 20 75 73 69 6e 67 20 69 74 2e  nished using it.
23a90 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c  .*/.KeyInfo *sql
23aa0 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
23ab0 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
23ac0 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
23ad0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
23ae0 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c  Col = pIdx->nCol
23af0 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20  umn;.  int nKey 
23b00 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  = pIdx->nKeyCol;
23b10 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
23b20 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
23b30 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b  nErr ) return 0;
23b40 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 75 6e 69  .  if( pIdx->uni
23b50 71 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  qNotNull ){.    
23b60 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65  pKey = sqlite3Ke
23b70 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73  yInfoAlloc(pPars
23b80 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f  e->db, nKey, nCo
23b90 6c 2d 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65  l-nKey);.  }else
23ba0 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  {.    pKey = sql
23bb0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
23bc0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 43 6f  (pParse->db, nCo
23bd0 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  l, 0);.  }.  if(
23be0 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73   pKey ){.    ass
23bf0 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
23c00 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
23c10 4b 65 79 29 20 29 3b 0a 20 20 20 20 66 6f 72 28  Key) );.    for(
23c20 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
23c30 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
23c40 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64  har *zColl = pId
23c50 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  x->azColl[i];.  
23c60 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b      pKey->aColl[
23c70 69 5d 20 3d 20 7a 43 6f 6c 6c 3d 3d 73 71 6c 69  i] = zColl==sqli
23c80 74 65 33 53 74 72 42 49 4e 41 52 59 20 3f 20 30  te3StrBINARY ? 0
23c90 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   :.             
23ca0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
23cb0 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
23cc0 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a  pParse, zColl);.
23cd0 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72        pKey->aSor
23ce0 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64 78  tOrder[i] = pIdx
23cf0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b  ->aSortOrder[i];
23d00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
23d10 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
23d20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49       sqlite3KeyI
23d30 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 29 3b 0a  nfoUnref(pKey);.
23d40 20 20 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a        pKey = 0;.
23d50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
23d60 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a 23 69 66 6e  rn pKey;.}..#ifn
23d70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23d80 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  CTE./* .** This 
23d90 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
23da0 65 64 20 6f 6e 63 65 20 70 65 72 20 43 54 45 20  ed once per CTE 
23db0 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
23dc0 69 6c 65 20 70 61 72 73 69 6e 67 20 61 20 0a 2a  ile parsing a .*
23dd0 2a 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 0a  * WITH clause. .
23de0 2a 2f 0a 57 69 74 68 20 2a 73 71 6c 69 74 65 33  */.With *sqlite3
23df0 57 69 74 68 41 64 64 28 0a 20 20 50 61 72 73 65  WithAdd(.  Parse
23e00 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
23e10 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
23e20 6e 74 65 78 74 20 2a 2f 0a 20 20 57 69 74 68 20  ntext */.  With 
23e30 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20  *pWith,         
23e40 20 20 20 2f 2a 20 45 78 69 73 74 69 6e 67 20 57     /* Existing W
23e50 49 54 48 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e  ITH clause, or N
23e60 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
23e70 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  pName,          
23e80 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
23e90 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20 2a 2f 0a  common-table */.
23ea0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 72 67    ExprList *pArg
23eb0 6c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4f 70 74  list,     /* Opt
23ec0 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ional column nam
23ed0 65 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 74  e list for the t
23ee0 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  able */.  Select
23ef0 20 2a 70 51 75 65 72 79 20 20 20 20 20 20 20 20   *pQuery        
23f00 20 20 2f 2a 20 51 75 65 72 79 20 75 73 65 64 20    /* Query used 
23f10 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  to initialize th
23f20 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  e table */.){.  
23f30 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
23f40 61 72 73 65 2d 3e 64 62 3b 0a 20 20 57 69 74 68  arse->db;.  With
23f50 20 2a 70 4e 65 77 3b 0a 20 20 63 68 61 72 20 2a   *pNew;.  char *
23f60 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 43 68 65  zName;..  /* Che
23f70 63 6b 20 74 68 61 74 20 74 68 65 20 43 54 45 20  ck that the CTE 
23f80 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 20 77  name is unique w
23f90 69 74 68 69 6e 20 74 68 69 73 20 57 49 54 48 20  ithin this WITH 
23fa0 63 6c 61 75 73 65 2e 20 49 66 0a 20 20 2a 2a 20  clause. If.  ** 
23fb0 6e 6f 74 2c 20 73 74 6f 72 65 20 61 6e 20 65 72  not, store an er
23fc0 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73 65  ror in the Parse
23fd0 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20   structure. */. 
23fe0 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
23ff0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
24000 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29  arse->db, pName)
24010 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26  ;.  if( zName &&
24020 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e   pWith ){.    in
24030 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
24040 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b  ; i<pWith->nCte;
24050 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
24060 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
24070 7a 4e 61 6d 65 2c 20 70 57 69 74 68 2d 3e 61 5b  zName, pWith->a[
24080 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
24090 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
240a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
240b0 22 64 75 70 6c 69 63 61 74 65 20 57 49 54 48 20  "duplicate WITH 
240c0 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25 73 22 2c  table name: %s",
240d0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
240e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
240f0 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69  ( pWith ){.    i
24100 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  nt nByte = sizeo
24110 66 28 2a 70 57 69 74 68 29 20 2b 20 28 73 69 7a  f(*pWith) + (siz
24120 65 6f 66 28 70 57 69 74 68 2d 3e 61 5b 31 5d 29  eof(pWith->a[1])
24130 20 2a 20 70 57 69 74 68 2d 3e 6e 43 74 65 29 3b   * pWith->nCte);
24140 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
24150 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
24160 20 70 57 69 74 68 2c 20 6e 42 79 74 65 29 3b 0a   pWith, nByte);.
24170 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
24180 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
24190 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
241a0 6f 66 28 2a 70 57 69 74 68 29 29 3b 0a 20 20 7d  of(*pWith));.  }
241b0 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77  .  assert( (pNew
241c0 21 3d 30 20 26 26 20 7a 4e 61 6d 65 21 3d 30 29  !=0 && zName!=0)
241d0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
241e0 69 6c 65 64 20 29 3b 0a 0a 20 20 69 66 28 20 64  iled );..  if( d
241f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
24200 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
24210 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
24220 20 70 41 72 67 6c 69 73 74 29 3b 0a 20 20 20 20   pArglist);.    
24230 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
24240 65 74 65 28 64 62 2c 20 70 51 75 65 72 79 29 3b  ete(db, pQuery);
24250 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
24260 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
24270 20 20 20 70 4e 65 77 20 3d 20 70 57 69 74 68 3b     pNew = pWith;
24280 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
24290 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65  ew->a[pNew->nCte
242a0 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 51 75 65  ].pSelect = pQue
242b0 72 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  ry;.    pNew->a[
242c0 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 43 6f 6c  pNew->nCte].pCol
242d0 73 20 3d 20 70 41 72 67 6c 69 73 74 3b 0a 20 20  s = pArglist;.  
242e0 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
242f0 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e  nCte].zName = zN
24300 61 6d 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ame;.    pNew->a
24310 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 43 74  [pNew->nCte].zCt
24320 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e  eErr = 0;.    pN
24330 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a 20 20 7d 0a  ew->nCte++;.  }.
24340 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
24350 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
24360 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
24370 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20 70 61  e With object pa
24380 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
24390 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
243a0 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74 68  void sqlite3With
243b0 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
243c0 64 62 2c 20 57 69 74 68 20 2a 70 57 69 74 68 29  db, With *pWith)
243d0 7b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b  {.  if( pWith ){
243e0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
243f0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68  for(i=0; i<pWith
24400 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCte; i++){.  
24410 20 20 20 20 73 74 72 75 63 74 20 43 74 65 20 2a      struct Cte *
24420 70 43 74 65 20 3d 20 26 70 57 69 74 68 2d 3e 61  pCte = &pWith->a
24430 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [i];.      sqlit
24440 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
24450 28 64 62 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73  (db, pCte->pCols
24460 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24470 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
24480 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 29 3b   pCte->pSelect);
24490 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
244a0 46 72 65 65 28 64 62 2c 20 70 43 74 65 2d 3e 7a  Free(db, pCte->z
244b0 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
244c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
244d0 62 2c 20 70 57 69 74 68 29 3b 0a 20 20 7d 0a 7d  b, pWith);.  }.}
244e0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
244f0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
24500 43 54 45 29 20 2a 2f 0a                          CTE) */.