/ Hex Artifact Content
Login

Artifact 4584d3b8bf05dc3c6b58a3869d66707adf1a2d0c0dd278cbdf6698a3bfc95cc6:


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 23 69 66 64 65 66 20 53 51  =0 );..#ifdef SQ
07f0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
0800: 52 45 4e 54 0a 20 20 69 66 28 20 69 44 62 3d 3d  RENT.  if( iDb==
0810: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  1 ) return;.  if
0820: 28 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53  ( !sqlite3BtreeS
0830: 68 61 72 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  harable(pParse->
0840: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
0850: 29 20 29 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64  ) ) return;.#end
0860: 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  if.  for(i=0; i<
0870: 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c  pToplevel->nTabl
0880: 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  eLock; i++){.   
0890: 20 70 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d   p = &pToplevel-
08a0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
08b0: 20 20 20 20 69 66 28 20 70 2d 3e 69 44 62 3d 3d      if( p->iDb==
08c0: 69 44 62 20 26 26 20 70 2d 3e 69 54 61 62 3d 3d  iDb && p->iTab==
08d0: 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 2d  iTab ){.      p-
08e0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28  >isWriteLock = (
08f0: 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c  p->isWriteLock |
0900: 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a  | isWriteLock);.
0910: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
0920: 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65    }.  }..  nByte
0930: 73 20 3d 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  s = sizeof(Table
0940: 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70 6c 65 76  Lock) * (pToplev
0950: 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31  el->nTableLock+1
0960: 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
0970: 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a 20 20 20  aTableLock =.   
0980: 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c     sqlite3DbReal
0990: 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f 70 6c 65  locOrFree(pTople
09a0: 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70 6c 65 76  vel->db, pToplev
09b0: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 2c 20  el->aTableLock, 
09c0: 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20 70  nBytes);.  if( p
09d0: 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65  Toplevel->aTable
09e0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 20 3d 20  Lock ){.    p = 
09f0: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0a00: 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65 76 65 6c  leLock[pToplevel
0a10: 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b  ->nTableLock++];
0a20: 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d 20 69 44  .    p->iDb = iD
0a30: 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62 20 3d  b;.    p->iTab =
0a40: 20 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 73   iTab;.    p->is
0a50: 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69 73 57 72  WriteLock = isWr
0a60: 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 2d 3e  iteLock;.    p->
0a70: 7a 4c 6f 63 6b 4e 61 6d 65 20 3d 20 7a 4e 61 6d  zLockName = zNam
0a80: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
0a90: 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c  pToplevel->nTabl
0aa0: 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 73  eLock = 0;.    s
0ab0: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70  qlite3OomFault(p
0ac0: 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 29 3b 0a 20  Toplevel->db);. 
0ad0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0ae0: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0af0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b00: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b10: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b20: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0b30: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0b40: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0b50: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0b60: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0b70: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0b80: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0b90: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0ba0: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0bb0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0bc0: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0bd0: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0be0: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0bf0: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c00: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c10: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c20: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0c30: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0c40: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0c50: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0c60: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0c70: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0c80: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0c90: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0ca0: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0cb0: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cd0: 20 20 20 70 2d 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c     p->zLockName,
0ce0: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d   P4_STATIC);.  }
0cf0: 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69  .}.#else.  #defi
0d00: 6e 65 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ne codeTableLock
0d10: 73 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  s(x).#endif../*.
0d20: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
0d30: 66 20 74 68 65 20 67 69 76 65 6e 20 79 44 62 4d  f the given yDbM
0d40: 61 73 6b 20 6f 62 6a 65 63 74 20 69 73 20 65 6d  ask object is em
0d50: 70 74 79 20 2d 20 69 66 20 69 74 20 63 6f 6e 74  pty - if it cont
0d60: 61 69 6e 73 20 6e 6f 0a 2a 2a 20 31 20 62 69 74  ains no.** 1 bit
0d70: 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
0d80: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
0d90: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 29 20  DbMaskAllZero() 
0da0: 61 6e 64 20 44 62 4d 61 73 6b 4e 6f 74 5a 65 72  and DbMaskNotZer
0db0: 6f 28 29 0a 2a 2a 20 6d 61 63 72 6f 73 20 77 68  o().** macros wh
0dc0: 65 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  en SQLITE_MAX_AT
0dd0: 54 41 43 48 45 44 20 69 73 20 67 72 65 61 74 65  TACHED is greate
0de0: 72 20 74 68 61 6e 20 33 30 2e 0a 2a 2f 0a 23 69  r than 30..*/.#i
0df0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  f SQLITE_MAX_ATT
0e00: 41 43 48 45 44 3e 33 30 0a 69 6e 74 20 73 71 6c  ACHED>30.int sql
0e10: 69 74 65 33 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  ite3DbMaskAllZer
0e20: 6f 28 79 44 62 4d 61 73 6b 20 6d 29 7b 0a 20 20  o(yDbMask m){.  
0e30: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
0e40: 3b 20 69 3c 73 69 7a 65 6f 66 28 79 44 62 4d 61  ; i<sizeof(yDbMa
0e50: 73 6b 29 3b 20 69 2b 2b 29 20 69 66 28 20 6d 5b  sk); i++) if( m[
0e60: 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  i] ) return 0;. 
0e70: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
0e80: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
0e90: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
0ea0: 64 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65  d after a single
0eb0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68   SQL statement h
0ec0: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65  as been.** parse
0ed0: 64 20 61 6e 64 20 61 20 56 44 42 45 20 70 72 6f  d and a VDBE pro
0ee0: 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20  gram to execute 
0ef0: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20 68  that statement h
0f00: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65 70 61  as been.** prepa
0f10: 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  red.  This routi
0f20: 6e 65 20 70 75 74 73 20 74 68 65 20 66 69 6e 69  ne puts the fini
0f30: 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20 6f 6e  shing touches on
0f40: 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f   the.** VDBE pro
0f50: 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74 73 20  gram and resets 
0f60: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
0f70: 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e 65 78  ture for the nex
0f80: 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a  t.** parse..**.*
0f90: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61  * Note that if a
0fa0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
0fb0: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
0fc0: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e  e case that.** n
0fd0: 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20  o VDBE code was 
0fe0: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f  generated..*/.vo
0ff0: 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  id sqlite3Finish
1000: 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a 70 50  Coding(Parse *pP
1010: 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
1020: 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
1030: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1040: 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30  se->pToplevel==0
1050: 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
1060: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61  e->db;.  if( pPa
1070: 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20 72 65  rse->nested ) re
1080: 74 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e  turn;.  if( db->
1090: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
10a0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
10b0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
10c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
10d0: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
10e0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72  ITE_ERROR;.    r
10f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
1100: 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65 72 61   Begin by genera
1110: 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e  ting some termin
1120: 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20 74 68  ation code at th
1130: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a  e end of the.  *
1140: 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d 0a 20  * vdbe program. 
1150: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
1160: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1170: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ;.  assert( !pPa
1180: 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  rse->isMultiWrit
1190: 65 20 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  e .       || sql
11a0: 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61  ite3VdbeAssertMa
11b0: 79 41 62 6f 72 74 28 76 2c 20 70 50 61 72 73 65  yAbort(v, pParse
11c0: 2d 3e 6d 61 79 41 62 6f 72 74 29 29 3b 0a 20 20  ->mayAbort));.  
11d0: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
11e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
11f0: 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a 0a 23 69 66  , OP_Halt);..#if
1200: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
1210: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20  HENTICATION.    
1220: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  if( pParse->nTab
1230: 6c 65 4c 6f 63 6b 3e 30 20 26 26 20 64 62 2d 3e  leLock>0 && db->
1240: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
1250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 55 73 65        sqlite3Use
1260: 72 41 75 74 68 49 6e 69 74 28 64 62 29 3b 0a 20  rAuthInit(db);. 
1270: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74       if( db->aut
1280: 68 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54  h.authLevel<UAUT
1290: 48 5f 55 73 65 72 20 29 7b 0a 20 20 20 20 20 20  H_User ){.      
12a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12b0: 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 72 20  g(pParse, "user 
12c0: 6e 6f 74 20 61 75 74 68 65 6e 74 69 63 61 74 65  not authenticate
12d0: 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  d");.        pPa
12e0: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
12f0: 5f 41 55 54 48 5f 55 53 45 52 3b 0a 20 20 20 20  _AUTH_USER;.    
1300: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1310: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
1320: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f  ..    /* The coo
1330: 6b 69 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e  kie mask contain
1340: 73 20 6f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  s one bit for ea
1350: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
1360: 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42   open..    ** (B
1370: 69 74 20 30 20 69 73 20 66 6f 72 20 6d 61 69 6e  it 0 is for main
1380: 2c 20 62 69 74 20 31 20 69 73 20 66 6f 72 20 74  , bit 1 is for t
1390: 65 6d 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  emp, and so fort
13a0: 68 2e 29 20 20 42 69 74 73 20 61 72 65 0a 20 20  h.)  Bits are.  
13b0: 20 20 2a 2a 20 73 65 74 20 66 6f 72 20 65 61 63    ** set for eac
13c0: 68 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  h database that 
13d0: 69 73 20 75 73 65 64 2e 20 20 47 65 6e 65 72 61  is used.  Genera
13e0: 74 65 20 63 6f 64 65 20 74 6f 20 73 74 61 72 74  te code to start
13f0: 20 61 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61   a.    ** transa
1400: 63 74 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73  ction on each us
1410: 65 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ed database and 
1420: 74 6f 20 76 65 72 69 66 79 20 74 68 65 20 73 63  to verify the sc
1430: 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20  hema cookie.    
1440: 2a 2a 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20  ** on each used 
1450: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
1460: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
1470: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20  locFailed==0 .  
1480: 20 20 20 26 26 20 28 44 62 4d 61 73 6b 4e 6f 6e     && (DbMaskNon
1490: 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 63 6f 6f  Zero(pParse->coo
14a0: 6b 69 65 4d 61 73 6b 29 20 7c 7c 20 70 50 61 72  kieMask) || pPar
14b0: 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 29 0a  se->pConstExpr).
14c0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74      ){.      int
14d0: 20 69 44 62 2c 20 69 3b 0a 20 20 20 20 20 20 61   iDb, i;.      a
14e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
14f0: 62 65 47 65 74 4f 70 28 76 2c 20 30 29 2d 3e 6f  beGetOp(v, 0)->o
1500: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 29  pcode==OP_Init )
1510: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1520: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 30  dbeJumpHere(v, 0
1530: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62  );.      for(iDb
1540: 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  =0; iDb<db->nDb;
1550: 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20   iDb++){.       
1560: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1570: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 44 62  ;.        if( Db
1580: 4d 61 73 6b 54 65 73 74 28 70 50 61 72 73 65 2d  MaskTest(pParse-
1590: 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62  >cookieMask, iDb
15a0: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
15b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15c0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
15d0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 70   iDb);.        p
15e0: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
15f0: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  [iDb].pSchema;. 
1600: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1610: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 0a 20  beAddOp4Int(v,. 
1620: 20 20 20 20 20 20 20 20 20 4f 50 5f 54 72 61 6e           OP_Tran
1630: 73 61 63 74 69 6f 6e 2c 20 20 20 20 20 20 20 20  saction,        
1640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1650: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20  pcode */.       
1660: 20 20 20 69 44 62 2c 20 20 20 20 20 20 20 20 20     iDb,         
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
1690: 20 20 20 20 20 20 20 20 20 44 62 4d 61 73 6b 54           DbMaskT
16a0: 65 73 74 28 70 50 61 72 73 65 2d 3e 77 72 69 74  est(pParse->writ
16b0: 65 4d 61 73 6b 2c 69 44 62 29 2c 20 2f 2a 20 50  eMask,iDb), /* P
16c0: 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  2 */.          p
16d0: 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
16e0: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20 20 20 20  ookie,          
16f0: 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20    /* P3 */.     
1700: 20 20 20 20 20 70 53 63 68 65 6d 61 2d 3e 69 47       pSchema->iG
1710: 65 6e 65 72 61 74 69 6f 6e 20 20 20 20 20 20 20  eneration       
1720: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f          /* P4 */
1730: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
1740: 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74      if( db->init
1750: 2e 62 75 73 79 3d 3d 30 20 29 20 73 71 6c 69 74  .busy==0 ) sqlit
1760: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1770: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64  , 1);.        Vd
1780: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 0a 20 20  beComment((v,.  
1790: 20 20 20 20 20 20 20 20 20 20 20 20 22 75 73 65              "use
17a0: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 3d 25 64 22  sStmtJournal=%d"
17b0: 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f  , pParse->mayAbo
17c0: 72 74 20 26 26 20 70 50 61 72 73 65 2d 3e 69 73  rt && pParse->is
17d0: 4d 75 6c 74 69 57 72 69 74 65 29 29 3b 0a 20 20  MultiWrite));.  
17e0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
17f0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1800: 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 66 6f 72  LTABLE.      for
1810: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
1820: 6e 56 74 61 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b  nVtabLock; i++){
1830: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 76  .        char *v
1840: 74 61 62 20 3d 20 28 63 68 61 72 20 2a 29 73 71  tab = (char *)sq
1850: 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
1860: 62 2c 20 70 50 61 72 73 65 2d 3e 61 70 56 74 61  b, pParse->apVta
1870: 62 4c 6f 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20  bLock[i]);.     
1880: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1890: 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp4(v, OP_VBegi
18a0: 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74 61 62  n, 0, 0, 0, vtab
18b0: 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
18c0: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 72 73 65    }.      pParse
18d0: 2d 3e 6e 56 74 61 62 4c 6f 63 6b 20 3d 20 30 3b  ->nVtabLock = 0;
18e0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
18f0: 2a 20 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20 63  * Once all the c
1900: 6f 6f 6b 69 65 73 20 68 61 76 65 20 62 65 65 6e  ookies have been
1910: 20 76 65 72 69 66 69 65 64 20 61 6e 64 20 74 72   verified and tr
1920: 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65  ansactions opene
1930: 64 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74  d, .      ** obt
1940: 61 69 6e 20 74 68 65 20 72 65 71 75 69 72 65 64  ain the required
1950: 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68   table-locks. Th
1960: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e  is is a no-op un
1970: 6c 65 73 73 20 74 68 65 20 0a 20 20 20 20 20 20  less the .      
1980: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
1990: 66 65 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c  feature is enabl
19a0: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
19b0: 20 20 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b     codeTableLock
19c0: 73 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  s(pParse);..    
19d0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
19e0: 61 6e 79 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e  any AUTOINCREMEN
19f0: 54 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  T data structure
1a00: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
1a10: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
1a20: 65 33 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 42  e3AutoincrementB
1a30: 65 67 69 6e 28 70 50 61 72 73 65 29 3b 0a 0a 20  egin(pParse);.. 
1a40: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 63 6f 6e       /* Code con
1a50: 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
1a60: 73 20 74 68 61 74 20 77 68 65 72 65 20 66 61 63  s that where fac
1a70: 74 6f 72 65 64 20 6f 75 74 20 6f 66 20 69 6e 6e  tored out of inn
1a80: 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20  er loops */.    
1a90: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 43    if( pParse->pC
1aa0: 6f 6e 73 74 45 78 70 72 20 29 7b 0a 20 20 20 20  onstExpr ){.    
1ab0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
1ac0: 4c 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  L = pParse->pCon
1ad0: 73 74 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  stExpr;.        
1ae0: 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46  pParse->okConstF
1af0: 61 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  actor = 0;.     
1b00: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
1b10: 4c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  L->nExpr; i++){.
1b20: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1b30: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1b40: 2c 20 70 45 4c 2d 3e 61 5b 69 5d 2e 70 45 78 70  , pEL->a[i].pExp
1b50: 72 2c 20 70 45 4c 2d 3e 61 5b 69 5d 2e 75 2e 69  r, pEL->a[i].u.i
1b60: 43 6f 6e 73 74 45 78 70 72 52 65 67 29 3b 0a 20  ConstExprReg);. 
1b70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b80: 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c  ..      /* Final
1b90: 6c 79 2c 20 6a 75 6d 70 20 62 61 63 6b 20 74 6f  ly, jump back to
1ba0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1bb0: 66 20 74 68 65 20 65 78 65 63 75 74 61 62 6c 65  f the executable
1bc0: 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20   code. */.      
1bd0: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1be0: 76 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  v, 1);.    }.  }
1bf0: 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ...  /* Get the 
1c00: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65 61  VDBE program rea
1c10: 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  dy for execution
1c20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26  .  */.  if( v &&
1c30: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
1c40: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
1c50: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73  ailed ){.    ass
1c60: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61  ert( pParse->iCa
1c70: 63 68 65 4c 65 76 65 6c 3d 3d 30 20 29 3b 20 20  cheLevel==0 );  
1c80: 2f 2a 20 44 69 73 61 62 6c 65 73 20 61 6e 64 20  /* Disables and 
1c90: 72 65 2d 65 6e 61 62 6c 65 73 20 6d 61 74 63 68  re-enables match
1ca0: 20 2a 2f 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e   */.    /* A min
1cb0: 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73  imum of one curs
1cc0: 6f 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69  or is required i
1cd0: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
1ce0: 69 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53  is used.    *  S
1cf0: 65 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33  ee ticket [a6963
1d00: 37 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20  79c1f08866] */. 
1d10: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70     if( pParse->p
1d20: 41 69 6e 63 21 3d 30 20 26 26 20 70 50 61 72 73  Ainc!=0 && pPars
1d30: 65 2d 3e 6e 54 61 62 3d 3d 30 20 29 20 70 50 61  e->nTab==0 ) pPa
1d40: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20  rse->nTab = 1;. 
1d50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61     sqlite3VdbeMa
1d60: 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73  keReady(v, pPars
1d70: 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  e);.    pParse->
1d80: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1d90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1da0: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1db0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 7d 0a  TE_ERROR;.  }.}.
1dc0: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70  ./*.** Run the p
1dd0: 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67  arser and code g
1de0: 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69  enerator recursi
1df0: 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  vely in order to
1e00: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64   generate.** cod
1e10: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74  e for the SQL st
1e20: 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e  atement given on
1e30: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1e40: 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74  e pParse context
1e50: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
1e60: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1e70: 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73  .  When the pars
1e80: 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73  er is run recurs
1e90: 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61  ively.** this wa
1ea0: 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f  y, the final OP_
1eb0: 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65  Halt is not appe
1ec0: 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69  nded and other i
1ed0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a  nitialization.**
1ee0: 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f   and finalizatio
1ef0: 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74  n steps are omit
1f00: 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73  ted because thos
1f10: 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62  e are handling b
1f20: 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f  y the.** outermo
1f30: 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a  st parser..**.**
1f40: 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20   Not everything 
1f50: 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68  is nestable.  Th
1f60: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64  is facility is d
1f70: 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69  esigned to permi
1f80: 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44  t.** INSERT, UPD
1f90: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20  ATE, and DELETE 
1fa0: 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e  operations again
1fb0: 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  st SQLITE_MASTER
1fc0: 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69  .  Use.** care i
1fd0: 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20  f you decide to 
1fe0: 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20  try to use this 
1ff0: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65  routine for some
2000: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e   other purposes.
2010: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2020: 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73  NestedParse(Pars
2030: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
2040: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
2050: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
2060: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ap;.  char *zSql
2070: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
2080: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
2090: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
20a0: 62 3b 0a 20 20 63 68 61 72 20 73 61 76 65 42 75  b;.  char saveBu
20b0: 66 5b 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a 5d  f[PARSE_TAIL_SZ]
20c0: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
20d0: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
20e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
20f0: 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20  ->nested<10 );  
2100: 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c  /* Nesting shoul
2110: 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d  d only be of lim
2120: 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20  ited depth */.  
2130: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
2140: 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  rmat);.  zSql = 
2150: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
2160: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
2170: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
2180: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
2190: 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20 2f  .    return;   /
21a0: 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20  * A malloc must 
21b0: 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
21c0: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73   }.  pParse->nes
21d0: 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28  ted++;.  memcpy(
21e0: 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54  saveBuf, PARSE_T
21f0: 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50 41 52  AIL(pParse), PAR
2200: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 6d  SE_TAIL_SZ);.  m
2210: 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41 49 4c  emset(PARSE_TAIL
2220: 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50 41 52  (pParse), 0, PAR
2230: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 73  SE_TAIL_SZ);.  s
2240: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
2250: 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a  pParse, zSql, &z
2260: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
2270: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
2280: 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
2290: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29  DbFree(db, zSql)
22a0: 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41 52 53 45  ;.  memcpy(PARSE
22b0: 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20 73  _TAIL(pParse), s
22c0: 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54 41  aveBuf, PARSE_TA
22d0: 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65  IL_SZ);.  pParse
22e0: 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 23  ->nested--;.}..#
22f0: 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
2300: 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a  UTHENTICATION./*
2310: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
2320: 69 66 20 7a 54 61 62 6c 65 20 69 73 20 74 68 65  if zTable is the
2330: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73   name of the sys
2340: 74 65 6d 20 74 61 62 6c 65 20 74 68 61 74 20 73  tem table that s
2350: 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6c 69 73  tores the.** lis
2360: 74 20 6f 66 20 75 73 65 72 73 20 61 6e 64 20 74  t of users and t
2370: 68 65 69 72 20 61 63 63 65 73 73 20 63 72 65 64  heir access cred
2380: 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e 74 20  entials..*/.int 
2390: 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54  sqlite3UserAuthT
23a0: 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  able(const char 
23b0: 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72 65 74 75  *zTable){.  retu
23c0: 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  rn sqlite3_stric
23d0: 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69  mp(zTable, "sqli
23e0: 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b 0a 7d 0a  te_user")==0;.}.
23f0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  #endif../*.** Lo
2400: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
2410: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
2420: 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61  t describes a pa
2430: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
2440: 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e  e.** table given
2450: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
2460: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74  t table and (opt
2470: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d  ionally) the nam
2480: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
2490: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
24a0: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
24b0: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
24c0: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
24d0: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
24e0: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
24f0: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
2500: 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a  e table and the.
2510: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  ** first matchin
2520: 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72  g table is retur
2530: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
2540: 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ng for duplicate
2550: 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20   table.** names 
2560: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
2570: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54  earch order is T
2580: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
2590: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a  MAIN, then any.*
25a0: 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  * auxiliary data
25b0: 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e  bases added usin
25c0: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
25d0: 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  mand..**.** See 
25e0: 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61  also sqlite3Loca
25f0: 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61  teTable()..*/.Ta
2600: 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  ble *sqlite3Find
2610: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
2620: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
2630: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
2640: 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *zDatabase){.  
2650: 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20  Table *p = 0;.  
2660: 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  int i;..  /* All
2670: 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71   mutexes are req
2680: 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61  uired for schema
2690: 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73   access.  Make s
26a0: 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d  ure we hold them
26b0: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  . */.  assert( z
26c0: 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c 20 73  Database!=0 || s
26d0: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
26e0: 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
26f0: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ;.#if SQLITE_USE
2700: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
2710: 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 61  .  /* Only the a
2720: 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61 6c 6c  dmin user is all
2730: 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74 68 61  owed to know tha
2740: 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75 73 65  t the sqlite_use
2750: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65 78 69  r table.  ** exi
2760: 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  sts */.  if( db-
2770: 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 3c  >auth.authLevel<
2780: 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26 20 73  UAUTH_Admin && s
2790: 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61  qlite3UserAuthTa
27a0: 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ble(zName)!=0 ){
27b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
27c0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68 69 6c   }.#endif.  whil
27d0: 65 28 31 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  e(1){.    for(i=
27e0: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
27f0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
2800: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
2810: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f  ) ? i^1 : i;   /
2820: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
2830: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
2840: 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73 65     if( zDatabase
2850: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
2860: 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c  rICmp(zDatabase,
2870: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53   db->aDb[j].zDbS
2880: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
2890: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
28a0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
28b0: 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a  ld(db, j, 0) );.
28c0: 20 20 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69          p = sqli
28d0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
28e0: 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d  >aDb[j].pSchema-
28f0: 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 29  >tblHash, zName)
2900: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 20  ;.        if( p 
2910: 29 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20  ) return p;.    
2920: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a    }.    }.    /*
2930: 20 4e 6f 74 20 66 6f 75 6e 64 2e 20 20 49 66 20   Not found.  If 
2940: 74 68 65 20 6e 61 6d 65 20 77 65 20 77 65 72 65  the name we were
2950: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 77 61 73   looking for was
2960: 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 6d 61 73   temp.sqlite_mas
2970: 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ter.    ** then 
2980: 63 68 61 6e 67 65 20 74 68 65 20 6e 61 6d 65 20  change the name 
2990: 74 6f 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  to sqlite_temp_m
29a0: 61 73 74 65 72 20 61 6e 64 20 74 72 79 20 61 67  aster and try ag
29b0: 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ain. */.    if( 
29c0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
29d0: 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
29e0: 45 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  E)!=0 ) break;. 
29f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
2a00: 74 72 69 63 6d 70 28 7a 44 61 74 61 62 61 73 65  tricmp(zDatabase
2a10: 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62  , db->aDb[1].zDb
2a20: 53 4e 61 6d 65 29 21 3d 30 20 29 20 62 72 65 61  SName)!=0 ) brea
2a30: 6b 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54  k;.    zName = T
2a40: 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d 45 3b  EMP_MASTER_NAME;
2a50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2a60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
2a70: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
2a80: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
2a90: 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63  scribes a partic
2aa0: 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a  ular database.**
2ab0: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65   table given the
2ac0: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61   name of that ta
2ad0: 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61  ble and (optiona
2ae0: 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66  lly) the name of
2af0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
2b00: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2b10: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e  table.  Return N
2b20: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
2b30: 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e  .  Also leave an
2b40: 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67  .** error messag
2b50: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
2b60: 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rMsg..**.** The 
2b70: 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
2b80: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2b90: 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54  and sqlite3FindT
2ba0: 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20 74  able() is that t
2bb0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c  his.** routine l
2bc0: 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  eaves an error m
2bd0: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
2be0: 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a  ->zErrMsg where.
2bf0: 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  ** sqlite3FindTa
2c00: 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a  ble() does not..
2c10: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
2c20: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20 20  3LocateTable(.  
2c30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2c40: 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65 78         /* contex
2c50: 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72 65  t in which to re
2c60: 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20  port errors */. 
2c70: 20 75 33 32 20 66 6c 61 67 73 2c 20 20 20 20 20   u32 flags,     
2c80: 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f 43 41 54          /* LOCAT
2c90: 45 5f 56 49 45 57 20 6f 72 20 4c 4f 43 41 54 45  E_VIEW or LOCATE
2ca0: 5f 4e 4f 45 52 52 20 2a 2f 0a 20 20 63 6f 6e 73  _NOERR */.  cons
2cb0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
2cc0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2cd0: 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 6c  e table we are l
2ce0: 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  ooking for */.  
2cf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61  const char *zDba
2d00: 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  se     /* Name o
2d10: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
2d20: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
2d30: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
2d40: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
2d50: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
2d60: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2d70: 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
2d80: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
2d90: 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
2da0: 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
2db0: 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  ULL. */.  if( SQ
2dc0: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
2dd0: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
2de0: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
2df0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73   0;.  }..  p = s
2e00: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2e10: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d  pParse->db, zNam
2e20: 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69 66  e, zDbase);.  if
2e30: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f  ( p==0 ){.    co
2e40: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d  nst char *zMsg =
2e50: 20 66 6c 61 67 73 20 26 20 4c 4f 43 41 54 45 5f   flags & LOCATE_
2e60: 56 49 45 57 20 3f 20 22 6e 6f 20 73 75 63 68 20  VIEW ? "no such 
2e70: 76 69 65 77 22 20 3a 20 22 6e 6f 20 73 75 63 68  view" : "no such
2e80: 20 74 61 62 6c 65 22 3b 0a 23 69 66 6e 64 65 66   table";.#ifndef
2e90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2ea0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
2eb0: 28 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  ( sqlite3FindDbN
2ec0: 61 6d 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ame(pParse->db, 
2ed0: 7a 44 62 61 73 65 29 3c 31 20 29 7b 0a 20 20 20  zDbase)<1 ){.   
2ee0: 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
2ef0: 73 20 74 68 65 20 6e 6f 74 20 74 68 65 20 6e 61  s the not the na
2f00: 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 69 6e  me of a table in
2f10: 20 74 68 65 20 73 63 68 65 6d 61 20 63 72 65 61   the schema crea
2f20: 74 65 64 20 75 73 69 6e 67 0a 20 20 20 20 20 20  ted using.      
2f30: 2a 2a 20 43 52 45 41 54 45 2c 20 74 68 65 6e 20  ** CREATE, then 
2f40: 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
2f50: 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  it is the name o
2f60: 66 20 61 6e 20 76 69 72 74 75 61 6c 20 74 61 62  f an virtual tab
2f70: 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  le that.      **
2f80: 20 63 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79   can be an epony
2f90: 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61 62  mous virtual tab
2fa0: 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 4d 6f 64  le. */.      Mod
2fb0: 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64  ule *pMod = (Mod
2fc0: 75 6c 65 2a 29 73 71 6c 69 74 65 33 48 61 73 68  ule*)sqlite3Hash
2fd0: 46 69 6e 64 28 26 70 50 61 72 73 65 2d 3e 64 62  Find(&pParse->db
2fe0: 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d 65  ->aModule, zName
2ff0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 6f  );.      if( pMo
3000: 64 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 5f  d==0 && sqlite3_
3010: 73 74 72 6e 69 63 6d 70 28 7a 4e 61 6d 65 2c 20  strnicmp(zName, 
3020: 22 70 72 61 67 6d 61 5f 22 2c 20 37 29 3d 3d 30  "pragma_", 7)==0
3030: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 6f 64   ){.        pMod
3040: 20 3d 20 73 71 6c 69 74 65 33 50 72 61 67 6d 61   = sqlite3Pragma
3050: 56 74 61 62 52 65 67 69 73 74 65 72 28 70 50 61  VtabRegister(pPa
3060: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b  rse->db, zName);
3070: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
3080: 66 28 20 70 4d 6f 64 20 26 26 20 73 71 6c 69 74  f( pMod && sqlit
3090: 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54  e3VtabEponymousT
30a0: 61 62 6c 65 49 6e 69 74 28 70 50 61 72 73 65 2c  ableInit(pParse,
30b0: 20 70 4d 6f 64 29 20 29 7b 0a 20 20 20 20 20 20   pMod) ){.      
30c0: 20 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e 70    return pMod->p
30d0: 45 70 6f 54 61 62 3b 0a 20 20 20 20 20 20 7d 0a  EpoTab;.      }.
30e0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
30f0: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4c 4f   if( (flags & LO
3100: 43 41 54 45 5f 4e 4f 45 52 52 29 3d 3d 30 20 29  CATE_NOERR)==0 )
3110: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 44 62 61  {.      if( zDba
3120: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  se ){.        sq
3130: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3140: 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73  arse, "%s: %s.%s
3150: 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c  ", zMsg, zDbase,
3160: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
3170: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
3180: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3190: 61 72 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20  arse, "%s: %s", 
31a0: 7a 4d 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  zMsg, zName);.  
31b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 72      }.      pPar
31c0: 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
31d0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
31e0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
31f0: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
3200: 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64  table identified
3210: 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   by *p..**.** Th
3220: 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72 20  is is a wrapper 
3230: 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 4c 6f  around sqlite3Lo
3240: 63 61 74 65 54 61 62 6c 65 28 29 2e 20 54 68 65  cateTable(). The
3250: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
3260: 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 4c 6f  een.** sqlite3Lo
3270: 63 61 74 65 54 61 62 6c 65 28 29 20 61 6e 64 20  cateTable() and 
3280: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
3290: 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
32a0: 69 6f 6e 20 72 65 73 74 72 69 63 74 73 0a 2a 2a  ion restricts.**
32b0: 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 73   the search to s
32c0: 63 68 65 6d 61 20 28 70 2d 3e 70 53 63 68 65 6d  chema (p->pSchem
32d0: 61 29 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  a) if it is not 
32e0: 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68 65 6d 61  NULL. p->pSchema
32f0: 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e   may be.** non-N
3300: 55 4c 4c 20 69 66 20 69 74 20 69 73 20 70 61 72  ULL if it is par
3310: 74 20 6f 66 20 61 20 76 69 65 77 20 6f 72 20 74  t of a view or t
3320: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 64  rigger program d
3330: 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65 65 0a 2a  efinition. See.*
3340: 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c  * sqlite3FixSrcL
3350: 69 73 74 28 29 20 66 6f 72 20 64 65 74 61 69 6c  ist() for detail
3360: 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  s..*/.Table *sql
3370: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
3380: 74 65 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  tem(.  Parse *pP
3390: 61 72 73 65 2c 20 0a 20 20 75 33 32 20 66 6c 61  arse, .  u32 fla
33a0: 67 73 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63  gs,.  struct Src
33b0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a 29 7b 0a  List_item *p.){.
33c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
33d0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  b;.  assert( p->
33e0: 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c 20 70 2d  pSchema==0 || p-
33f0: 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 29 3b  >zDatabase==0 );
3400: 0a 20 20 69 66 28 20 70 2d 3e 70 53 63 68 65 6d  .  if( p->pSchem
3410: 61 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62  a ){.    int iDb
3420: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
3430: 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
3440: 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b  db, p->pSchema);
3450: 0a 20 20 20 20 7a 44 62 20 3d 20 70 50 61 72 73  .    zDb = pPars
3460: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
3470: 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73  zDbSName;.  }els
3480: 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e  e{.    zDb = p->
3490: 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20  zDatabase;.  }. 
34a0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c   return sqlite3L
34b0: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
34c0: 65 2c 20 66 6c 61 67 73 2c 20 70 2d 3e 7a 4e 61  e, flags, p->zNa
34d0: 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  me, zDb);.}../*.
34e0: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
34f0: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
3500: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
3510: 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61   .** a particula
3520: 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68  r index given th
3530: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69  e name of that i
3540: 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ndex.** and the 
3550: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
3560: 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69  base that contai
3570: 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  ns the index..**
3580: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
3590: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
35a0: 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73   If zDatabase is
35b0: 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65   0, all database
35c0: 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66  s are searched f
35d0: 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  or the.** table 
35e0: 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d 61  and the first ma
35f0: 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20  tching index is 
3600: 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63  returned.  (No c
3610: 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64  hecking.** for d
3620: 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e  uplicate index n
3630: 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20  ames is done.)  
3640: 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72  The search order
3650: 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73   is.** TEMP firs
3660: 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68  t, then MAIN, th
3670: 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79  en any auxiliary
3680: 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64   databases added
3690: 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54  .** using the AT
36a0: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  TACH command..*/
36b0: 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46  .Index *sqlite3F
36c0: 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33  indIndex(sqlite3
36d0: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
36e0: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
36f0: 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64  har *zDb){.  Ind
3700: 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  ex *p = 0;.  int
3710: 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74   i;.  /* All mut
3720: 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65  exes are require
3730: 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63  d for schema acc
3740: 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ess.  Make sure 
3750: 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f  we hold them. */
3760: 0a 20 20 61 73 73 65 72 74 28 20 7a 44 62 21 3d  .  assert( zDb!=
3770: 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  0 || sqlite3Btre
3780: 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
3790: 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  (db) );.  for(i=
37a0: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
37b0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
37c0: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
37d0: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53  ? i^1 : i;  /* S
37e0: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
37f0: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63  e MAIN */.    Sc
3800: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
3810: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
3820: 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ma;.    assert( 
3830: 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69  pSchema );.    i
3840: 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65  f( zDb && sqlite
3850: 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62  3StrICmp(zDb, db
3860: 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[j].zDbSNam
3870: 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
3880: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
3890: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
38a0: 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20  d(db, j, 0) );. 
38b0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
38c0: 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d  shFind(&pSchema-
38d0: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29  >idxHash, zName)
38e0: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72  ;.    if( p ) br
38f0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
3900: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
3910: 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79  claim the memory
3920: 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65   used by an inde
3930: 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  x.*/.static void
3940: 20 66 72 65 65 49 6e 64 65 78 28 73 71 6c 69 74   freeIndex(sqlit
3950: 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70  e3 *db, Index *p
3960: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
3970: 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20  E_OMIT_ANALYZE. 
3980: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e   sqlite3DeleteIn
3990: 64 65 78 53 61 6d 70 6c 65 73 28 64 62 2c 20 70  dexSamples(db, p
39a0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
39b0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
39c0: 2c 20 70 2d 3e 70 50 61 72 74 49 64 78 57 68 65  , p->pPartIdxWhe
39d0: 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  re);.  sqlite3Ex
39e0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
39f0: 20 70 2d 3e 61 43 6f 6c 45 78 70 72 29 3b 0a 20   p->aColExpr);. 
3a00: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3a10: 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  b, p->zColAff);.
3a20: 20 20 69 66 28 20 70 2d 3e 69 73 52 65 73 69 7a    if( p->isResiz
3a30: 65 64 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ed ) sqlite3DbFr
3a40: 65 65 28 64 62 2c 20 28 76 6f 69 64 20 2a 29 70  ee(db, (void *)p
3a50: 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64 65  ->azColl);.#ifde
3a60: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
3a70: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
3a80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
3a90: 3e 61 69 52 6f 77 45 73 74 29 3b 0a 23 65 6e 64  >aiRowEst);.#end
3aa0: 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  if.  sqlite3DbFr
3ab0: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
3ac0: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65  .** For the inde
3ad0: 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d  x called zIdxNam
3ae0: 65 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64  e which is found
3af0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
3b00: 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20   iDb,.** unlike 
3b10: 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20  that index from 
3b20: 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72  its Table then r
3b30: 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
3b40: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65  from.** the inde
3b50: 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  x hash table and
3b60: 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   free all memory
3b70: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
3b80: 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
3b90: 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69  he index..*/.voi
3ba0: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
3bb0: 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  ndDeleteIndex(sq
3bc0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
3bd0: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
3be0: 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64  zIdxName){.  Ind
3bf0: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61  ex *pIndex;.  Ha
3c00: 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73  sh *pHash;..  as
3c10: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
3c20: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
3c30: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48   iDb, 0) );.  pH
3c40: 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  ash = &db->aDb[i
3c50: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db].pSchema->idx
3c60: 48 61 73 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d  Hash;.  pIndex =
3c70: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
3c80: 72 74 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61  rt(pHash, zIdxNa
3c90: 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 4c  me, 0);.  if( AL
3ca0: 57 41 59 53 28 70 49 6e 64 65 78 29 20 29 7b 0a  WAYS(pIndex) ){.
3cb0: 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
3cc0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d  pTable->pIndex==
3cd0: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
3ce0: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3cf0: 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d  pIndex = pIndex-
3d00: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
3d10: 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
3d20: 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74  p;.      /* Just
3d30: 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57  ification of ALW
3d40: 41 59 53 28 29 3b 20 20 54 68 65 20 69 6e 64 65  AYS();  The inde
3d50: 78 20 6d 75 73 74 20 62 65 20 6f 6e 20 74 68 65  x must be on the
3d60: 20 6c 69 73 74 20 6f 66 0a 20 20 20 20 20 20 2a   list of.      *
3d70: 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20  * indices. */.  
3d80: 20 20 20 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e      p = pIndex->
3d90: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a  pTable->pIndex;.
3da0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
3db0: 41 59 53 28 70 29 20 26 26 20 70 2d 3e 70 4e 65  AYS(p) && p->pNe
3dc0: 78 74 21 3d 70 49 6e 64 65 78 20 29 7b 20 70 20  xt!=pIndex ){ p 
3dd0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20  = p->pNext; }.  
3de0: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
3df0: 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49   && p->pNext==pI
3e00: 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20  ndex) ){.       
3e10: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64   p->pNext = pInd
3e20: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ex->pNext;.     
3e30: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65   }.    }.    fre
3e40: 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  eIndex(db, pInde
3e50: 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6d 44  x);.  }.  db->mD
3e60: 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47  bFlags |= DBFLAG
3e70: 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 7d  _SchemaChange;.}
3e80: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68 72  ../*.** Look thr
3e90: 6f 75 67 68 20 74 68 65 20 6c 69 73 74 20 6f 66  ough the list of
3ea0: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
3eb0: 69 6c 65 73 20 69 6e 20 64 62 2d 3e 61 44 62 5b  iles in db->aDb[
3ec0: 5d 20 61 6e 64 20 69 66 0a 2a 2a 20 61 6e 79 20  ] and if.** any 
3ed0: 68 61 76 65 20 62 65 65 6e 20 63 6c 6f 73 65 64  have been closed
3ee0: 2c 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72  , remove them fr
3ef0: 6f 6d 20 74 68 65 20 6c 69 73 74 2e 20 20 52 65  om the list.  Re
3f00: 61 6c 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a 20  allocate the.** 
3f10: 64 62 2d 3e 61 44 62 5b 5d 20 73 74 72 75 63 74  db->aDb[] struct
3f20: 75 72 65 20 74 6f 20 61 20 73 6d 61 6c 6c 65 72  ure to a smaller
3f30: 20 73 69 7a 65 2c 20 69 66 20 70 6f 73 73 69 62   size, if possib
3f40: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79 20  le..**.** Entry 
3f50: 30 20 28 74 68 65 20 22 6d 61 69 6e 22 20 64 61  0 (the "main" da
3f60: 74 61 62 61 73 65 29 20 61 6e 64 20 65 6e 74 72  tabase) and entr
3f70: 79 20 31 20 28 74 68 65 20 22 74 65 6d 70 22 20  y 1 (the "temp" 
3f80: 64 61 74 61 62 61 73 65 29 0a 2a 2a 20 61 72 65  database).** are
3f90: 20 6e 65 76 65 72 20 63 61 6e 64 69 64 61 74 65   never candidate
3fa0: 73 20 66 6f 72 20 62 65 69 6e 67 20 63 6f 6c 6c  s for being coll
3fb0: 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  apsed..*/.void s
3fc0: 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61  qlite3CollapseDa
3fd0: 74 61 62 61 73 65 41 72 72 61 79 28 73 71 6c 69  tabaseArray(sqli
3fe0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
3ff0: 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  i, j;.  for(i=j=
4000: 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  2; i<db->nDb; i+
4010: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
4020: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
4030: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
4040: 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  b->pBt==0 ){.   
4050: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4060: 28 64 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61  (db, pDb->zDbSNa
4070: 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  me);.      pDb->
4080: 7a 44 62 53 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  zDbSName = 0;.  
4090: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
40a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20    }.    if( j<i 
40b0: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ){.      db->aDb
40c0: 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  [j] = db->aDb[i]
40d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b  ;.    }.    j++;
40e0: 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  .  }.  db->nDb =
40f0: 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44   j;.  if( db->nD
4100: 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21  b<=2 && db->aDb!
4110: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
4120: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d  {.    memcpy(db-
4130: 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e  >aDbStatic, db->
4140: 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62  aDb, 2*sizeof(db
4150: 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20  ->aDb[0]));.    
4160: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4170: 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20  , db->aDb);.    
4180: 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
4190: 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a  bStatic;.  }.}..
41a0: 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20  /*.** Reset the 
41b0: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20 64  schema for the d
41c0: 61 74 61 62 61 73 65 20 61 74 20 69 6e 64 65 78  atabase at index
41d0: 20 69 44 62 2e 20 20 41 6c 73 6f 20 72 65 73 65   iDb.  Also rese
41e0: 74 20 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73 63  t the.** TEMP sc
41f0: 68 65 6d 61 2e 20 20 54 68 65 20 72 65 73 65 74  hema.  The reset
4200: 20 69 73 20 64 65 66 65 72 72 65 64 20 69 66 20   is deferred if 
4210: 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 20  db->nSchemaLock 
4220: 69 73 20 6e 6f 74 20 7a 65 72 6f 2e 0a 2a 2a 20  is not zero..** 
4230: 44 65 66 65 72 72 65 64 20 72 65 73 65 74 73 20  Deferred resets 
4240: 6d 61 79 20 62 65 20 72 75 6e 20 62 79 20 63 61  may be run by ca
4250: 6c 6c 69 6e 67 20 77 69 74 68 20 69 44 62 3c 30  lling with iDb<0
4260: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4270: 33 52 65 73 65 74 4f 6e 65 53 63 68 65 6d 61 28  3ResetOneSchema(
4280: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
4290: 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   iDb){.  int i;.
42a0: 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62    assert( iDb<db
42b0: 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 69 66 28 20  ->nDb );..  if( 
42c0: 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73  iDb>=0 ){.    as
42d0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
42e0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
42f0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
4300: 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64 62  DbSetProperty(db
4310: 2c 20 69 44 62 2c 20 44 42 5f 52 65 73 65 74 57  , iDb, DB_ResetW
4320: 61 6e 74 65 64 29 3b 0a 20 20 20 20 44 62 53 65  anted);.    DbSe
4330: 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20 31 2c  tProperty(db, 1,
4340: 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29   DB_ResetWanted)
4350: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 64 62 2d  ;.  }..  if( db-
4360: 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20  >nSchemaLock==0 
4370: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
4380: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
4390: 0a 20 20 20 20 20 20 69 66 28 20 44 62 48 61 73  .      if( DbHas
43a0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20  Property(db, i, 
43b0: 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29 20  DB_ResetWanted) 
43c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
43d0: 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62  e3SchemaClear(db
43e0: 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61  ->aDb[i].pSchema
43f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4400: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  .  }.}../*.** Er
4410: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
4420: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
4430: 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
4440: 61 62 61 73 65 73 20 28 69 6e 63 6c 75 64 69 6e  abases (includin
4450: 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61 6e 64 20  g.** "main" and 
4460: 22 74 65 6d 70 22 29 20 66 6f 72 20 61 20 73 69  "temp") for a si
4470: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 63 6f  ngle database co
4480: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
4490: 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c  d sqlite3ResetAl
44a0: 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63  lSchemasOfConnec
44b0: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  tion(sqlite3 *db
44c0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
44d0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
44e0: 6c 6c 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74  ll(db);.  assert
44f0: 28 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63  ( db->nSchemaLoc
4500: 6b 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  k==0 );.  for(i=
4510: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
4520: 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  +){.    Db *pDb 
4530: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
4540: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68     if( pDb->pSch
4550: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ema ){.      sql
4560: 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28  ite3SchemaClear(
4570: 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pDb->pSchema);. 
4580: 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 6d     }.  }.  db->m
4590: 44 62 46 6c 61 67 73 20 26 3d 20 7e 44 42 46 4c  DbFlags &= ~DBFL
45a0: 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b  AG_SchemaChange;
45b0: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e  .  sqlite3VtabUn
45c0: 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20  lockList(db);.  
45d0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
45e0: 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69  eAll(db);.  sqli
45f0: 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62  te3CollapseDatab
4600: 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 7d 0a  aseArray(db);.}.
4610: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4620: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
4630: 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75  en a commit occu
4640: 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rs..*/.void sqli
4650: 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
4660: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  lChanges(sqlite3
4670: 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 6d 44 62   *db){.  db->mDb
4680: 46 6c 61 67 73 20 26 3d 20 7e 44 42 46 4c 41 47  Flags &= ~DBFLAG
4690: 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 7d  _SchemaChange;.}
46a0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 6d  ../*.** Delete m
46b0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20  emory allocated 
46c0: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  for the column n
46d0: 61 6d 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20  ames of a table 
46e0: 6f 72 20 76 69 65 77 20 28 74 68 65 0a 2a 2a 20  or view (the.** 
46f0: 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72 72  Table.aCol[] arr
4700: 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ay)..*/.void sql
4710: 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  ite3DeleteColumn
4720: 4e 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64  Names(sqlite3 *d
4730: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
4740: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  ){.  int i;.  Co
4750: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73  lumn *pCol;.  as
4760: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
4770: 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d  );.  if( (pCol =
4780: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d   pTable->aCol)!=
4790: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
47a0: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
47b0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
47c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
47d0: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
47e0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
47f0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
4800: 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  , pCol->pDflt);.
4810: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4820: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43  ree(db, pCol->zC
4830: 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  oll);.    }.    
4840: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4850: 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b  , pTable->aCol);
4860: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
4870: 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  move the memory 
4880: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
4890: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
48a0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62  the given.** Tab
48b0: 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20  le.  No changes 
48c0: 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b  are made to disk
48d0: 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
48e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
48f0: 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65  tine just delete
4900: 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63  s the data struc
4910: 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e  ture.  It does n
4920: 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65  ot unlink.** the
4930: 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75   table data stru
4940: 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68  cture from the h
4950: 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20  ash table.  But 
4960: 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a  it does destroy.
4970: 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ** memory struct
4980: 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69  ures of the indi
4990: 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20  ces and foreign 
49a0: 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  keys associated 
49b0: 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62  with .** the tab
49c0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 62  le..**.** The db
49d0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 70   parameter is op
49e0: 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69 73 20 6e  tional.  It is n
49f0: 65 65 64 65 64 20 69 66 20 74 68 65 20 54 61 62  eeded if the Tab
4a00: 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f  le object .** co
4a10: 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73 69 64 65  ntains lookaside
4a20: 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61 62 6c 65   memory.  (Table
4a30: 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20   objects in the 
4a40: 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74 20 75 73  schema do not us
4a50: 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20 6d  e.** lookaside m
4a60: 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f 6d 65 20  emory, but some 
4a70: 65 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  ephemeral Table 
4a80: 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20 20 4f 72  objects do.)  Or
4a90: 20 74 68 65 0a 2a 2a 20 64 62 20 70 61 72 61 6d   the.** db param
4aa0: 65 74 65 72 20 63 61 6e 20 62 65 20 75 73 65 64  eter can be used
4ab0: 20 77 69 74 68 20 64 62 2d 3e 70 6e 42 79 74 65   with db->pnByte
4ac0: 73 46 72 65 65 64 20 74 6f 20 6d 65 61 73 75 72  sFreed to measur
4ad0: 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  e the memory.** 
4ae0: 75 73 65 64 20 62 79 20 74 68 65 20 54 61 62 6c  used by the Tabl
4af0: 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  e object..*/.sta
4b00: 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54 45 5f  tic void SQLITE_
4b10: 4e 4f 49 4e 4c 49 4e 45 20 64 65 6c 65 74 65 54  NOINLINE deleteT
4b20: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
4b30: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
4b40: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
4b50: 78 2c 20 2a 70 4e 65 78 74 3b 0a 0a 23 69 66 64  x, *pNext;..#ifd
4b60: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
4b70: 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
4b80: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  number of outsta
4b90: 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20  nding lookaside 
4ba0: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20 73  allocations in s
4bb0: 63 68 65 6d 61 20 54 61 62 6c 65 73 0a 20 20 2a  chema Tables.  *
4bc0: 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  * prior to doing
4bd0: 20 61 6e 79 20 66 72 65 65 28 29 20 6f 70 65 72   any free() oper
4be0: 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20 73  ations.  Since s
4bf0: 63 68 65 6d 61 20 54 61 62 6c 65 73 20 64 6f 20  chema Tables do 
4c00: 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f  not use.  ** loo
4c10: 6b 61 73 69 64 65 2c 20 74 68 69 73 20 6e 75 6d  kaside, this num
4c20: 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63  ber should not c
4c30: 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 69 6e 74 20  hange. */.  int 
4c40: 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 30 3b 0a  nLookaside = 0;.
4c50: 20 20 69 66 28 20 64 62 20 26 26 20 28 70 54 61    if( db && (pTa
4c60: 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  ble->tabFlags & 
4c70: 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30  TF_Ephemeral)==0
4c80: 20 29 7b 0a 20 20 20 20 6e 4c 6f 6f 6b 61 73 69   ){.    nLookasi
4c90: 64 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 6f 6b  de = sqlite3Look
4ca0: 61 73 69 64 65 55 73 65 64 28 64 62 2c 20 30 29  asideUsed(db, 0)
4cb0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
4cc0: 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e  /* Delete all in
4cd0: 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
4ce0: 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65   with this table
4cf0: 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65  . */.  for(pInde
4d00: 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64  x = pTable->pInd
4d10: 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
4d20: 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ex=pNext){.    p
4d30: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
4d40: 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74  Next;.    assert
4d50: 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  ( pIndex->pSchem
4d60: 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  a==pTable->pSche
4d70: 6d 61 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ma.         || (
4d80: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65  IsVirtual(pTable
4d90: 29 20 26 26 20 70 49 6e 64 65 78 2d 3e 69 64 78  ) && pIndex->idx
4da0: 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58  Type!=SQLITE_IDX
4db0: 54 59 50 45 5f 41 50 50 44 45 46 29 20 29 3b 0a  TYPE_APPDEF) );.
4dc0: 20 20 20 20 69 66 28 20 28 64 62 3d 3d 30 20 7c      if( (db==0 |
4dd0: 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  | db->pnBytesFre
4de0: 65 64 3d 3d 30 29 20 26 26 20 21 49 73 56 69 72  ed==0) && !IsVir
4df0: 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 7b 0a  tual(pTable) ){.
4e00: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
4e10: 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  e = pIndex->zNam
4e20: 65 3b 20 0a 20 20 20 20 20 20 54 45 53 54 4f 4e  e; .      TESTON
4e30: 4c 59 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64  LY ( Index *pOld
4e40: 20 3d 20 29 20 73 71 6c 69 74 65 33 48 61 73 68   = ) sqlite3Hash
4e50: 49 6e 73 65 72 74 28 0a 20 20 20 20 20 20 20 20  Insert(.        
4e60: 20 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d   &pIndex->pSchem
4e70: 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  a->idxHash, zNam
4e80: 65 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  e, 0.      );.  
4e90: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d      assert( db==
4ea0: 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 63 68 65  0 || sqlite3Sche
4eb0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
4ec0: 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  0, pIndex->pSche
4ed0: 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ma) );.      ass
4ee0: 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65  ert( pOld==pInde
4ef0: 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a  x || pOld==0 );.
4f00: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e      }.    freeIn
4f10: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
4f20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
4f30: 65 20 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65  e any foreign ke
4f40: 79 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ys attached to t
4f50: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
4f60: 73 71 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28  sqlite3FkDelete(
4f70: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20  db, pTable);..  
4f80: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61  /* Delete the Ta
4f90: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74  ble structure it
4fa0: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  self..  */.  sql
4fb0: 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  ite3DeleteColumn
4fc0: 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65  Names(db, pTable
4fd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
4fe0: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a  ee(db, pTable->z
4ff0: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
5000: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c  DbFree(db, pTabl
5010: 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73  e->zColAff);.  s
5020: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
5030: 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  te(db, pTable->p
5040: 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74  Select);.  sqlit
5050: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
5060: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68  (db, pTable->pCh
5070: 65 63 6b 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  eck);.#ifndef SQ
5080: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
5090: 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33  LTABLE.  sqlite3
50a0: 56 74 61 62 43 6c 65 61 72 28 64 62 2c 20 70 54  VtabClear(db, pT
50b0: 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  able);.#endif.  
50c0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
50d0: 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a  , pTable);..  /*
50e0: 20 56 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20   Verify that no 
50f0: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
5100: 20 77 61 73 20 75 73 65 64 20 62 79 20 73 63 68   was used by sch
5110: 65 6d 61 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ema tables */.  
5120: 61 73 73 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69  assert( nLookasi
5130: 64 65 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73  de==0 || nLookas
5140: 69 64 65 3d 3d 73 71 6c 69 74 65 33 4c 6f 6f 6b  ide==sqlite3Look
5150: 61 73 69 64 65 55 73 65 64 28 64 62 2c 30 29 20  asideUsed(db,0) 
5160: 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
5170: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  3DeleteTable(sql
5180: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
5190: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 2f 2a 20 44  *pTable){.  /* D
51a0: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
51b0: 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65   table until the
51c0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
51d0: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a   reaches zero. *
51e0: 2f 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 20  /.  if( !pTable 
51f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5200: 28 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42  ((!db || db->pnB
5210: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26  ytesFreed==0) &&
5220: 20 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 54 61 62   (--pTable->nTab
5230: 52 65 66 29 3e 30 29 20 29 20 72 65 74 75 72 6e  Ref)>0) ) return
5240: 3b 0a 20 20 64 65 6c 65 74 65 54 61 62 6c 65 28  ;.  deleteTable(
5250: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a  db, pTable);.}..
5260: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68  ./*.** Unlink th
5270: 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72  e given table fr
5280: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
5290: 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74  es and the delet
52a0: 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73  e the.** table s
52b0: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c  tructure with al
52c0: 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e  l its indices an
52d0: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a  d foreign keys..
52e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55  */.void sqlite3U
52f0: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61  nlinkAndDeleteTa
5300: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
5310: 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20   int iDb, const 
5320: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b  char *zTabName){
5330: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44  .  Table *p;.  D
5340: 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72  b *pDb;..  asser
5350: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
5360: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
5370: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
5380: 20 61 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d   assert( zTabNam
5390: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
53a0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
53b0: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
53c0: 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
53d0: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20   zTabName[0]==0 
53e0: 29 3b 20 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67  );  /* Zero-leng
53f0: 74 68 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 61  th table names a
5400: 72 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20  re allowed */.  
5410: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
5420: 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  Db];.  p = sqlit
5430: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44  e3HashInsert(&pD
5440: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
5450: 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 30  ash, zTabName, 0
5460: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  );.  sqlite3Dele
5470: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a  teTable(db, p);.
5480: 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c    db->mDbFlags |
5490: 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43  = DBFLAG_SchemaC
54a0: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
54b0: 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72  Given a token, r
54c0: 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74  eturn a string t
54d0: 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  hat consists of 
54e0: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 61 74  the text of that
54f0: 0a 2a 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63  .** token.  Spac
5500: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
5510: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
5520: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
5530: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
5540: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
5550: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
5560: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  g.** function..*
5570: 2a 0a 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74 69  *.** Any quotati
5580: 6f 6e 20 6d 61 72 6b 73 20 28 65 78 3a 20 20 22  on marks (ex:  "
5590: 6e 61 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b  name", 'name', [
55a0: 6e 61 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60  name], or `name`
55b0: 29 20 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75  ) that.** surrou
55c0: 6e 64 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74  nd the body of t
55d0: 68 65 20 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d  he token are rem
55e0: 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65  oved..**.** Toke
55f0: 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73  ns are often jus
5600: 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20  t pointers into 
5610: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
5620: 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20   text and so.** 
5630: 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72  are not \000 ter
5640: 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20  minated and are 
5650: 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20  not persistent. 
5660: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   The returned st
5670: 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20  ring.** is \000 
5680: 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69  terminated and i
5690: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f  s persistent..*/
56a0: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61  .char *sqlite3Na
56b0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69  meFromToken(sqli
56c0: 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a  te3 *db, Token *
56d0: 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  pName){.  char *
56e0: 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61  zName;.  if( pNa
56f0: 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
5700: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
5710: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e  up(db, (char*)pN
5720: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
5730: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
5740: 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
5750: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65  }else{.    zName
5760: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
5770: 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zName;.}../*.
5780: 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69  ** Open the sqli
5790: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
57a0: 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61  stored in databa
57b0: 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f  se number iDb fo
57c0: 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68  r.** writing. Th
57d0: 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65  e table is opene
57e0: 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30  d using cursor 0
57f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5800: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
5810: 28 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69  (Parse *p, int i
5820: 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
5830: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
5840: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62  p);.  sqlite3Tab
5850: 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d  leLock(p, iDb, M
5860: 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 4d  ASTER_ROOT, 1, M
5870: 41 53 54 45 52 5f 4e 41 4d 45 29 3b 0a 20 20 73  ASTER_NAME);.  s
5880: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
5890: 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Int(v, OP_OpenWr
58a0: 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52  ite, 0, MASTER_R
58b0: 4f 4f 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20  OOT, iDb, 5);.  
58c0: 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29  if( p->nTab==0 )
58d0: 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20  {.    p->nTab = 
58e0: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
58f0: 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20  Parameter zName 
5900: 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d  points to a nul-
5910: 74 65 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65  terminated buffe
5920: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
5930: 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61   name.** of a da
5940: 74 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20  tabase ("main", 
5950: 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61  "temp" or the na
5960: 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65  me of an attache
5970: 64 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66  d db). This.** f
5980: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
5990: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
59a0: 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
59b0: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72  in db->aDb[], or
59c0: 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61  .** -1 if the na
59d0: 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65  med db cannot be
59e0: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
59f0: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
5a00: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
5a10: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
5a20: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20  {.  int i = -1; 
5a30: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5a40: 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
5a50: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
5a60: 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20 66 6f   Db *pDb;.    fo
5a70: 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c  r(i=(db->nDb-1),
5a80: 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d   pDb=&db->aDb[i]
5a90: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62  ; i>=0; i--, pDb
5aa0: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30  --){.      if( 0
5ab0: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
5ac0: 70 28 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c  p(pDb->zDbSName,
5ad0: 20 7a 4e 61 6d 65 29 20 29 20 62 72 65 61 6b 3b   zName) ) break;
5ae0: 0a 20 20 20 20 20 20 2f 2a 20 22 6d 61 69 6e 22  .      /* "main"
5af0: 20 69 73 20 61 6c 77 61 79 73 20 61 6e 20 61 63   is always an ac
5b00: 63 65 70 74 61 62 6c 65 20 61 6c 69 61 73 20 66  ceptable alias f
5b10: 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 64  or the primary d
5b20: 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
5b30: 20 65 76 65 6e 20 69 66 20 69 74 20 68 61 73 20   even if it has 
5b40: 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 75 73 69  been renamed usi
5b50: 6e 67 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  ng SQLITE_DBCONF
5b60: 49 47 5f 4d 41 49 4e 44 42 4e 41 4d 45 2e 20 2a  IG_MAINDBNAME. *
5b70: 2f 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30  /.      if( i==0
5b80: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73   && 0==sqlite3_s
5b90: 74 72 69 63 6d 70 28 22 6d 61 69 6e 22 2c 20 7a  tricmp("main", z
5ba0: 4e 61 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20  Name) ) break;. 
5bb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5bc0: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n i;.}../*.** Th
5bd0: 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63  e token *pName c
5be0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
5bf0: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28   of a database (
5c00: 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72  either "main" or
5c10: 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68  .** "temp" or th
5c20: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74  e name of an att
5c30: 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 20  ached db). This 
5c40: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
5c50: 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20  the.** index of 
5c60: 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61  the named databa
5c70: 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c  se in db->aDb[],
5c80: 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61   or -1 if the na
5c90: 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20  med db .** does 
5ca0: 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e  not exist..*/.in
5cb0: 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28  t sqlite3FindDb(
5cc0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b  sqlite3 *db, Tok
5cd0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e  en *pName){.  in
5ce0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
5cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d00: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
5d10: 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  umber */.  char 
5d20: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
5d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d40: 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73  /* Name we are s
5d50: 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a  earching for */.
5d60: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
5d70: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
5d80: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d  b, pName);.  i =
5d90: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
5da0: 6d 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  me(db, zName);. 
5db0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5dc0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
5dd0: 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  urn i;.}../* The
5de0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f   table or view o
5df0: 72 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69  r trigger name i
5e00: 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
5e10: 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b   routine via tok
5e20: 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e  ens.** pName1 an
5e30: 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65  d pName2. If the
5e40: 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20   table name was 
5e50: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
5e60: 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   for example:.**
5e70: 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45  .** CREATE TABLE
5e80: 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a   xxx.yyy (...);.
5e90: 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d  ** .** Then pNam
5ea0: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78  e1 is set to "xx
5eb0: 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79  x" and pName2 "y
5ec0: 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  yy". On the othe
5ed0: 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65  r hand if.** the
5ee0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e   table name is n
5ef0: 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  ot fully qualifi
5f00: 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20  ed, i.e.:.**.** 
5f10: 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79  CREATE TABLE yyy
5f20: 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  (...);.**.** The
5f30: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
5f40: 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61  to "yyy" and pNa
5f50: 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a  me2 is ""..**.**
5f60: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
5f70: 74 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c  ts the *ppUnqual
5f80: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e   pointer to poin
5f90: 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28  t at the token (
5fa0: 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61  pName1 or.** pNa
5fb0: 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73  me2) that stores
5fc0: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
5fd0: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
5fe0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a  e index of the.*
5ff0: 2a 20 64 61 74 61 62 61 73 65 20 22 78 78 78 22  * database "xxx"
6000: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
6010: 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50  .int sqlite3TwoP
6020: 61 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65  artName(.  Parse
6030: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
6040: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
6050: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
6060: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
6070: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f   *pName1,      /
6080: 2a 20 54 68 65 20 22 78 78 78 22 20 69 6e 20 74  * The "xxx" in t
6090: 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79  he name "xxx.yyy
60a0: 22 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20  " or "xxx" */.  
60b0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
60c0: 20 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22      /* The "yyy"
60d0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78   in the name "xx
60e0: 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65  x.yyy" */.  Toke
60f0: 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20  n **pUnqual     
6100: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 71  /* Write the unq
6110: 75 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20  ualified object 
6120: 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  name here */.){.
6130: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
6140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6150: 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
6160: 67 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  g the object */.
6170: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
6180: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61  pParse->db;..  a
6190: 73 73 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30  ssert( pName2!=0
61a0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 32   );.  if( pName2
61b0: 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  ->n>0 ){.    if(
61c0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
61d0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
61e0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
61f0: 20 22 63 6f 72 72 75 70 74 20 64 61 74 61 62 61   "corrupt databa
6200: 73 65 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  se");.      retu
6210: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
6220: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
6230: 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  e2;.    iDb = sq
6240: 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20  lite3FindDb(db, 
6250: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28  pName1);.    if(
6260: 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20   iDb<0 ){.      
6270: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6280: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
6290: 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20 70   database %T", p
62a0: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 72 65  Name1);.      re
62b0: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
62c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
62d0: 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  rt( db->init.iDb
62e0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e  ==0 || db->init.
62f0: 62 75 73 79 0a 20 20 20 20 20 20 20 20 20 20 20  busy.           
6300: 20 20 7c 7c 20 28 64 62 2d 3e 6d 44 62 46 6c 61    || (db->mDbFla
6310: 67 73 20 26 20 44 42 46 4c 41 47 5f 56 61 63 75  gs & DBFLAG_Vacu
6320: 75 6d 29 21 3d 30 29 3b 0a 20 20 20 20 69 44 62  um)!=0);.    iDb
6330: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b   = db->init.iDb;
6340: 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20  .    *pUnqual = 
6350: 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65  pName1;.  }.  re
6360: 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a  turn iDb;.}../*.
6370: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6380: 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  is used to check
6390: 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74   if the UTF-8 st
63a0: 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20  ring zName is a 
63b0: 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69  legal.** unquali
63c0: 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20  fied name for a 
63d0: 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63  new schema objec
63e0: 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c  t (table, index,
63f0: 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67   view or.** trig
6400: 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20  ger). All names 
6410: 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74  are legal except
6420: 20 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69   those that begi
6430: 6e 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e  n with the strin
6440: 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28  g.** "sqlite_" (
6450: 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20  in upper, lower 
6460: 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20  or mixed case). 
6470: 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20  This portion of 
6480: 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a  the namespace.**
6490: 20 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72   is reserved for
64a0: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a   internal use..*
64b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
64c0: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72  ckObjectName(Par
64d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
64e0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
64f0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64    if( !pParse->d
6500: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
6510: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
6520: 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  0 .          && 
6530: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  (pParse->db->fla
6540: 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74  gs & SQLITE_Writ
6550: 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20  eSchema)==0.    
6560: 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69        && 0==sqli
6570: 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d  te3StrNICmp(zNam
6580: 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
6590: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
65a0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
65b0: 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73  "object name res
65c0: 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e  erved for intern
65d0: 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61  al use: %s", zNa
65e0: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
65f0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
6600: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
6610: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
6620: 65 74 75 72 6e 20 74 68 65 20 50 52 49 4d 41 52  eturn the PRIMAR
6630: 59 20 4b 45 59 20 69 6e 64 65 78 20 6f 66 20 61  Y KEY index of a
6640: 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65 78 20   table.*/.Index 
6650: 2a 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b  *sqlite3PrimaryK
6660: 65 79 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70  eyIndex(Table *p
6670: 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  Tab){.  Index *p
6680: 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e  ;.  for(p=pTab->
6690: 70 49 6e 64 65 78 3b 20 70 20 26 26 20 21 49 73  pIndex; p && !Is
66a0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
66b0: 70 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b  p); p=p->pNext){
66c0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
66d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
66e0: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65  e column of inde
66f0: 78 20 70 49 64 78 20 74 68 61 74 20 63 6f 72 72  x pIdx that corr
6700: 65 73 70 6f 6e 64 73 20 74 6f 20 74 61 62 6c 65  esponds to table
6710: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e  .** column iCol.
6720: 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 6e    Return -1 if n
6730: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36  ot found..*/.i16
6740: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
6750: 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64  Index(Index *pId
6760: 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20 20  x, i16 iCol){.  
6770: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
6780: 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; i<pIdx->nColum
6790: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
67a0: 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43   iCol==pIdx->aiC
67b0: 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74 75 72  olumn[i] ) retur
67c0: 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
67d0: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n -1;.}../*.** B
67e0: 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  egin constructin
67f0: 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65  g a new table re
6800: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20  presentation in 
6810: 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73  memory.  This is
6820: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66  .** the first of
6830: 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20   several action 
6840: 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65  routines that ge
6850: 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70  t called in resp
6860: 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45  onse.** to a CRE
6870: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
6880: 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75  ent.  In particu
6890: 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  lar, this routin
68a0: 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61  e is called.** a
68b0: 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65  fter seeing toke
68c0: 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20  ns "CREATE" and 
68d0: 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20  "TABLE" and the 
68e0: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20  table name. The 
68f0: 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69  isTemp.** flag i
6900: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61  s true if the ta
6910: 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74  ble should be st
6920: 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69  ored in the auxi
6930: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a  liary database.*
6940: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
6950: 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  f in the main da
6960: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
6970: 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74  is is normally t
6980: 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20  he case.** when 
6990: 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54  the "TEMP" or "T
69a0: 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72  EMPORARY" keywor
69b0: 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  d occurs in betw
69c0: 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e  een.** CREATE an
69d0: 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54  d TABLE..**.** T
69e0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
69f0: 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ord is initializ
6a00: 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50  ed and put in pP
6a10: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e  arse->pNewTable.
6a20: 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74  .** As more of t
6a30: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
6a40: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
6a50: 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  sed, additional 
6a60: 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e  action.** routin
6a70: 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  es will be calle
6a80: 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e  d to add more in
6a90: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69  formation to thi
6aa0: 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20  s record..** At 
6ab0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
6ac0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
6ad0: 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74  ement, the sqlit
6ae0: 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75  e3EndTable() rou
6af0: 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
6b00: 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  d to complete th
6b10: 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f  e construction o
6b20: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
6b30: 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20  record..*/.void 
6b40: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
6b50: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
6b60: 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20  se,   /* Parser 
6b70: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
6b80: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a  en *pName1,   /*
6b90: 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74   First part of t
6ba0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
6bb0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a  able or view */.
6bc0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
6bd0: 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72     /* Second par
6be0: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
6bf0: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
6c00: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
6c10: 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  mp,      /* True
6c20: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45   if this is a TE
6c30: 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  MP table */.  in
6c40: 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f  t isView,      /
6c50: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
6c60: 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e  s a VIEW */.  in
6c70: 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f  t isVirtual,   /
6c80: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
6c90: 73 20 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c  s a VIRTUAL tabl
6ca0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72  e */.  int noErr
6cb0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
6cc0: 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61  thing if table a
6cd0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
6ce0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
6cf0: 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  ble;.  char *zNa
6d00: 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e  me = 0; /* The n
6d10: 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ame of the new t
6d20: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
6d30: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
6d40: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
6d50: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
6d60: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
6d70: 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74  mber to create t
6d80: 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20  he table in */. 
6d90: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20   Token *pName;  
6da0: 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
6db0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
6dc0: 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  le to create */.
6dd0: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
6de0: 62 75 73 79 20 26 26 20 64 62 2d 3e 69 6e 69 74  busy && db->init
6df0: 2e 6e 65 77 54 6e 75 6d 3d 3d 31 20 29 7b 0a 20  .newTnum==1 ){. 
6e00: 20 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61     /* Special ca
6e10: 73 65 3a 20 20 50 61 72 73 69 6e 67 20 74 68 65  se:  Parsing the
6e20: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 6f   sqlite_master o
6e30: 72 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  r sqlite_temp_ma
6e40: 73 74 65 72 20 73 63 68 65 6d 61 20 2a 2f 0a 20  ster schema */. 
6e50: 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69     iDb = db->ini
6e60: 74 2e 69 44 62 3b 0a 20 20 20 20 7a 4e 61 6d 65  t.iDb;.    zName
6e70: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
6e80: 75 70 28 64 62 2c 20 53 43 48 45 4d 41 5f 54 41  up(db, SCHEMA_TA
6e90: 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 20 20 70  BLE(iDb));.    p
6ea0: 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 31 3b 0a 20  Name = pName1;. 
6eb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
6ec0: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a  he common case *
6ed0: 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  /.    iDb = sqli
6ee0: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
6ef0: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
6f00: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
6f10: 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20      if( iDb<0 ) 
6f20: 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20  return;.    if( 
6f30: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
6f40: 69 73 54 65 6d 70 20 26 26 20 70 4e 61 6d 65 32  isTemp && pName2
6f50: 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21 3d 31 20  ->n>0 && iDb!=1 
6f60: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 63  ){.      /* If c
6f70: 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74  reating a temp t
6f80: 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d  able, the name m
6f90: 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66  ay not be qualif
6fa0: 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20 20 20  ied. Unless .   
6fb0: 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
6fc0: 73 65 20 6e 61 6d 65 20 69 73 20 22 74 65 6d 70  se name is "temp
6fd0: 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f 0a 20 20  " anyway.  */.  
6fe0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6ff0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d  Msg(pParse, "tem
7000: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d  porary table nam
7010: 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c  e must be unqual
7020: 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 72  ified");.      r
7030: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
7040: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
7050: 42 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44  B && isTemp ) iD
7060: 62 20 3d 20 31 3b 0a 20 20 20 20 7a 4e 61 6d 65  b = 1;.    zName
7070: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
7080: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
7090: 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65  e);.  }.  pParse
70a0: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a  ->sNameToken = *
70b0: 70 4e 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e 61  pName;.  if( zNa
70c0: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
70d0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
70e0: 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
70f0: 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
7100: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f  zName) ){.    go
7110: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7120: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rror;.  }.  if( 
7130: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20  db->init.iDb==1 
7140: 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69  ) isTemp = 1;.#i
7150: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7160: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
7170: 20 20 61 73 73 65 72 74 28 20 69 73 54 65 6d 70    assert( isTemp
7180: 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d 31  ==0 || isTemp==1
7190: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
71a0: 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65  View==0 || isVie
71b0: 77 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20 20  w==1 );.  {.    
71c0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
71d0: 61 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  aCode[] = {.    
71e0: 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45     SQLITE_CREATE
71f0: 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53  _TABLE,.       S
7200: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
7210: 50 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20  P_TABLE,.       
7220: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
7230: 45 57 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54  EW,.       SQLIT
7240: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49  E_CREATE_TEMP_VI
7250: 45 57 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68  EW.    };.    ch
7260: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
7270: 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  b[iDb].zDbSName;
7280: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
7290: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
72a0: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
72b0: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73   SCHEMA_TABLE(is
72c0: 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29  Temp), 0, zDb) )
72d0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  {.      goto beg
72e0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
72f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69      }.    if( !i
7300: 73 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69  sVirtual && sqli
7310: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
7320: 72 73 65 2c 20 28 69 6e 74 29 61 43 6f 64 65 5b  rse, (int)aCode[
7330: 69 73 54 65 6d 70 2b 32 2a 69 73 56 69 65 77 5d  isTemp+2*isView]
7340: 2c 0a 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 20 20 7a 4e 61 6d 65 2c 20           zName, 
7370: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
7380: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
7390: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
73a0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
73b0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
73c0: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
73d0: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
73e0: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
73f0: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
7400: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
7410: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
7420: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
7430: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
7440: 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70   does. The excep
7450: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73  tion is if the s
7460: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
7470: 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64  arsed was passed
7480: 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69  .  ** to an sqli
7490: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
74a0: 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74  () call. In that
74b0: 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63   case only the c
74c0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a  olumn names.  **
74d0: 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20   and types will 
74e0: 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72  be used, so ther
74f0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
7500: 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61  test for namespa
7510: 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f  ce.  ** collisio
7520: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
7530: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
7540: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62  ){.    char *zDb
7550: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
7560: 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66  zDbSName;.    if
7570: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
7580: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
7590: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20  Parse) ){.      
75a0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
75b0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
75c0: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
75d0: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
75e0: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20  zName, zDb);.   
75f0: 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
7600: 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20       if( !noErr 
7610: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7620: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7630: 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72  e, "table %T alr
7640: 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e  eady exists", pN
7650: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
7660: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
7670: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
7680: 79 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  y || CORRUPT_DB 
7690: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
76a0: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
76b0: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
76c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
76d0: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
76e0: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
76f0: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
7700: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
7710: 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20   zDb)!=0 ){.    
7720: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7730: 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
7740: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
7750: 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20  ndex named %s", 
7760: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
7770: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7780: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
7790: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
77a0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
77b0: 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
77c0: 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  ));.  if( pTable
77d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
77e0: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
77f0: 6c 65 64 20 29 3b 0a 20 20 20 20 70 50 61 72 73  led );.    pPars
7800: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  e->rc = SQLITE_N
7810: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 70  OMEM_BKPT;.    p
7820: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
7830: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
7840: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
7850: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d   pTable->zName =
7860: 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65   zName;.  pTable
7870: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
7880: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20  pTable->pSchema 
7890: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
78a0: 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65  Schema;.  pTable
78b0: 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 23  ->nTabRef = 1;.#
78c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46  ifdef SQLITE_DEF
78d0: 41 55 4c 54 5f 52 4f 57 45 53 54 0a 20 20 70 54  AULT_ROWEST.  pT
78e0: 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  able->nRowLogEst
78f0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
7900: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
7910: 52 4f 57 45 53 54 29 3b 0a 23 65 6c 73 65 0a 20  ROWEST);.#else. 
7920: 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67   pTable->nRowLog
7930: 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
7940: 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
7950: 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
7960: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
7970: 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  t( pParse->pNewT
7980: 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61  able==0 );.  pPa
7990: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
79a0: 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49   pTable;..  /* I
79b0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61  f this is the ma
79c0: 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65  gic sqlite_seque
79d0: 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20 62  nce table used b
79e0: 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c  y autoincrement,
79f0: 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72  .  ** then recor
7a00: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  d a pointer to t
7a10: 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65  his table in the
7a20: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
7a30: 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f  tructure.  ** so
7a40: 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e   that INSERT can
7a50: 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   find the table 
7a60: 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  easily..  */.#if
7a70: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7a80: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
7a90: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65   if( !pParse->ne
7aa0: 73 74 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a  sted && strcmp(z
7ab0: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65  Name, "sqlite_se
7ac0: 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20  quence")==0 ){. 
7ad0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
7ae0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
7af0: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
7b00: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63  .    pTable->pSc
7b10: 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20  hema->pSeqTab = 
7b20: 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  pTable;.  }.#end
7b30: 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67  if..  /* Begin g
7b40: 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f  enerating the co
7b50: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73  de that will ins
7b60: 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65  ert the table re
7b70: 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74  cord into.  ** t
7b80: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
7b90: 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e   table.  Note in
7ba0: 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74   particular that
7bb0: 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61   we must go ahea
7bc0: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63  d.  ** and alloc
7bd0: 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ate the record n
7be0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
7bf0: 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20  ble entry now.  
7c00: 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20  Before any.  ** 
7c10: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
7c20: 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61  NIQUE keywords a
7c30: 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73  re parsed.  Thos
7c40: 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20  e keywords will 
7c50: 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63  cause.  ** indic
7c60: 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  es to be created
7c70: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72   and the table r
7c80: 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20  ecord must come 
7c90: 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a  before the .  **
7ca0: 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65   indices.  Hence
7cb0: 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  , the record num
7cc0: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
7cd0: 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  e must be alloca
7ce0: 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20  ted.  ** now..  
7cf0: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
7d00: 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20  it.busy && (v = 
7d10: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
7d20: 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20  Parse))!=0 ){.  
7d30: 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 20    int addr1;.   
7d40: 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b   int fileFormat;
7d50: 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72  .    int reg1, r
7d60: 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 2f  eg2, reg3;.    /
7d70: 2a 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73 20 61  * nullRow[] is a
7d80: 6e 20 4f 50 5f 52 65 63 6f 72 64 20 65 6e 63 6f  n OP_Record enco
7d90: 64 69 6e 67 20 6f 66 20 61 20 72 6f 77 20 63 6f  ding of a row co
7da0: 6e 74 61 69 6e 69 6e 67 20 35 20 4e 55 4c 4c 73  ntaining 5 NULLs
7db0: 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
7dc0: 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c 52 6f  onst char nullRo
7dd0: 77 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c 20 30 2c  w[] = { 6, 0, 0,
7de0: 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20   0, 0, 0 };.    
7df0: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
7e00: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
7e10: 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 1, iDb);..#if
7e20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7e30: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
7e40: 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20    if( isVirtual 
7e50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7e60: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
7e70: 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a  _VBegin);.    }.
7e80: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
7e90: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
7ea0: 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69  t and encoding i
7eb0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
7ec0: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74  ave not been set
7ed0: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
7ee0: 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20  em now..    */. 
7ef0: 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65     reg1 = pParse
7f00: 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70  ->regRowid = ++p
7f10: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
7f20: 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e   reg2 = pParse->
7f30: 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72  regRoot = ++pPar
7f40: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
7f50: 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  g3 = ++pParse->n
7f60: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
7f70: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7f80: 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
7f90: 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49  , reg3, BTREE_FI
7fa0: 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20  LE_FORMAT);.    
7fb0: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
7fc0: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
7fd0: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
7fe0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
7ff0: 50 5f 49 66 2c 20 72 65 67 33 29 3b 20 56 64 62  P_If, reg3); Vdb
8000: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
8010: 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28    fileFormat = (
8020: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
8030: 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74  TE_LegacyFileFmt
8040: 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
8050: 20 20 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c           1 : SQL
8060: 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52  ITE_MAX_FILE_FOR
8070: 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  MAT;.    sqlite3
8080: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8090: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
80a0: 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d   BTREE_FILE_FORM
80b0: 41 54 2c 20 66 69 6c 65 46 6f 72 6d 61 74 29 3b  AT, fileFormat);
80c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
80d0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
80e0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52  Cookie, iDb, BTR
80f0: 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47  EE_TEXT_ENCODING
8100: 2c 20 45 4e 43 28 64 62 29 29 3b 0a 20 20 20 20  , ENC(db));.    
8110: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
8120: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a  ere(v, addr1);..
8130: 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74      /* This just
8140: 20 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65   creates a place
8150: 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69  -holder record i
8160: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
8170: 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ter table..    *
8180: 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65  * The record cre
8190: 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ated does not co
81a0: 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79  ntain anything y
81b0: 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  et.  It will be 
81c0: 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20  replaced.    ** 
81d0: 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72  by the real entr
81e0: 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61  y in code genera
81f0: 74 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e  ted at sqlite3En
8200: 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a  dTable()..    **
8210: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  .    ** The rowi
8220: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e  d for the new en
8230: 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72  try is left in r
8240: 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
8250: 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a  regRowid..    **
8260: 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   The root page n
8270: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
8280: 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69   table is left i
8290: 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65  n reg pParse->re
82a0: 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68  gRoot..    ** Th
82b0: 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74  e rowid and root
82c0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c   page number val
82d0: 75 65 73 20 61 72 65 20 6e 65 65 64 65 64 20 62  ues are needed b
82e0: 79 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a  y the code that.
82f0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e      ** sqlite3En
8300: 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65  dTable will gene
8310: 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  rate..    */.#if
8320: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8330: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
8340: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8350: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
8360: 29 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  ).    if( isView
8370: 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b   || isVirtual ){
8380: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8390: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
83a0: 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29  nteger, 0, reg2)
83b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
83c0: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70  if.    {.      p
83d0: 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62  Parse->addrCrTab
83e0: 20 3d 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69   =.         sqli
83f0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8400: 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 2c   OP_CreateBtree,
8410: 20 69 44 62 2c 20 72 65 67 32 2c 20 42 54 52 45   iDb, reg2, BTRE
8420: 45 5f 49 4e 54 4b 45 59 29 3b 0a 20 20 20 20 7d  E_INTKEY);.    }
8430: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
8440: 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61 72  MasterTable(pPar
8450: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  se, iDb);.    sq
8460: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8470: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
8480: 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71  0, reg1);.    sq
8490: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
84a0: 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c 20 72  v, OP_Blob, 6, r
84b0: 65 67 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f 77 2c  eg3, 0, nullRow,
84c0: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
84d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
84e0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
84f0: 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b   0, reg3, reg1);
8500: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8510: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
8520: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
8530: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8540: 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a  0(v, OP_Close);.
8550: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
8560: 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74   (non-error) ret
8570: 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  urn. */.  return
8580: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
8590: 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a  ror occurs, we j
85a0: 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69  ump here */.begi
85b0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20  n_table_error:. 
85c0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
85d0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
85e0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74 20 70  urn;.}../* Set p
85f0: 72 6f 70 65 72 74 69 65 73 20 6f 66 20 61 20 74  roperties of a t
8600: 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 62 61 73 65  able column base
8610: 64 20 6f 6e 20 74 68 65 20 28 6d 61 67 69 63 61  d on the (magica
8620: 6c 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68  l).** name of th
8630: 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23 69 66  e column..*/.#if
8640: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 48   SQLITE_ENABLE_H
8650: 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a 76 6f  IDDEN_COLUMNS.vo
8660: 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  id sqlite3Column
8670: 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61  PropertiesFromNa
8680: 6d 65 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  me(Table *pTab, 
8690: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 20  Column *pCol){. 
86a0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
86b0: 6e 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  nicmp(pCol->zNam
86c0: 65 2c 20 22 5f 5f 68 69 64 64 65 6e 5f 5f 22 2c  e, "__hidden__",
86d0: 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70   10)==0 ){.    p
86e0: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col->colFlags |=
86f0: 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 3b   COLFLAG_HIDDEN;
8700: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61  .  }else if( pTa
8710: 62 20 26 26 20 70 43 6f 6c 21 3d 70 54 61 62 2d  b && pCol!=pTab-
8720: 3e 61 43 6f 6c 20 26 26 20 28 70 43 6f 6c 5b 2d  >aCol && (pCol[-
8730: 31 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f  1].colFlags & CO
8740: 4c 46 4c 41 47 5f 48 49 44 44 45 4e 29 20 29 7b  LFLAG_HIDDEN) ){
8750: 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
8760: 61 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48 69 64  ags |= TF_OOOHid
8770: 64 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  den;.  }.}.#endi
8780: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  f.../*.** Add a 
8790: 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68  new column to th
87a0: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
87b0: 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
87c0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
87d0: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
87e0: 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f   routine once fo
87f0: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65  r each column de
8800: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  claration.** in 
8810: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
8820: 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74  tatement.  sqlit
8830: 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20 67  e3StartTable() g
8840: 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69  ets called.** fi
8850: 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67  rst to get thing
8860: 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74  s going.  Then t
8870: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
8880: 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a  alled for each.*
8890: 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69  * column..*/.voi
88a0: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
88b0: 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mn(Parse *pParse
88c0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20  , Token *pName, 
88d0: 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20  Token *pType){. 
88e0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
88f0: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   i;.  char *z;. 
8900: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20   char *zType;.  
8910: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
8920: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8930: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
8940: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
8950: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
8960: 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 43  urn;.  if( p->nC
8970: 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  ol+1>db->aLimit[
8980: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
8990: 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  UMN] ){.    sqli
89a0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
89b0: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
89c0: 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d  lumns on %s", p-
89d0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
89e0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73  urn;.  }.  z = s
89f0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
8a00: 77 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e 20 2b  w(db, pName->n +
8a10: 20 70 54 79 70 65 2d 3e 6e 20 2b 20 32 29 3b 0a   pType->n + 2);.
8a20: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
8a30: 75 72 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c  urn;.  memcpy(z,
8a40: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
8a50: 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 4e 61 6d 65 2d  ->n);.  z[pName-
8a60: 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >n] = 0;.  sqlit
8a70: 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20  e3Dequote(z);.  
8a80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
8a90: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
8aa0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
8ab0: 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  p(z, p->aCol[i].
8ac0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
8ad0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8ae0: 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c  sg(pParse, "dupl
8af0: 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  icate column nam
8b00: 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  e: %s", z);.    
8b10: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8b20: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65  db, z);.      re
8b30: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
8b40: 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26    if( (p->nCol &
8b50: 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   0x7)==0 ){.    
8b60: 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20  Column *aNew;.  
8b70: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    aNew = sqlite3
8b80: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e  DbRealloc(db,p->
8b90: 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29  aCol,(p->nCol+8)
8ba0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b  *sizeof(p->aCol[
8bb0: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  0]));.    if( aN
8bc0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
8bd0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8be0: 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   z);.      retur
8bf0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  n;.    }.    p->
8c00: 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d  aCol = aNew;.  }
8c10: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
8c20: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d  ol[p->nCol];.  m
8c30: 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73  emset(pCol, 0, s
8c40: 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d  izeof(p->aCol[0]
8c50: 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  ));.  pCol->zNam
8c60: 65 20 3d 20 7a 3b 0a 20 20 73 71 6c 69 74 65 33  e = z;.  sqlite3
8c70: 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73  ColumnProperties
8c80: 46 72 6f 6d 4e 61 6d 65 28 70 2c 20 70 43 6f 6c  FromName(p, pCol
8c90: 29 3b 0a 20 0a 20 20 69 66 28 20 70 54 79 70 65  );. .  if( pType
8ca0: 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ->n==0 ){.    /*
8cb0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
8cc0: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
8cd0: 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65  columns have the
8ce0: 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74   default affinit
8cf0: 79 0a 20 20 20 20 2a 2a 20 27 42 4c 4f 42 27 2e  y.    ** 'BLOB'.
8d00: 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66   */.    pCol->af
8d10: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
8d20: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43  AFF_BLOB;.    pC
8d30: 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 31 3b 0a 20  ol->szEst = 1;. 
8d40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54 79 70   }else{.    zTyp
8d50: 65 20 3d 20 7a 20 2b 20 73 71 6c 69 74 65 33 53  e = z + sqlite3S
8d60: 74 72 6c 65 6e 33 30 28 7a 29 20 2b 20 31 3b 0a  trlen30(z) + 1;.
8d70: 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65      memcpy(zType
8d80: 2c 20 70 54 79 70 65 2d 3e 7a 2c 20 70 54 79 70  , pType->z, pTyp
8d90: 65 2d 3e 6e 29 3b 0a 20 20 20 20 7a 54 79 70 65  e->n);.    zType
8da0: 5b 70 54 79 70 65 2d 3e 6e 5d 20 3d 20 30 3b 0a  [pType->n] = 0;.
8db0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
8dc0: 74 65 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 70  te(zType);.    p
8dd0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
8de0: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
8df0: 79 70 65 28 7a 54 79 70 65 2c 20 26 70 43 6f 6c  ype(zType, &pCol
8e00: 2d 3e 73 7a 45 73 74 29 3b 0a 20 20 20 20 70 43  ->szEst);.    pC
8e10: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol->colFlags |= 
8e20: 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b  COLFLAG_HASTYPE;
8e30: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b  .  }.  p->nCol++
8e40: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73  ;.  pParse->cons
8e50: 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30  traintName.n = 0
8e60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
8e70: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8e80: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
8e90: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
8ea0: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
8eb0: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
8ec0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22   statement.  A "
8ed0: 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  NOT NULL" constr
8ee0: 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e  aint has.** been
8ef0: 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d   seen on a colum
8f00: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
8f10: 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c   sets the notNul
8f20: 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65  l flag on.** the
8f30: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
8f40: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
8f50: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
8f60: 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28  lite3AddNotNull(
8f70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
8f80: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54  nt onError){.  T
8f90: 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d  able *p;.  Colum
8fa0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 70 20 3d 20 70  n *pCol;.  p = p
8fb0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
8fc0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
8fd0: 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29  NEVER(p->nCol<1)
8fe0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f   ) return;.  pCo
8ff0: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
9000: 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 70 43 6f 6c 2d  nCol-1];.  pCol-
9010: 3e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f  >notNull = (u8)o
9020: 6e 45 72 72 6f 72 3b 0a 20 20 70 2d 3e 74 61 62  nError;.  p->tab
9030: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 4e  Flags |= TF_HasN
9040: 6f 74 4e 75 6c 6c 3b 0a 0a 20 20 2f 2a 20 53 65  otNull;..  /* Se
9050: 74 20 74 68 65 20 75 6e 69 71 4e 6f 74 4e 75 6c  t the uniqNotNul
9060: 6c 20 66 6c 61 67 20 6f 6e 20 61 6e 79 20 55 4e  l flag on any UN
9070: 49 51 55 45 20 6f 72 20 50 4b 20 69 6e 64 65 78  IQUE or PK index
9080: 65 73 20 61 6c 72 65 61 64 79 20 63 72 65 61 74  es already creat
9090: 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  ed.  ** on this 
90a0: 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20 69 66  column.  */.  if
90b0: 28 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73  ( pCol->colFlags
90c0: 20 26 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55   & COLFLAG_UNIQU
90d0: 45 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  E ){.    Index *
90e0: 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
90f0: 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49  dx=p->pIndex; pI
9100: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
9110: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
9120: 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43  ert( pIdx->nKeyC
9130: 6f 6c 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f  ol==1 && pIdx->o
9140: 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
9150: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
9160: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
9170: 70 2d 3e 6e 43 6f 6c 2d 31 20 29 7b 0a 20 20 20  p->nCol-1 ){.   
9180: 20 20 20 20 20 70 49 64 78 2d 3e 75 6e 69 71 4e       pIdx->uniqN
9190: 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20  otNull = 1;.    
91a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
91b0: 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20  ./*.** Scan the 
91c0: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65  column type name
91d0: 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e   zType (length n
91e0: 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e  Type) and return
91f0: 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   the.** associat
9200: 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65  ed affinity type
9210: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
9220: 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65  tine does a case
9230: 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61  -independent sea
9240: 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72  rch of zType for
9250: 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69   the .** substri
9260: 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ngs in the follo
9270: 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f  wing table. If o
9280: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
9290: 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64  ings is.** found
92a0: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
92b0: 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20  ing affinity is 
92c0: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79  returned. If zTy
92d0: 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d  pe contains.** m
92e0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20  ore than one of 
92f0: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20  the substrings, 
9300: 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74  entries toward t
9310: 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68  he top of .** th
9320: 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69  e table take pri
9330: 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70  ority. For examp
9340: 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20  le, if zType is 
9350: 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53  'BLOBINT', .** S
9360: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
9370: 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  R is returned..*
9380: 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20  *.** Substring  
9390: 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a     | Affinity.**
93a0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
93b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93c0: 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20  -.** 'INT'      
93d0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
93e0: 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52  INTEGER.** 'CHAR
93f0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
9400: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43  E_AFF_TEXT.** 'C
9410: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
9420: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
9430: 20 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c   'TEXT'        |
9440: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
9450: 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20  .** 'BLOB'      
9460: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42    | SQLITE_AFF_B
9470: 4c 4f 42 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20  LOB.** 'REAL'   
9480: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
9490: 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27  F_REAL.** 'FLOA'
94a0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
94b0: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f  _AFF_REAL.** 'DO
94c0: 55 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  UB'        | SQL
94d0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a  ITE_AFF_REAL.**.
94e0: 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  ** If none of th
94f0: 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20  e substrings in 
9500: 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20  the above table 
9510: 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51  are found,.** SQ
9520: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
9530: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
9540: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66  .char sqlite3Aff
9550: 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20  inityType(const 
9560: 63 68 61 72 20 2a 7a 49 6e 2c 20 75 38 20 2a 70  char *zIn, u8 *p
9570: 73 7a 45 73 74 29 7b 0a 20 20 75 33 32 20 68 20  szEst){.  u32 h 
9580: 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20  = 0;.  char aff 
9590: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  = SQLITE_AFF_NUM
95a0: 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ERIC;.  const ch
95b0: 61 72 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a 0a  ar *zChar = 0;..
95c0: 20 20 61 73 73 65 72 74 28 20 7a 49 6e 21 3d 30    assert( zIn!=0
95d0: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e   );.  while( zIn
95e0: 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28  [0] ){.    h = (
95f0: 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55  h<<8) + sqlite3U
9600: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49  pperToLower[(*zI
9610: 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49  n)&0xff];.    zI
9620: 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d  n++;.    if( h==
9630: 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c  (('c'<<24)+('h'<
9640: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72  <16)+('a'<<8)+'r
9650: 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  ') ){           
9660: 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20    /* CHAR */.   
9670: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
9680: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  AFF_TEXT;.      
9690: 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20  zChar = zIn;.   
96a0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
96b0: 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'c'<<24)+('l'<<1
96c0: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29  6)+('o'<<8)+'b')
96d0: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f   ){       /* CLO
96e0: 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  B */.      aff =
96f0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
9700: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9710: 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27  h==(('t'<<24)+('
9720: 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29  e'<<16)+('x'<<8)
9730: 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'t') ){       /
9740: 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20  * TEXT */.      
9750: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
9760: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
9770: 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32   if( h==(('b'<<2
9780: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
9790: 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20  '<<8)+'b')      
97a0: 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20      /* BLOB */. 
97b0: 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d         && (aff==
97c0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
97d0: 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  IC || aff==SQLIT
97e0: 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20  E_AFF_REAL) ){. 
97f0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9800: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
9810: 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28    if( zIn[0]=='(
9820: 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b  ' ) zChar = zIn;
9830: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9840: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
9850: 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  INT.    }else if
9860: 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b  ( h==(('r'<<24)+
9870: 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('e'<<16)+('a'<<
9880: 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20  8)+'l')         
9890: 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20   /* REAL */.    
98a0: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
98b0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
98c0: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
98d0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
98e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
98f0: 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('f'<<24)+('l'<
9900: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61  <16)+('o'<<8)+'a
9910: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ')          /* F
9920: 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  LOA */.        &
9930: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
9940: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
9950: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
9960: 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65  AFF_REAL;.    }e
9970: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27  lse if( h==(('d'
9980: 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b  <<24)+('o'<<16)+
9990: 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20  ('u'<<8)+'b')   
99a0: 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a         /* DOUB *
99b0: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
99c0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
99d0: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
99e0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
99f0: 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EAL;.#endif.    
9a00: 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78 30  }else if( (h&0x0
9a10: 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c  0FFFFFF)==(('i'<
9a20: 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74  <16)+('n'<<8)+'t
9a30: 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20  ') ){    /* INT 
9a40: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
9a50: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
9a60: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
9a70: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9a80: 49 66 20 70 73 7a 45 73 74 20 69 73 20 6e 6f 74  If pszEst is not
9a90: 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20   NULL, store an 
9aa0: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
9ab0: 66 69 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65  field size.  The
9ac0: 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69  .  ** estimate i
9ad0: 73 20 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74  s scaled so that
9ae0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20   the size of an 
9af0: 69 6e 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a  integer is 1.  *
9b00: 2f 0a 20 20 69 66 28 20 70 73 7a 45 73 74 20 29  /.  if( pszEst )
9b10: 7b 0a 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20  {.    *pszEst = 
9b20: 31 3b 20 20 20 2f 2a 20 64 65 66 61 75 6c 74 20  1;   /* default 
9b30: 73 69 7a 65 20 69 73 20 61 70 70 72 6f 78 20 34  size is approx 4
9b40: 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 66   bytes */.    if
9b50: 28 20 61 66 66 3c 53 51 4c 49 54 45 5f 41 46 46  ( aff<SQLITE_AFF
9b60: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
9b70: 20 20 69 66 28 20 7a 43 68 61 72 20 29 7b 0a 20    if( zChar ){. 
9b80: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 43         while( zC
9b90: 68 61 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  har[0] ){.      
9ba0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
9bb0: 73 64 69 67 69 74 28 7a 43 68 61 72 5b 30 5d 29  sdigit(zChar[0])
9bc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9bd0: 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 20 20 20  int v = 0;.     
9be0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65         sqlite3Ge
9bf0: 74 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76  tInt32(zChar, &v
9c00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  );.            v
9c10: 20 3d 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20   = v/4 + 1;.    
9c20: 20 20 20 20 20 20 20 20 69 66 28 20 76 3e 32 35          if( v>25
9c30: 35 20 29 20 76 20 3d 20 32 35 35 3b 0a 20 20 20  5 ) v = 255;.   
9c40: 20 20 20 20 20 20 20 20 20 2a 70 73 7a 45 73 74           *pszEst
9c50: 20 3d 20 76 3b 20 2f 2a 20 42 4c 4f 42 28 6b 29   = v; /* BLOB(k)
9c60: 2c 20 56 41 52 43 48 41 52 28 6b 29 2c 20 43 48  , VARCHAR(k), CH
9c70: 41 52 28 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34 2b  AR(k) -> r=(k/4+
9c80: 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  1) */.          
9c90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
9ca0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a     }.          z
9cb0: 43 68 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Char++;.        
9cc0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
9cd0: 20 20 20 20 20 20 20 2a 70 73 7a 45 73 74 20 3d         *pszEst =
9ce0: 20 35 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c 20 54   5;   /* BLOB, T
9cf0: 45 58 54 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d 35  EXT, CLOB -> r=5
9d00: 20 20 28 61 70 70 72 6f 78 20 32 30 20 62 79 74    (approx 20 byt
9d10: 65 73 29 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  es)*/.      }.  
9d20: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
9d30: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   aff;.}../*.** T
9d40: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
9d50: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
9d60: 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  ue for the most 
9d70: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63  recently added c
9d80: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  olumn.** of the 
9d90: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
9da0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
9db0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c  on..**.** Defaul
9dc0: 74 20 76 61 6c 75 65 20 65 78 70 72 65 73 73 69  t value expressi
9dd0: 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73  ons must be cons
9de0: 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20  tant.  Raise an 
9df0: 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69  exception if thi
9e00: 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20  s.** is not the 
9e10: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  case..**.** This
9e20: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
9e30: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
9e40: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
9e50: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
9e60: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
9e70: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  E statement..*/.
9e80: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 44  void sqlite3AddD
9e90: 65 66 61 75 6c 74 56 61 6c 75 65 28 0a 20 20 50  efaultValue(.  P
9ea0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
9eb0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
9ec0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
9ed0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
9ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9ef0: 70 61 72 73 65 64 20 65 78 70 72 65 73 73 69 6f  parsed expressio
9f00: 6e 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  n of the default
9f10: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 63 6f 6e 73   value */.  cons
9f20: 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74 2c 20  t char *zStart, 
9f30: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
9f40: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
9f50: 75 65 20 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e  ue text */.  con
9f60: 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 20 20 20  st char *zEnd   
9f70: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63        /* First c
9f80: 68 61 72 61 63 74 65 72 20 70 61 73 74 20 65 6e  haracter past en
9f90: 64 20 6f 66 20 64 65 66 61 75 74 20 76 61 6c 75  d of defaut valu
9fa0: 65 20 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 54  e text */.){.  T
9fb0: 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d  able *p;.  Colum
9fc0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74  n *pCol;.  sqlit
9fd0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
9fe0: 3e 64 62 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  >db;.  p = pPars
9ff0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
a000: 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20  if( p!=0 ){.    
a010: 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c  pCol = &(p->aCol
a020: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20  [p->nCol-1]);.  
a030: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
a040: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
a050: 6e 63 74 69 6f 6e 28 70 45 78 70 72 2c 20 64 62  nction(pExpr, db
a060: 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a  ->init.busy) ){.
a070: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
a080: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
a090: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20  efault value of 
a0a0: 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e  column [%s] is n
a0b0: 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20  ot constant",.  
a0c0: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e          pCol->zN
a0d0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
a0e0: 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  .      /* A copy
a0f0: 20 6f 66 20 70 45 78 70 72 20 69 73 20 75 73 65   of pExpr is use
a100: 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  d instead of the
a110: 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 45   original, as pE
a120: 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20  xpr contains.   
a130: 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61     ** tokens tha
a140: 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74  t point to volat
a150: 69 6c 65 20 6d 65 6d 6f 72 79 2e 09 0a 20 20 20  ile memory...   
a160: 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72     */.      Expr
a170: 20 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   x;.      sqlite
a180: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
a190: 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20  pCol->pDflt);.  
a1a0: 20 20 20 20 6d 65 6d 73 65 74 28 26 78 2c 20 30      memset(&x, 0
a1b0: 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
a1c0: 20 20 20 20 78 2e 6f 70 20 3d 20 54 4b 5f 53 50      x.op = TK_SP
a1d0: 41 4e 3b 0a 20 20 20 20 20 20 78 2e 75 2e 7a 54  AN;.      x.u.zT
a1e0: 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  oken = sqlite3Db
a1f0: 53 70 61 6e 44 75 70 28 64 62 2c 20 7a 53 74 61  SpanDup(db, zSta
a200: 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 20 20 20  rt, zEnd);.     
a210: 20 78 2e 70 4c 65 66 74 20 3d 20 70 45 78 70 72   x.pLeft = pExpr
a220: 3b 0a 20 20 20 20 20 20 78 2e 66 6c 61 67 73 20  ;.      x.flags 
a230: 3d 20 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20  = EP_Skip;.     
a240: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73   pCol->pDflt = s
a250: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
a260: 2c 20 26 78 2c 20 45 58 50 52 44 55 50 5f 52 45  , &x, EXPRDUP_RE
a270: 44 55 43 45 29 3b 0a 20 20 20 20 20 20 73 71 6c  DUCE);.      sql
a280: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 78  ite3DbFree(db, x
a290: 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  .u.zToken);.    
a2a0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  }.  }.  sqlite3E
a2b0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
a2c0: 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  xpr);.}../*.** B
a2d0: 61 63 6b 77 61 72 64 73 20 43 6f 6d 70 61 74 69  ackwards Compati
a2e0: 62 69 6c 69 74 79 20 48 61 63 6b 3a 0a 2a 2a 20  bility Hack:.** 
a2f0: 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 20 76  .** Historical v
a300: 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
a310: 65 20 61 63 63 65 70 74 65 64 20 73 74 72 69 6e  e accepted strin
a320: 67 73 20 61 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d  gs as column nam
a330: 65 73 20 69 6e 0a 2a 2a 20 69 6e 64 65 78 65 73  es in.** indexes
a340: 20 61 6e 64 20 50 52 49 4d 41 52 59 20 4b 45 59   and PRIMARY KEY
a350: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e 64   constraints and
a360: 20 69 6e 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   in UNIQUE const
a370: 72 61 69 6e 74 73 2e 20 20 45 78 61 6d 70 6c 65  raints.  Example
a380: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41  :.**.**     CREA
a390: 54 45 20 54 41 42 4c 45 20 78 79 7a 28 61 2c 62  TE TABLE xyz(a,b
a3a0: 2c 63 2c 64 2c 65 2c 50 52 49 4d 41 52 59 20 4b  ,c,d,e,PRIMARY K
a3b0: 45 59 28 27 61 27 29 2c 55 4e 49 51 55 45 28 27  EY('a'),UNIQUE('
a3c0: 62 27 2c 27 63 27 20 43 4f 4c 4c 41 54 45 20 74  b','c' COLLATE t
a3d0: 72 69 6d 29 0a 2a 2a 20 20 20 20 20 43 52 45 41  rim).**     CREA
a3e0: 54 45 20 49 4e 44 45 58 20 61 62 63 20 4f 4e 20  TE INDEX abc ON 
a3f0: 78 79 7a 28 27 63 27 2c 27 64 27 20 44 45 53 43  xyz('c','d' DESC
a400: 2c 27 65 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  ,'e' COLLATE noc
a410: 61 73 65 20 44 45 53 43 29 3b 0a 2a 2a 0a 2a 2a  ase DESC);.**.**
a420: 20 54 68 69 73 20 69 73 20 67 6f 6f 66 79 2e 20   This is goofy. 
a430: 20 42 75 74 20 74 6f 20 70 72 65 73 65 72 76 65   But to preserve
a440: 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
a450: 74 69 62 69 6c 69 74 79 20 77 65 20 63 6f 6e 74  tibility we cont
a460: 69 6e 75 65 20 74 6f 0a 2a 2a 20 61 63 63 65 70  inue to.** accep
a470: 74 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  t it.  This rout
a480: 69 6e 65 20 64 6f 65 73 20 74 68 65 20 6e 65 63  ine does the nec
a490: 65 73 73 61 72 79 20 63 6f 6e 76 65 72 73 69 6f  essary conversio
a4a0: 6e 2e 20 20 49 74 20 63 6f 6e 76 65 72 74 73 0a  n.  It converts.
a4b0: 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
a4c0: 6e 20 67 69 76 65 6e 20 69 6e 20 69 74 73 20 61  n given in its a
a4d0: 72 67 75 6d 65 6e 74 20 66 72 6f 6d 20 61 20 54  rgument from a T
a4e0: 4b 5f 53 54 52 49 4e 47 20 69 6e 74 6f 20 61 20  K_STRING into a 
a4f0: 54 4b 5f 49 44 0a 2a 2a 20 69 66 20 74 68 65 20  TK_ID.** if the 
a500: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6a 75  expression is ju
a510: 73 74 20 61 20 54 4b 5f 53 54 52 49 4e 47 20 77  st a TK_STRING w
a520: 69 74 68 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  ith an optional 
a530: 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 2e 0a  COLLATE clause..
a540: 2a 2a 20 49 66 20 74 68 65 20 65 70 78 72 65 73  ** If the epxres
a550: 73 69 6f 6e 20 69 73 20 61 6e 79 74 68 69 6e 67  sion is anything
a560: 20 6f 74 68 65 72 20 74 68 61 6e 20 54 4b 5f 53   other than TK_S
a570: 54 52 49 4e 47 2c 20 74 68 65 20 65 78 70 72 65  TRING, the expre
a580: 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 75 6e 63 68  ssion is.** unch
a590: 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  anged..*/.static
a5a0: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 72   void sqlite3Str
a5b0: 69 6e 67 54 6f 49 64 28 45 78 70 72 20 2a 70 29  ingToId(Expr *p)
a5c0: 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  {.  if( p->op==T
a5d0: 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20  K_STRING ){.    
a5e0: 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20  p->op = TK_ID;. 
a5f0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70   }else if( p->op
a600: 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20  ==TK_COLLATE && 
a610: 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  p->pLeft->op==TK
a620: 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 70  _STRING ){.    p
a630: 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20 3d 20 54 4b  ->pLeft->op = TK
a640: 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _ID;.  }.}../*.*
a650: 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20  * Designate the 
a660: 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20  PRIMARY KEY for 
a670: 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73  the table.  pLis
a680: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e  t is a list of n
a690: 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75  ames .** of colu
a6a0: 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68  mns that form th
a6b0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
a6c0: 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c  If pList is NULL
a6d0: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f  , then the.** mo
a6e0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
a6f0: 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  d column of the 
a700: 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69  table is the pri
a710: 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  mary key..**.** 
a720: 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65  A table can have
a730: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69   at most one pri
a740: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68  mary key.  If th
a750: 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
a760: 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79  has.** a primary
a770: 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69   key (and this i
a780: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69  s the second pri
a790: 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63  mary key) then c
a7a0: 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  reate an.** erro
a7b0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
a7c0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f  PRIMARY KEY is o
a7d0: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  n a single colum
a7e0: 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65  n whose datatype
a7f0: 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20   is INTEGER,.** 
a800: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79  then we will try
a810: 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c   to use that col
a820: 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64  umn as the rowid
a830: 2e 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65  .  Set the Table
a840: 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20  .iPKey.** field 
a850: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  of the table und
a860: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
a870: 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20  to be the index 
a880: 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  of the.** INTEGE
a890: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
a8a0: 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b  lumn.  Table.iPK
a8b0: 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20  ey is set to -1 
a8c0: 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  if there is.** n
a8d0: 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  o INTEGER PRIMAR
a8e0: 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Y KEY..**.** If 
a8f0: 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61  the key is not a
a900: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
a910: 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61  Y KEY, then crea
a920: 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69  te a unique.** i
a930: 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79  ndex for the key
a940: 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63  .  No index is c
a950: 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47  reated for INTEG
a960: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e  ER PRIMARY KEYs.
a970: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a980: 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20  AddPrimaryKey(. 
a990: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
a9a0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
a9b0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
a9c0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20  ist *pList,  /* 
a9d0: 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61  List of field na
a9e0: 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mes to be indexe
a9f0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
aa00: 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74  or,      /* What
aa10: 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e   to do with a un
aa20: 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63  iqueness conflic
aa30: 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49  t */.  int autoI
aa40: 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  nc,      /* True
aa50: 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52   if the AUTOINCR
aa60: 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73  EMENT keyword is
aa70: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
aa80: 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20 20  t sortOrder     
aa90: 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  /* SQLITE_SO_ASC
aaa0: 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45   or SQLITE_SO_DE
aab0: 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  SC */.){.  Table
aac0: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
aad0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 43 6f  >pNewTable;.  Co
aae0: 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a  lumn *pCol = 0;.
aaf0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c    int iCol = -1,
ab00: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   i;.  int nTerm;
ab10: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
ab20: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
ab30: 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54  y_exit;.  if( pT
ab40: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
ab50: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20  F_HasPrimaryKey 
ab60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
ab70: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
ab80: 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25        "table \"%
ab90: 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61  s\" has more tha
aba0: 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  n one primary ke
abb0: 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  y", pTab->zName)
abc0: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61  ;.    goto prima
abd0: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d  ry_key_exit;.  }
abe0: 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  .  pTab->tabFlag
abf0: 73 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61  s |= TF_HasPrima
ac00: 72 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69  ryKey;.  if( pLi
ac10: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f  st==0 ){.    iCo
ac20: 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d  l = pTab->nCol -
ac30: 20 31 3b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26   1;.    pCol = &
ac40: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
ac50: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46  ;.    pCol->colF
ac60: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
ac70: 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 6e 54 65  PRIMKEY;.    nTe
ac80: 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  rm = 1;.  }else{
ac90: 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 70 4c 69  .    nTerm = pLi
aca0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66  st->nExpr;.    f
acb0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b  or(i=0; i<nTerm;
acc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
acd0: 72 20 2a 70 43 45 78 70 72 20 3d 20 73 71 6c 69  r *pCExpr = sqli
ace0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
acf0: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
ad00: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 61 73 73  Expr);.      ass
ad10: 65 72 74 28 20 70 43 45 78 70 72 21 3d 30 20 29  ert( pCExpr!=0 )
ad20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
ad30: 74 72 69 6e 67 54 6f 49 64 28 70 43 45 78 70 72  tringToId(pCExpr
ad40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 45  );.      if( pCE
ad50: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
ad60: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
ad70: 63 68 61 72 20 2a 7a 43 4e 61 6d 65 20 3d 20 70  char *zCName = p
ad80: 43 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  CExpr->u.zToken;
ad90: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f  .        for(iCo
ada0: 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
adb0: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
adc0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
add0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 4e 61  ite3StrICmp(zCNa
ade0: 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  me, pTab->aCol[i
adf0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  Col].zName)==0 )
ae00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
ae10: 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c  ol = &pTab->aCol
ae20: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20  [iCol];.        
ae30: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
ae40: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52  gs |= COLFLAG_PR
ae50: 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 20  IMKEY;.         
ae60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ae70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
ae80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ae90: 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 31  }.  if( nTerm==1
aea0: 0a 20 20 20 26 26 20 70 43 6f 6c 0a 20 20 20 26  .   && pCol.   &
aeb0: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
aec0: 28 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79  (sqlite3ColumnTy
aed0: 70 65 28 70 43 6f 6c 2c 22 22 29 2c 20 22 49 4e  pe(pCol,""), "IN
aee0: 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 26 26  TEGER")==0.   &&
aef0: 20 73 6f 72 74 4f 72 64 65 72 21 3d 53 51 4c 49   sortOrder!=SQLI
af00: 54 45 5f 53 4f 5f 44 45 53 43 0a 20 20 29 7b 0a  TE_SO_DESC.  ){.
af10: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
af20: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62  = iCol;.    pTab
af30: 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29  ->keyConf = (u8)
af40: 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73  onError;.    ass
af50: 65 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20  ert( autoInc==0 
af60: 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b  || autoInc==1 );
af70: 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
af80: 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54  ags |= autoInc*T
af90: 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b  F_Autoincrement;
afa0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29  .    if( pList )
afb0: 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74   pParse->iPkSort
afc0: 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 2d 3e 61  Order = pList->a
afd0: 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [0].sortOrder;. 
afe0: 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49   }else if( autoI
aff0: 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  nc ){.#ifndef SQ
b000: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
b010: 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69  CREMENT.    sqli
b020: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
b030: 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45  se, "AUTOINCREME
b040: 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77  NT is only allow
b050: 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20  ed on an ".     
b060: 20 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41    "INTEGER PRIMA
b070: 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66  RY KEY");.#endif
b080: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
b090: 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
b0a0: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30  (pParse, 0, 0, 0
b0b0: 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72  , pList, onError
b0c0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0e0: 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 2c  0, sortOrder, 0,
b0f0: 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f   SQLITE_IDXTYPE_
b100: 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20  PRIMARYKEY);.   
b110: 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a   pList = 0;.  }.
b120: 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69  .primary_key_exi
b130: 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  t:.  sqlite3Expr
b140: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
b150: 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  e->db, pList);. 
b160: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
b170: 2a 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43  * Add a new CHEC
b180: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20  K constraint to 
b190: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
b1a0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
b1b0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
b1c0: 73 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43  sqlite3AddCheckC
b1d0: 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
b1e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
b1f0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
b200: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68  t */.  Expr *pCh
b210: 65 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20  eckExpr  /* The 
b220: 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e  check expression
b230: 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
b240: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
b250: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
b260: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
b270: 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  le;.  sqlite3 *d
b280: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
b290: 20 20 69 66 28 20 70 54 61 62 20 26 26 20 21 49    if( pTab && !I
b2a0: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 0a 20  N_DECLARE_VTAB. 
b2b0: 20 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72    && !sqlite3Btr
b2c0: 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 64 62 2d  eeIsReadonly(db-
b2d0: 3e 61 44 62 5b 64 62 2d 3e 69 6e 69 74 2e 69 44  >aDb[db->init.iD
b2e0: 62 5d 2e 70 42 74 29 0a 20 20 29 7b 0a 20 20 20  b].pBt).  ){.   
b2f0: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20   pTab->pCheck = 
b300: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
b310: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 54  ppend(pParse, pT
b320: 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65  ab->pCheck, pChe
b330: 63 6b 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  ckExpr);.    if(
b340: 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61   pParse->constra
b350: 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20  intName.n ){.   
b360: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
b370: 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65  stSetName(pParse
b380: 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20  , pTab->pCheck, 
b390: 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61  &pParse->constra
b3a0: 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20  intName, 1);.   
b3b0: 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
b3c0: 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  f.  {.    sqlite
b3d0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
b3e0: 73 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b 45 78  se->db, pCheckEx
b3f0: 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  pr);.  }.}../*.*
b400: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
b410: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20  ion function of 
b420: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
b430: 79 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63  y parsed table c
b440: 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  olumn.** to the 
b450: 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a  CollSeq given..*
b460: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
b470: 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72  dCollateType(Par
b480: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
b490: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61  n *pToken){.  Ta
b4a0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
b4b0: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20  .  char *zColl; 
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b4d0: 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66  Dequoted name of
b4e0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
b4f0: 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nce */.  sqlite3
b500: 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20   *db;..  if( (p 
b510: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
b520: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
b530: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
b540: 31 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  1;.  db = pParse
b550: 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20  ->db;.  zColl = 
b560: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
b570: 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29  oken(db, pToken)
b580: 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29  ;.  if( !zColl )
b590: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
b5a0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
b5b0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
b5c0: 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ll) ){.    Index
b5d0: 20 2a 70 49 64 78 3b 0a 20 20 20 20 73 71 6c 69   *pIdx;.    sqli
b5e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
b5f0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b  >aCol[i].zColl);
b600: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  .    p->aCol[i].
b610: 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20  zColl = zColl;. 
b620: 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
b630: 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72  column is declar
b640: 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52  ed as "<name> PR
b650: 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54  IMARY KEY COLLAT
b660: 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a  E <type>",.    *
b670: 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20  * then an index 
b680: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72  may have been cr
b690: 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f  eated on this co
b6a0: 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a  lumn before the.
b6b0: 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e      ** collation
b6c0: 20 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e   type was added.
b6d0: 20 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66   Correct this if
b6e0: 20 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e   it is the case.
b6f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
b700: 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20  pIdx=p->pIndex; 
b710: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
b720: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
b730: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65  ssert( pIdx->nKe
b740: 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20  yCol==1 );.     
b750: 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
b760: 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20  umn[0]==i ){.   
b770: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
b780: 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69  l[0] = p->aCol[i
b790: 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  ].zColl;.      }
b7a0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
b7b0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
b7c0: 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  e(db, zColl);.  
b7d0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
b7e0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
b7f0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
b800: 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61  equence for data
b810: 62 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74  base native text
b820: 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65  .** encoding ide
b830: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73  ntified by the s
b840: 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e  tring zName, len
b850: 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  gth nName..**.**
b860: 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
b870: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
b880: 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69  ence is not avai
b890: 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76  lable, or not av
b8a0: 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68  ailable.** in th
b8b0: 65 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  e database nativ
b8c0: 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20  e encoding, the 
b8d0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
b8e0: 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a  y is invoked to.
b8f0: 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49  ** request it. I
b900: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  f the collation 
b910: 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74  factory does not
b920: 20 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73   supply such a s
b930: 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20  equence,.** and 
b940: 74 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20  the sequence is 
b950: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f  available in ano
b960: 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69  ther text encodi
b970: 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73  ng, then that is
b980: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73  .** returned ins
b990: 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  tead..**.** If n
b9a0: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
b9b0: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
b9c0: 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20  ations sequence 
b9d0: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  are available, o
b9e0: 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72  r.** another err
b9f0: 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
ba00: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
ba10: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
ba20: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
ba30: 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54   pParse..**.** T
ba40: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
ba50: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
ba60: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
ba70: 65 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74  eq().  This rout
ba80: 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74  ine.** invokes t
ba90: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
baa0: 74 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d 65  tory if the name
bab0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e  d collation cann
bac0: 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61  ot be found.** a
bad0: 6e 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20  nd generates an 
bae0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
baf0: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73  *.** See also: s
bb00: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
bb10: 71 28 29 2c 20 73 71 6c 69 74 65 33 47 65 74 43  q(), sqlite3GetC
bb20: 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c  ollSeq().*/.Coll
bb30: 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  Seq *sqlite3Loca
bb40: 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  teCollSeq(Parse 
bb50: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
bb60: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73  har *zName){.  s
bb70: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
bb80: 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e  rse->db;.  u8 en
bb90: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75  c = ENC(db);.  u
bba0: 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d  8 initbusy = db-
bbb0: 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f  >init.busy;.  Co
bbc0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20  llSeq *pColl;.. 
bbd0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
bbe0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
bbf0: 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74  enc, zName, init
bc00: 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e  busy);.  if( !in
bc10: 69 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c  itbusy && (!pCol
bc20: 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d  l || !pColl->xCm
bc30: 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  p) ){.    pColl 
bc40: 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  = sqlite3GetColl
bc50: 53 65 71 28 70 50 61 72 73 65 2c 20 65 6e 63 2c  Seq(pParse, enc,
bc60: 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a   pColl, zName);.
bc70: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43    }..  return pC
bc80: 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  oll;.}.../*.** G
bc90: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
bca0: 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74  t will increment
bcb0: 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
bcc0: 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63  ie..**.** The sc
bcd0: 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75  hema cookie is u
bce0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
bcf0: 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
bd00: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61   for the.** data
bd10: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41  base changes.  A
bd20: 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61  fter each schema
bd30: 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f   change, the coo
bd40: 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61  kie value.** cha
bd50: 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72  nges.  When a pr
bd60: 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64  ocess first read
bd70: 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20  s the schema it 
bd80: 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63  records the.** c
bd90: 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74  ookie.  Thereaft
bda0: 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20  er, whenever it 
bdb0: 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74  goes to access t
bdc0: 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20  he database,.** 
bdd0: 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f  it checks the co
bde0: 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  okie to make sur
bdf0: 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73  e the schema has
be00: 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20   not changed.** 
be10: 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73  since it was las
be20: 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  t read..**.** Th
be30: 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63  is plan is not c
be40: 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74  ompletely bullet
be50: 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70  -proof.  It is p
be60: 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74  ossible for.** t
be70: 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61  he schema to cha
be80: 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  nge multiple tim
be90: 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63  es and for the c
bea0: 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73  ookie to be.** s
beb0: 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72  et back to prior
bec0: 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68   value.  But sch
bed0: 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20  ema changes are 
bee0: 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e  infrequent.** an
bef0: 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  d the probabilit
bf00: 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65  y of hitting the
bf10: 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c   same cookie val
bf20: 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20  ue is only.** 1 
bf30: 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20  chance in 2^32. 
bf40: 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65   So we're safe e
bf50: 6e 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50  nough..**.** IMP
bf60: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
bf70: 52 2d 33 34 32 33 30 2d 35 36 30 34 39 20 53 51  R-34230-56049 SQ
bf80: 4c 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  Lite automatical
bf90: 6c 79 20 69 6e 63 72 65 6d 65 6e 74 73 0a 2a 2a  ly increments.**
bfa0: 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73   the schema-vers
bfb0: 69 6f 6e 20 77 68 65 6e 65 76 65 72 20 74 68 65  ion whenever the
bfc0: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 2e   schema changes.
bfd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
bfe0: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72  ChangeCookie(Par
bff0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
c000: 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  iDb){.  sqlite3 
c010: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c020: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
c030: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
c040: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
c050: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
c060: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 73  , iDb, 0) );.  s
c070: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
c080: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
c090: 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 53 43 48  , iDb, BTREE_SCH
c0a0: 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 0a 20 20  EMA_VERSION, .  
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0c0: 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70    db->aDb[iDb].p
c0d0: 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
c0e0: 6f 6f 6b 69 65 2b 31 29 3b 0a 7d 0a 0a 2f 2a 0a  ookie+1);.}../*.
c0f0: 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e  ** Measure the n
c100: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
c110: 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75  ers needed to ou
c120: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a  tput the given.*
c130: 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54  * identifier.  T
c140: 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
c150: 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20  ed includes any 
c160: 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62  quotes used.** b
c170: 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c  ut does not incl
c180: 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72  ude the null ter
c190: 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  minator..**.** T
c1a0: 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 63  he estimate is c
c1b0: 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49 74  onservative.  It
c1c0: 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72   might be larger
c1d0: 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a   that what is.**
c1e0: 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a   really needed..
c1f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64  */.static int id
c200: 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20  entLength(const 
c210: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
c220: 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a  n;.  for(n=0; *z
c230: 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20  ; n++, z++){.   
c240: 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20   if( *z=='"' ){ 
c250: 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74  n++; }.  }.  ret
c260: 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a  urn n + 2;.}../*
c270: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61  .** The first pa
c280: 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
c290: 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70 75  nter to an outpu
c2a0: 74 20 62 75 66 66 65 72 2e 20 54 68 65 20 73 65  t buffer. The se
c2b0: 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74  cond .** paramet
c2c0: 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
c2d0: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68  to an integer th
c2e0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
c2f0: 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77 68 69  offset at.** whi
c300: 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f  ch to write into
c310: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
c320: 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
c330: 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20  n copies the.** 
c340: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
c350: 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f  tring pointed to
c360: 20 62 79 20 74 68 65 20 74 68 69 72 64 20 70 61   by the third pa
c370: 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65 64  rameter, zSigned
c380: 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65  Ident,.** to the
c390: 20 73 70 65 63 69 66 69 65 64 20 6f 66 66 73 65   specified offse
c3a0: 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  t in the buffer 
c3b0: 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70 49 64  and updates *pId
c3c0: 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f  x to refer.** to
c3d0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
c3e0: 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 62  after the last b
c3f0: 79 74 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f  yte written befo
c400: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
c410: 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69   .** If the stri
c420: 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 20  ng zSignedIdent 
c430: 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
c440: 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72  y of alpha-numer
c450: 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  ic.** characters
c460: 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  , does not begin
c470: 20 77 69 74 68 20 61 20 64 69 67 69 74 20 61 6e   with a digit an
c480: 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20  d is not an SQL 
c490: 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e  keyword,.** then
c4a0: 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
c4b0: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
c4c0: 65 72 20 65 78 61 63 74 6c 79 20 61 73 20 69 74  er exactly as it
c4d0: 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a   is. Otherwise,.
c4e0: 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65 64 20  ** it is quoted 
c4f0: 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f  using double-quo
c500: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
c510: 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61  oid identPut(cha
c520: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c  r *z, int *pIdx,
c530: 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64   char *zSignedId
c540: 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ent){.  unsigned
c550: 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20   char *zIdent = 
c560: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
c570: 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20  zSignedIdent;.  
c580: 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75  int i, j, needQu
c590: 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78  ote;.  i = *pIdx
c5a0: 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  ;..  for(j=0; zI
c5b0: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
c5c0: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49     if( !sqlite3I
c5d0: 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d  salnum(zIdent[j]
c5e0: 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d  ) && zIdent[j]!=
c5f0: 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  '_' ) break;.  }
c600: 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 73  .  needQuote = s
c610: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 49  qlite3Isdigit(zI
c620: 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20  dent[0]).       
c630: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b       || sqlite3K
c640: 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e  eywordCode(zIden
c650: 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20 20 20  t, j)!=TK_ID.   
c660: 20 20 20 20 20 20 20 20 20 7c 7c 20 7a 49 64 65           || zIde
c670: 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20 20 20  nt[j]!=0.       
c680: 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20       || j==0;.. 
c690: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
c6a0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
c6b0: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
c6c0: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  [j]; j++){.    z
c6d0: 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a  [i++] = zIdent[j
c6e0: 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e  ];.    if( zIden
c6f0: 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b  t[j]=='"' ) z[i+
c700: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20  +] = '"';.  }.  
c710: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
c720: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
c730: 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64  z[i] = 0;.  *pId
c740: 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x = i;.}../*.** 
c750: 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54  Generate a CREAT
c760: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
c770: 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  t appropriate fo
c780: 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74  r the given.** t
c790: 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f  able.  Memory to
c7a0: 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f   hold the text o
c7b0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
c7c0: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  is obtained.** f
c7d0: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
c7e0: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
c7f0: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
c800: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
c810: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72  .static char *cr
c820: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71  eateTableStmt(sq
c830: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
c840: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b   *p){.  int i, k
c850: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74  , n;.  char *zSt
c860: 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70  mt;.  char *zSep
c870: 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b  , *zSep2, *zEnd;
c880: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
c890: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  n = 0;.  for(
c8a0: 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20  pCol = p->aCol, 
c8b0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
c8c0: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
c8d0: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
c8e0: 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20  th(pCol->zName) 
c8f0: 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  + 5;.  }.  n += 
c900: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a  identLength(p->z
c910: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35  Name);.  if( n<5
c920: 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d  0 ){ .    zSep =
c930: 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d   "";.    zSep2 =
c940: 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d   ",";.    zEnd =
c950: 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   ")";.  }else{. 
c960: 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22     zSep = "\n  "
c970: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
c980: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20  \n  ";.    zEnd 
c990: 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e  = "\n)";.  }.  n
c9a0: 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43   += 35 + 6*p->nC
c9b0: 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71  ol;.  zStmt = sq
c9c0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
c9d0: 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53  (0, n);.  if( zS
c9e0: 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  tmt==0 ){.    sq
c9f0: 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
ca00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
ca10: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
ca20: 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74  nprintf(n, zStmt
ca30: 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
ca40: 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65  ");.  k = sqlite
ca50: 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29  3Strlen30(zStmt)
ca60: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
ca70: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
ca80: 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20  );.  zStmt[k++] 
ca90: 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f  = '(';.  for(pCo
caa0: 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  l=p->aCol, i=0; 
cab0: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
cac0: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61  pCol++){.    sta
cad0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
cae0: 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20   const azType[] 
caf0: 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  = {.        /* S
cb00: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 20  QLITE_AFF_BLOB  
cb10: 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20 20 20    */ "",.       
cb20: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54   /* SQLITE_AFF_T
cb30: 45 58 54 20 20 20 20 2a 2f 20 22 20 54 45 58 54  EXT    */ " TEXT
cb40: 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ",.        /* SQ
cb50: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
cb60: 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20   */ " NUM",.    
cb70: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
cb80: 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49  F_INTEGER */ " I
cb90: 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  NT",.        /* 
cba0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
cbb0: 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20     */ " REAL".  
cbc0: 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e    };.    int len
cbd0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
cbe0: 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71   *zType;..    sq
cbf0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
cc00: 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  -k, &zStmt[k], z
cc10: 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73  Sep);.    k += s
cc20: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26  qlite3Strlen30(&
cc30: 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a  zStmt[k]);.    z
cc40: 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20  Sep = zSep2;.   
cc50: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
cc60: 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65   &k, pCol->zName
cc70: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
cc80: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51  Col->affinity-SQ
cc90: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3e 3d  LITE_AFF_BLOB >=
cca0: 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74   0 );.    assert
ccb0: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
ccc0: 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  -SQLITE_AFF_BLOB
ccd0: 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a 54   < ArraySize(azT
cce0: 79 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73 74  ype) );.    test
ccf0: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
cd00: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
cd10: 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 74 65 73  _BLOB );.    tes
cd20: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
cd30: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
cd40: 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65  F_TEXT );.    te
cd50: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
cd60: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
cd70: 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
cd80: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
cd90: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
cda0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29  TE_AFF_INTEGER )
cdb0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
cdc0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
cdd0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
cde0: 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70  );.    .    zTyp
cdf0: 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d  e = azType[pCol-
ce00: 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49  >affinity - SQLI
ce10: 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b 0a 20 20  TE_AFF_BLOB];.  
ce20: 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53    len = sqlite3S
ce30: 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a  trlen30(zType);.
ce40: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
ce50: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
ce60: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a 20 20 20  TE_AFF_BLOB .   
ce70: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c           || pCol
ce80: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69  ->affinity==sqli
ce90: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
cea0: 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a 20 20 20  zType, 0) );.   
ceb0: 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b   memcpy(&zStmt[k
cec0: 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a  ], zType, len);.
ced0: 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20      k += len;.  
cee0: 20 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29    assert( k<=n )
cef0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
cf00: 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a  snprintf(n-k, &z
cf10: 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a  Stmt[k], "%s", z
cf20: 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  End);.  return z
cf30: 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Stmt;.}../*.** R
cf40: 65 73 69 7a 65 20 61 6e 20 49 6e 64 65 78 20 6f  esize an Index o
cf50: 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20 4e 20  bject to hold N 
cf60: 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e 20 20  columns total.  
cf70: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
cf80: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 61  .** on success a
cf90: 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  nd SQLITE_NOMEM 
cfa0: 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  on an OOM error.
cfb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
cfc0: 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74  esizeIndexObject
cfd0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e  (sqlite3 *db, In
cfe0: 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 4e  dex *pIdx, int N
cff0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72  ){.  char *zExtr
d000: 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  a;.  int nByte;.
d010: 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
d020: 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72 6e 20  umn>=N ) return 
d030: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
d040: 65 72 74 28 20 70 49 64 78 2d 3e 69 73 52 65 73  ert( pIdx->isRes
d050: 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 42 79  ized==0 );.  nBy
d060: 74 65 20 3d 20 28 73 69 7a 65 6f 66 28 63 68 61  te = (sizeof(cha
d070: 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69 31 36  r*) + sizeof(i16
d080: 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45 78 74  ) + 1)*N;.  zExt
d090: 72 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ra = sqlite3DbMa
d0a0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
d0b0: 74 65 29 3b 0a 20 20 69 66 28 20 7a 45 78 74 72  te);.  if( zExtr
d0c0: 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  a==0 ) return SQ
d0d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
d0e0: 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61  .  memcpy(zExtra
d0f0: 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20  , pIdx->azColl, 
d100: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 49  sizeof(char*)*pI
d110: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  dx->nColumn);.  
d120: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28  pIdx->azColl = (
d130: 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 7a 45 78  const char**)zEx
d140: 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d  tra;.  zExtra +=
d150: 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 4e   sizeof(char*)*N
d160: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72  ;.  memcpy(zExtr
d170: 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  a, pIdx->aiColum
d180: 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 70  n, sizeof(i16)*p
d190: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Idx->nColumn);. 
d1a0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20   pIdx->aiColumn 
d1b0: 3d 20 28 69 31 36 2a 29 7a 45 78 74 72 61 3b 0a  = (i16*)zExtra;.
d1c0: 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65    zExtra += size
d1d0: 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d  of(i16)*N;.  mem
d1e0: 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78  cpy(zExtra, pIdx
d1f0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 70 49  ->aSortOrder, pI
d200: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  dx->nColumn);.  
d210: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
d220: 20 3d 20 28 75 38 2a 29 7a 45 78 74 72 61 3b 0a   = (u8*)zExtra;.
d230: 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20    pIdx->nColumn 
d240: 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e 69 73 52  = N;.  pIdx->isR
d250: 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20 20 72 65  esized = 1;.  re
d260: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d270: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  }../*.** Estimat
d280: 65 20 74 68 65 20 74 6f 74 61 6c 20 72 6f 77 20  e the total row 
d290: 77 69 64 74 68 20 66 6f 72 20 61 20 74 61 62 6c  width for a tabl
d2a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
d2b0: 64 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57  d estimateTableW
d2c0: 69 64 74 68 28 54 61 62 6c 65 20 2a 70 54 61 62  idth(Table *pTab
d2d0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 54  ){.  unsigned wT
d2e0: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  able = 0;.  cons
d2f0: 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f  t Column *pTabCo
d300: 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  l;.  int i;.  fo
d310: 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  r(i=pTab->nCol, 
d320: 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43  pTabCol=pTab->aC
d330: 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54  ol; i>0; i--, pT
d340: 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77 54  abCol++){.    wT
d350: 61 62 6c 65 20 2b 3d 20 70 54 61 62 43 6f 6c 2d  able += pTabCol-
d360: 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66  >szEst;.  }.  if
d370: 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20  ( pTab->iPKey<0 
d380: 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 20 70 54  ) wTable++;.  pT
d390: 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73  ab->szTabRow = s
d3a0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 54 61  qlite3LogEst(wTa
d3b0: 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ble*4);.}../*.**
d3c0: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76   Estimate the av
d3d0: 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 61 20  erage size of a 
d3e0: 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  row for an index
d3f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d400: 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69   estimateIndexWi
d410: 64 74 68 28 49 6e 64 65 78 20 2a 70 49 64 78 29  dth(Index *pIdx)
d420: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 49 6e  {.  unsigned wIn
d430: 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  dex = 0;.  int i
d440: 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e  ;.  const Column
d450: 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 70   *aCol = pIdx->p
d460: 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66  Table->aCol;.  f
d470: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
d480: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
d490: 20 20 20 69 31 36 20 78 20 3d 20 70 49 64 78 2d     i16 x = pIdx-
d4a0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
d4b0: 20 20 61 73 73 65 72 74 28 20 78 3c 70 49 64 78    assert( x<pIdx
d4c0: 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29  ->pTable->nCol )
d4d0: 3b 0a 20 20 20 20 77 49 6e 64 65 78 20 2b 3d 20  ;.    wIndex += 
d4e0: 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f 6c 5b 70  x<0 ? 1 : aCol[p
d4f0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
d500: 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 70  ].szEst;.  }.  p
d510: 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20  Idx->szIdxRow = 
d520: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 49  sqlite3LogEst(wI
d530: 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52  ndex*4);.}../* R
d540: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 76 61  eturn true if va
d550: 6c 75 65 20 78 20 69 73 20 66 6f 75 6e 64 20 61  lue x is found a
d560: 6e 79 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ny of the first 
d570: 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f 66 20  nCol entries of 
d580: 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69  aiCol[].*/.stati
d590: 63 20 69 6e 74 20 68 61 73 43 6f 6c 75 6d 6e 28  c int hasColumn(
d5a0: 63 6f 6e 73 74 20 69 31 36 20 2a 61 69 43 6f 6c  const i16 *aiCol
d5b0: 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74 20  , int nCol, int 
d5c0: 78 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 43 6f  x){.  while( nCo
d5d0: 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28 20 78 3d  l-- > 0 ) if( x=
d5e0: 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 20 72 65  =*(aiCol++) ) re
d5f0: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
d600: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
d610: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 61  s routine runs a
d620: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 70 61 72  t the end of par
d630: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
d640: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68  BLE statement th
d650: 61 74 0a 2a 2a 20 68 61 73 20 61 20 57 49 54 48  at.** has a WITH
d660: 4f 55 54 20 52 4f 57 49 44 20 63 6c 61 75 73 65  OUT ROWID clause
d670: 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  .  The job of th
d680: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
d690: 20 63 6f 6e 76 65 72 74 20 62 6f 74 68 0a 2a 2a   convert both.**
d6a0: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
d6b0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
d6c0: 20 61 6e 64 20 74 68 65 20 67 65 6e 65 72 61 74   and the generat
d6d0: 65 64 20 56 44 42 45 20 63 6f 64 65 20 73 6f 20  ed VDBE code so 
d6e0: 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 61 72 65  that they.** are
d6f0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
d700: 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
d710: 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f   table instead o
d720: 66 20 61 20 72 6f 77 69 64 20 74 61 62 6c 65 2e  f a rowid table.
d730: 0a 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 63 6c  .** Changes incl
d740: 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ude:.**.**     (
d750: 31 29 20 20 53 65 74 20 61 6c 6c 20 63 6f 6c 75  1)  Set all colu
d760: 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41  mns of the PRIMA
d770: 52 59 20 4b 45 59 20 73 63 68 65 6d 61 20 6f 62  RY KEY schema ob
d780: 6a 65 63 74 20 74 6f 20 62 65 20 4e 4f 54 20 4e  ject to be NOT N
d790: 55 4c 4c 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20  ULL..**     (2) 
d7a0: 20 43 6f 6e 76 65 72 74 20 50 33 20 70 61 72 61   Convert P3 para
d7b0: 6d 65 74 65 72 20 6f 66 20 74 68 65 20 4f 50 5f  meter of the OP_
d7c0: 43 72 65 61 74 65 42 74 72 65 65 20 66 72 6f 6d  CreateBtree from
d7d0: 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 0a 2a   BTREE_INTKEY .*
d7e0: 2a 20 20 20 20 20 20 20 20 20 20 69 6e 74 6f 20  *          into 
d7f0: 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 2e 0a 2a  BTREE_BLOBKEY..*
d800: 2a 20 20 20 20 20 28 33 29 20 20 42 79 70 61 73  *     (3)  Bypas
d810: 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  s the creation o
d820: 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  f the sqlite_mas
d830: 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79 0a  ter table entry.
d840: 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 20  **          for 
d850: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d860: 61 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  as the primary k
d870: 65 79 20 69 6e 64 65 78 20 69 73 20 6e 6f 77 0a  ey index is now.
d880: 2a 2a 20 20 20 20 20 20 20 20 20 20 69 64 65 6e  **          iden
d890: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 71  tified by the sq
d8a0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
d8b0: 65 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74  e entry of the t
d8c0: 61 62 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20  able itself..** 
d8d0: 20 20 20 20 28 34 29 20 20 53 65 74 20 74 68 65      (4)  Set the
d8e0: 20 49 6e 64 65 78 2e 74 6e 75 6d 20 6f 66 20 74   Index.tnum of t
d8f0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49  he PRIMARY KEY I
d900: 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 74  ndex object in t
d910: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73  he.**          s
d920: 63 68 65 6d 61 20 74 6f 20 74 68 65 20 72 6f 6f  chema to the roo
d930: 74 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6d  tpage from the m
d940: 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  ain table..**   
d950: 20 20 28 35 29 20 20 41 64 64 20 61 6c 6c 20 74    (5)  Add all t
d960: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  able columns to 
d970: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d980: 49 6e 64 65 78 20 6f 62 6a 65 63 74 0a 2a 2a 20  Index object.** 
d990: 20 20 20 20 20 20 20 20 20 73 6f 20 74 68 61 74           so that
d9a0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
d9b0: 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69   is a covering i
d9c0: 6e 64 65 78 2e 20 20 54 68 65 20 73 75 72 70 6c  ndex.  The surpl
d9d0: 75 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 63  us.**          c
d9e0: 6f 6c 75 6d 6e 73 20 61 72 65 20 70 61 72 74 20  olumns are part 
d9f0: 6f 66 20 4b 65 79 49 6e 66 6f 2e 6e 41 6c 6c 46  of KeyInfo.nAllF
da00: 69 65 6c 64 20 61 6e 64 20 61 72 65 20 6e 6f 74  ield and are not
da10: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20 20   used for.**    
da20: 20 20 20 20 20 20 73 6f 72 74 69 6e 67 20 6f 72        sorting or
da30: 20 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e 69 71 75   lookup or uniqu
da40: 65 6e 65 73 73 20 63 68 65 63 6b 73 2e 0a 2a 2a  eness checks..**
da50: 20 20 20 20 20 28 36 29 20 20 52 65 70 6c 61 63       (6)  Replac
da60: 65 20 74 68 65 20 72 6f 77 69 64 20 74 61 69 6c  e the rowid tail
da70: 20 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d 61 74 69   on all automati
da80: 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 20  cally generated 
da90: 55 4e 49 51 55 45 0a 2a 2a 20 20 20 20 20 20 20  UNIQUE.**       
daa0: 20 20 20 69 6e 64 69 63 65 73 20 77 69 74 68 20     indices with 
dab0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
dac0: 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 46  columns..**.** F
dad0: 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
dae0: 73 2c 20 6f 6e 6c 79 20 28 31 29 20 69 73 20 70  s, only (1) is p
daf0: 65 72 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61  erformed..*/.sta
db00: 74 69 63 20 76 6f 69 64 20 63 6f 6e 76 65 72 74  tic void convert
db10: 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61  ToWithoutRowidTa
db20: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
db30: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  e, Table *pTab){
db40: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
db50: 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 0a 20 20    Index *pPk;.  
db60: 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e 74 20 69  int nPk;.  int i
db70: 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  , j;.  sqlite3 *
db80: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
db90: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
dba0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 2f  rse->pVdbe;..  /
dbb0: 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 50 52 49  * Mark every PRI
dbc0: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
dbd0: 61 73 20 4e 4f 54 20 4e 55 4c 4c 20 28 65 78 63  as NOT NULL (exc
dbe0: 65 70 74 20 66 6f 72 20 69 6d 70 6f 73 74 65 72  ept for imposter
dbf0: 20 74 61 62 6c 65 73 29 0a 20 20 2a 2f 0a 20 20   tables).  */.  
dc00: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d  if( !db->init.im
dc10: 70 6f 73 74 65 72 54 61 62 6c 65 20 29 7b 0a 20  posterTable ){. 
dc20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
dc30: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
dc40: 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62 2d        if( (pTab-
dc50: 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c 61 67  >aCol[i].colFlag
dc60: 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d  s & COLFLAG_PRIM
dc70: 4b 45 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  KEY)!=0 ){.     
dc80: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d     pTab->aCol[i]
dc90: 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 4f 45 5f 41 62  .notNull = OE_Ab
dca0: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
dcb0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
dcc0: 20 72 65 6d 61 69 6e 69 6e 67 20 74 72 61 6e 73   remaining trans
dcd0: 66 6f 72 6d 61 74 69 6f 6e 73 20 6f 6e 6c 79 20  formations only 
dce0: 61 70 70 6c 79 20 74 6f 20 62 2d 74 72 65 65 20  apply to b-tree 
dcf0: 74 61 62 6c 65 73 2c 20 6e 6f 74 20 74 6f 0a 20  tables, not to. 
dd00: 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c   ** virtual tabl
dd10: 65 73 20 2a 2f 0a 20 20 69 66 28 20 49 4e 5f 44  es */.  if( IN_D
dd20: 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 72 65  ECLARE_VTAB ) re
dd30: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76  turn;..  /* Conv
dd40: 65 72 74 20 74 68 65 20 50 33 20 6f 70 65 72 61  ert the P3 opera
dd50: 6e 64 20 6f 66 20 74 68 65 20 4f 50 5f 43 72 65  nd of the OP_Cre
dd60: 61 74 65 42 74 72 65 65 20 6f 70 63 6f 64 65 20  ateBtree opcode 
dd70: 66 72 6f 6d 20 42 54 52 45 45 5f 49 4e 54 4b 45  from BTREE_INTKE
dd80: 59 0a 20 20 2a 2a 20 69 6e 74 6f 20 42 54 52 45  Y.  ** into BTRE
dd90: 45 5f 42 4c 4f 42 4b 45 59 2e 0a 20 20 2a 2f 0a  E_BLOBKEY..  */.
dda0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 64    if( pParse->ad
ddb0: 64 72 43 72 54 61 62 20 29 7b 0a 20 20 20 20 61  drCrTab ){.    a
ddc0: 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 20 20  ssert( v );.    
ddd0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
dde0: 65 50 33 28 76 2c 20 70 50 61 72 73 65 2d 3e 61  eP3(v, pParse->a
ddf0: 64 64 72 43 72 54 61 62 2c 20 42 54 52 45 45 5f  ddrCrTab, BTREE_
de00: 42 4c 4f 42 4b 45 59 29 3b 0a 20 20 7d 0a 0a 20  BLOBKEY);.  }.. 
de10: 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 50   /* Locate the P
de20: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
de30: 2e 20 20 4f 72 2c 20 69 66 20 74 68 69 73 20 74  .  Or, if this t
de40: 61 62 6c 65 20 77 61 73 20 6f 72 69 67 69 6e 61  able was origina
de50: 6c 6c 79 0a 20 20 2a 2a 20 61 6e 20 49 4e 54 45  lly.  ** an INTE
de60: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
de70: 74 61 62 6c 65 2c 20 63 72 65 61 74 65 20 61 20  table, create a 
de80: 6e 65 77 20 50 52 49 4d 41 52 59 20 4b 45 59 20  new PRIMARY KEY 
de90: 69 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a 20 20 69  index. .  */.  i
dea0: 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d  f( pTab->iPKey>=
deb0: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  0 ){.    ExprLis
dec0: 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 54 6f  t *pList;.    To
ded0: 6b 65 6e 20 69 70 6b 54 6f 6b 65 6e 3b 0a 20 20  ken ipkToken;.  
dee0: 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e    sqlite3TokenIn
def0: 69 74 28 26 69 70 6b 54 6f 6b 65 6e 2c 20 70 54  it(&ipkToken, pT
df00: 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69  ab->aCol[pTab->i
df10: 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  PKey].zName);.  
df20: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
df30: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
df40: 70 50 61 72 73 65 2c 20 30 2c 20 0a 20 20 20 20  pParse, 0, .    
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
df60: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
df70: 62 2c 20 54 4b 5f 49 44 2c 20 26 69 70 6b 54 6f  b, TK_ID, &ipkTo
df80: 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 69 66  ken, 0));.    if
df90: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
dfa0: 75 72 6e 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  urn;.    pList->
dfb0: 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
dfc0: 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74   pParse->iPkSort
dfd0: 4f 72 64 65 72 3b 0a 20 20 20 20 61 73 73 65 72  Order;.    asser
dfe0: 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  t( pParse->pNewT
dff0: 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20  able==pTab );.  
e000: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49    sqlite3CreateI
e010: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20  ndex(pParse, 0, 
e020: 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 70 54 61  0, 0, pList, pTa
e030: 62 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c 20 30  b->keyConf, 0, 0
e040: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
e060: 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52  QLITE_IDXTYPE_PR
e070: 49 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20 20 69  IMARYKEY);.    i
e080: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
e090: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
e0a0: 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50    pPk = sqlite3P
e0b0: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
e0c0: 54 61 62 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  Tab);.    pTab->
e0d0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 7d 65  iPKey = -1;.  }e
e0e0: 6c 73 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73  lse{.    pPk = s
e0f0: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
e100: 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 0a 20 20  Index(pTab);..  
e110: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 6d 6f    /*.    ** Remo
e120: 76 65 20 61 6c 6c 20 72 65 64 75 6e 64 61 6e 74  ve all redundant
e130: 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
e140: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  e PRIMARY KEY.  
e150: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 68 61  For example, cha
e160: 6e 67 65 0a 20 20 20 20 2a 2a 20 22 50 52 49 4d  nge.    ** "PRIM
e170: 41 52 59 20 4b 45 59 28 61 2c 62 2c 61 2c 62 2c  ARY KEY(a,b,a,b,
e180: 63 2c 62 2c 63 2c 64 29 22 20 69 6e 74 6f 20 6a  c,b,c,d)" into j
e190: 75 73 74 20 22 50 52 49 4d 41 52 59 20 4b 45 59  ust "PRIMARY KEY
e1a0: 28 61 2c 62 2c 63 2c 64 29 22 2e 20 20 4c 61 74  (a,b,c,d)".  Lat
e1b0: 65 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 61  er.    ** code a
e1c0: 73 73 75 6d 65 73 20 74 68 65 20 50 52 49 4d 41  ssumes the PRIMA
e1d0: 52 59 20 4b 45 59 20 63 6f 6e 74 61 69 6e 73 20  RY KEY contains 
e1e0: 6e 6f 20 72 65 70 65 61 74 65 64 20 63 6f 6c 75  no repeated colu
e1f0: 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mns..    */.    
e200: 66 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c 70 50 6b  for(i=j=1; i<pPk
e210: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nKeyCol; i++){
e220: 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 43 6f  .      if( hasCo
e230: 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75  lumn(pPk->aiColu
e240: 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69 43 6f  mn, j, pPk->aiCo
e250: 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20  lumn[i]) ){.    
e260: 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e      pPk->nColumn
e270: 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  --;.      }else{
e280: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69  .        pPk->ai
e290: 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50  Column[j++] = pP
e2a0: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  k->aiColumn[i];.
e2b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e2c0: 20 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d    pPk->nKeyCol =
e2d0: 20 6a 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   j;.  }.  assert
e2e0: 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20 70 50  ( pPk!=0 );.  pP
e2f0: 6b 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20  k->isCovering = 
e300: 31 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  1;.  if( !db->in
e310: 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65  it.imposterTable
e320: 20 29 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e   ) pPk->uniqNotN
e330: 75 6c 6c 20 3d 20 31 3b 0a 20 20 6e 50 6b 20 3d  ull = 1;.  nPk =
e340: 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a   pPk->nKeyCol;..
e350: 20 20 2f 2a 20 42 79 70 61 73 73 20 74 68 65 20    /* Bypass the 
e360: 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  creation of the 
e370: 50 52 49 4d 41 52 59 20 4b 45 59 20 62 74 72 65  PRIMARY KEY btre
e380: 65 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65  e and the sqlite
e390: 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62  _master.  ** tab
e3a0: 6c 65 20 65 6e 74 72 79 2e 20 54 68 69 73 20 69  le entry. This i
e3b0: 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20  s only required 
e3c0: 69 66 20 63 75 72 72 65 6e 74 6c 79 20 67 65 6e  if currently gen
e3d0: 65 72 61 74 69 6e 67 20 56 44 42 45 0a 20 20 2a  erating VDBE.  *
e3e0: 2a 20 63 6f 64 65 20 66 6f 72 20 61 20 43 52 45  * code for a CRE
e3f0: 41 54 45 20 54 41 42 4c 45 20 28 6e 6f 74 20 77  ATE TABLE (not w
e400: 68 65 6e 20 70 61 72 73 69 6e 67 20 6f 6e 65 20  hen parsing one 
e410: 61 73 20 70 61 72 74 20 6f 66 20 72 65 61 64 69  as part of readi
e420: 6e 67 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61  ng.  ** a databa
e430: 73 65 20 73 63 68 65 6d 61 29 2e 20 20 2a 2f 0a  se schema).  */.
e440: 20 20 69 66 28 20 76 20 26 26 20 70 50 6b 2d 3e    if( v && pPk->
e450: 74 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 61 73  tnum>0 ){.    as
e460: 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62  sert( db->init.b
e470: 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  usy==0 );.    sq
e480: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f  lite3VdbeChangeO
e490: 70 63 6f 64 65 28 76 2c 20 70 50 6b 2d 3e 74 6e  pcode(v, pPk->tn
e4a0: 75 6d 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  um, OP_Goto);.  
e4b0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74  }..  /* The root
e4c0: 20 70 61 67 65 20 6f 66 20 74 68 65 20 50 52 49   page of the PRI
e4d0: 4d 41 52 59 20 4b 45 59 20 69 73 20 74 68 65 20  MARY KEY is the 
e4e0: 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 20  table root page 
e4f0: 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d  */.  pPk->tnum =
e500: 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20   pTab->tnum;..  
e510: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 69 6e  /* Update the in
e520: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
e530: 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e  tation of all UN
e540: 49 51 55 45 20 69 6e 64 69 63 65 73 20 62 79 20  IQUE indices by 
e550: 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20 2a 2a 20  converting.  ** 
e560: 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 20  the final rowid 
e570: 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20  column into one 
e580: 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20  or more columns 
e590: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
e5a0: 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  EY..  */.  for(p
e5b0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
e5c0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
e5d0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  x->pNext){.    i
e5e0: 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 49 73  nt n;.    if( Is
e5f0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
e600: 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65  pIdx) ) continue
e610: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b  ;.    for(i=n=0;
e620: 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20   i<nPk; i++){.  
e630: 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75      if( !hasColu
e640: 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  mn(pIdx->aiColum
e650: 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  n, pIdx->nKeyCol
e660: 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
e670: 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d  i]) ) n++;.    }
e680: 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  .    if( n==0 ){
e690: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
e6a0: 6e 64 65 78 20 69 73 20 61 20 73 75 70 65 72 73  ndex is a supers
e6b0: 65 74 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72  et of the primar
e6c0: 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20 70  y key */.      p
e6d0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70  Idx->nColumn = p
e6e0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  Idx->nKeyCol;.  
e6f0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
e700: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73 69    }.    if( resi
e710: 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62  zeIndexObject(db
e720: 2c 20 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b  , pIdx, pIdx->nK
e730: 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65 74 75 72  eyCol+n) ) retur
e740: 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  n;.    for(i=0, 
e750: 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  j=pIdx->nKeyCol;
e760: 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20   i<nPk; i++){.  
e770: 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75      if( !hasColu
e780: 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  mn(pIdx->aiColum
e790: 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  n, pIdx->nKeyCol
e7a0: 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
e7b0: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  i]) ){.        p
e7c0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
e7d0: 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
e7e0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 64  [i];.        pId
e7f0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70  x->azColl[j] = p
e800: 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  Pk->azColl[i];. 
e810: 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
e820: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
e830: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
e840: 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  umn>=pIdx->nKeyC
e850: 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61 73 73 65  ol+n );.    asse
e860: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
e870: 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  n>=j );.  }..  /
e880: 2a 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20  * Add all table 
e890: 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50  columns to the P
e8a0: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
e8b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 6b 3c  .  */.  if( nPk<
e8c0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
e8d0: 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65    if( resizeInde
e8e0: 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 50 6b 2c  xObject(db, pPk,
e8f0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 20 72   pTab->nCol) ) r
e900: 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69  eturn;.    for(i
e910: 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54 61  =0, j=nPk; i<pTa
e920: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
e930: 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c       if( !hasCol
e940: 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  umn(pPk->aiColum
e950: 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20 20 20 20  n, j, i) ){.    
e960: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 50      assert( j<pP
e970: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  k->nColumn );.  
e980: 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c        pPk->aiCol
e990: 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[j] = i;.    
e9a0: 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b      pPk->azColl[
e9b0: 6a 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  j] = sqlite3StrB
e9c0: 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 20 20 6a  INARY;.        j
e9d0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
e9e0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
e9f0: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b  k->nColumn==j );
ea00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
ea10: 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20  b->nCol==j );.  
ea20: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e  }else{.    pPk->
ea30: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e  nColumn = pTab->
ea40: 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nCol;.  }.}../*.
ea50: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ea60: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70  is called to rep
ea70: 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29  ort the final ")
ea80: 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65  " that terminate
ea90: 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41  s.** a CREATE TA
eaa0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
eab0: 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73  *.** The table s
eac0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f 74  tructure that ot
ead0: 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  her action routi
eae0: 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62 75  nes have been bu
eaf0: 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64  ilding.** is add
eb00: 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e  ed to the intern
eb10: 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20  al hash tables, 
eb20: 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f  assuming no erro
eb30: 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72  rs have.** occur
eb40: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e  red..**.** An en
eb50: 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c  try for the tabl
eb60: 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65  e is made in the
eb70: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e   master table on
eb80: 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a   disk, unless.**
eb90: 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
eba0: 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62  rary table or db
ebb0: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20  ->init.busy==1. 
ebc0: 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62   When db->init.b
ebd0: 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61  usy==1.** it mea
ebe0: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
ebf0: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
ec00: 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73  ter table becaus
ec10: 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e  e we just.** con
ec20: 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64 61  nected to the da
ec30: 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75 73  tabase or becaus
ec40: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
ec50: 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a  ter table has.**
ec60: 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65   recently change
ec70: 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20  d, so the entry 
ec80: 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 61  for this table a
ec90: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e  lready exists in
eca0: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  .** the sqlite_m
ecb0: 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65  aster table.  We
ecc0: 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20   do not want to 
ecd0: 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e  create it again.
ece0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53  .**.** If the pS
ecf0: 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69  elect argument i
ed00: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d  s not NULL, it m
ed10: 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 72  eans that this r
ed20: 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61  outine.** was ca
ed30: 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
ed40: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
ed50: 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45   from a .** "CRE
ed60: 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53  ATE TABLE ... AS
ed70: 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61   SELECT ..." sta
ed80: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c  tement.  The col
ed90: 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  umn names of.** 
eda0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69  the new table wi
edb0: 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65 73  ll match the res
edc0: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
edd0: 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ELECT..*/.void s
ede0: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 0a  qlite3EndTable(.
edf0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
ee00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
ee10: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
ee20: 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20  Token *pCons,   
ee30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27          /* The '
ee40: 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20 74  ,' token after t
ee50: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64  he last column d
ee60: 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  efn. */.  Token 
ee70: 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20  *pEnd,          
ee80: 20 20 2f 2a 20 54 68 65 20 27 29 27 20 62 65 66    /* The ')' bef
ee90: 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69 6e 20 74  ore options in t
eea0: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
eeb0: 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70 74 73 2c  */.  u8 tabOpts,
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eed0: 45 78 74 72 61 20 74 61 62 6c 65 20 6f 70 74 69  Extra table opti
eee0: 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20 30 2e 20  ons. Usually 0. 
eef0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
ef00: 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20  lect         /* 
ef10: 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43  Select from a "C
ef20: 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c  REATE ... AS SEL
ef30: 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ECT" */.){.  Tab
ef40: 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  le *p;          
ef50: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
ef60: 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  w table */.  sql
ef70: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
ef80: 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61  e->db; /* The da
ef90: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
efa0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  n */.  int iDb; 
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efc0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e 20   /* Database in 
efd0: 77 68 69 63 68 20 74 68 65 20 74 61 62 6c 65 20  which the table 
efe0: 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78  lives */.  Index
eff0: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
f000: 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d 70 6c 69       /* An impli
f010: 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ed index of the 
f020: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20  table */..  if( 
f030: 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65  pEnd==0 && pSele
f040: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ct==0 ){.    ret
f050: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
f060: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
f070: 69 6c 65 64 20 29 3b 0a 20 20 70 20 3d 20 70 50  iled );.  p = pP
f080: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
f090: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
f0a0: 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
f0b0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
f0c0: 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a  || !pSelect );..
f0d0: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
f0e0: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
f0f0: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
f100: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
f110: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
f120: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
f130: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
f140: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
f150: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
f160: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
f170: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
f180: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
f190: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
f1a0: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
f1b0: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
f1c0: 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
f1d0: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
f1e0: 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  er.  ** should h
f1f0: 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65  ave been put the
f200: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
f210: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
f220: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
f230: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
f240: 65 72 20 69 73 20 31 2c 20 74 68 61 74 20 6d 65  er is 1, that me
f250: 61 6e 73 20 74 68 69 73 20 69 73 20 74 68 65 20  ans this is the 
f260: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20  sqlite_master.  
f270: 2a 2a 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e  ** table itself.
f280: 20 20 53 6f 20 6d 61 72 6b 20 69 74 20 72 65 61    So mark it rea
f290: 64 2d 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  d-only..  */.  i
f2a0: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
f2b0: 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20   ){.    p->tnum 
f2c0: 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
f2d0: 75 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 74  um;.    if( p->t
f2e0: 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e 74 61 62 46  num==1 ) p->tabF
f2f0: 6c 61 67 73 20 7c 3d 20 54 46 5f 52 65 61 64 6f  lags |= TF_Reado
f300: 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  nly;.  }..  /* S
f310: 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  pecial processin
f320: 67 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  g for WITHOUT RO
f330: 57 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20  WID Tables */.  
f340: 69 66 28 20 74 61 62 4f 70 74 73 20 26 20 54 46  if( tabOpts & TF
f350: 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b  _WithoutRowid ){
f360: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62  .    if( (p->tab
f370: 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
f380: 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20  ncrement) ){.   
f390: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
f3a0: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
f3b0: 20 20 20 20 20 22 41 55 54 4f 49 4e 43 52 45 4d       "AUTOINCREM
f3c0: 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  ENT not allowed 
f3d0: 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  on WITHOUT ROWID
f3e0: 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20   tables");.     
f3f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
f400: 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c     if( (p->tabFl
f410: 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d  ags & TF_HasPrim
f420: 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20  aryKey)==0 ){.  
f430: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f440: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 50 52 49  Msg(pParse, "PRI
f450: 4d 41 52 59 20 4b 45 59 20 6d 69 73 73 69 6e 67  MARY KEY missing
f460: 20 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c 20 70   on table %s", p
f470: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ->zName);.    }e
f480: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61  lse{.      p->ta
f490: 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69 74  bFlags |= TF_Wit
f4a0: 68 6f 75 74 52 6f 77 69 64 20 7c 20 54 46 5f 4e  houtRowid | TF_N
f4b0: 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20  oVisibleRowid;. 
f4c0: 20 20 20 20 20 63 6f 6e 76 65 72 74 54 6f 57 69       convertToWi
f4d0: 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28  thoutRowidTable(
f4e0: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
f4f0: 7d 0a 20 20 7d 0a 0a 20 20 69 44 62 20 3d 20 73  }.  }..  iDb = s
f500: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
f510: 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65  dex(db, p->pSche
f520: 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ma);..#ifndef SQ
f530: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
f540: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d    /* Resolve nam
f550: 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20  es in all CHECK 
f560: 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65  constraint expre
f570: 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ssions..  */.  i
f580: 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a  f( p->pCheck ){.
f590: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
f5a0: 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28  veSelfReference(
f5b0: 70 50 61 72 73 65 2c 20 70 2c 20 4e 43 5f 49 73  pParse, p, NC_Is
f5c0: 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e 70 43 68  Check, 0, p->pCh
f5d0: 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  eck);.  }.#endif
f5e0: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
f5f0: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20  ITE_OMIT_CHECK) 
f600: 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74  */..  /* Estimat
f610: 65 20 74 68 65 20 61 76 65 72 61 67 65 20 72 6f  e the average ro
f620: 77 20 73 69 7a 65 20 66 6f 72 20 74 68 65 20 74  w size for the t
f630: 61 62 6c 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c  able and for all
f640: 20 69 6d 70 6c 69 65 64 20 69 6e 64 69 63 65 73   implied indices
f650: 20 2a 2f 0a 20 20 65 73 74 69 6d 61 74 65 54 61   */.  estimateTa
f660: 62 6c 65 57 69 64 74 68 28 70 29 3b 0a 20 20 66  bleWidth(p);.  f
f670: 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65  or(pIdx=p->pInde
f680: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
f690: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
f6a0: 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64  estimateIndexWid
f6b0: 74 68 28 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20  th(pIdx);.  }.. 
f6c0: 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69   /* If not initi
f6d0: 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72  alizing, then cr
f6e0: 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f  eate a record fo
f6f0: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a  r the new table.
f700: 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49    ** in the SQLI
f710: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
f720: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
f730: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
f740: 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52  is is a TEMPORAR
f750: 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74  Y table, write t
f760: 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  he entry into th
f770: 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
f780: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
f790: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
f7a0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
f7b0: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
f7c0: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69  it.busy ){.    i
f7d0: 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt n;.    Vdbe *
f7e0: 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  v;.    char *zTy
f7f0: 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22  pe;    /* "view"
f800: 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20   or "table" */. 
f810: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b     char *zType2;
f820: 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20     /* "VIEW" or 
f830: 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63  "TABLE" */.    c
f840: 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f  har *zStmt;    /
f850: 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52  * Text of the CR
f860: 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52  EATE TABLE or CR
f870: 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d  EATE VIEW statem
f880: 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20  ent */..    v = 
f890: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
f8a0: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
f8b0: 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
f8c0: 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74  turn;..    sqlit
f8d0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
f8e0: 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20  OP_Close, 0);.. 
f8f0: 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e     /* .    ** In
f900: 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 66  itialize zType f
f910: 6f 72 20 74 68 65 20 6e 65 77 20 76 69 65 77 20  or the new view 
f920: 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  or table..    */
f930: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c  .    if( p->pSel
f940: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
f950: 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62  /* A regular tab
f960: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70  le */.      zTyp
f970: 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20  e = "table";.   
f980: 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42     zType2 = "TAB
f990: 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  LE";.#ifndef SQL
f9a0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
f9b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
f9c0: 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  * A view */.    
f9d0: 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22    zType = "view"
f9e0: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d  ;.      zType2 =
f9f0: 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a   "VIEW";.#endif.
fa00: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
fa10: 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41 54   this is a CREAT
fa20: 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53 45  E TABLE xx AS SE
fa30: 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74  LECT ..., execut
fa40: 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20  e the SELECT.   
fa50: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f   ** statement to
fa60: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65   populate the ne
fa70: 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f  w table. The roo
fa80: 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  t-page number fo
fa90: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77  r the.    ** new
faa0: 20 74 61 62 6c 65 20 69 73 20 69 6e 20 72 65 67   table is in reg
fab0: 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65  ister pParse->re
fac0: 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  gRoot..    **.  
fad0: 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45    ** Once the SE
fae0: 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f  LECT has been co
faf0: 64 65 64 20 62 79 20 73 71 6c 69 74 65 33 53 65  ded by sqlite3Se
fb00: 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e  lect(), it is in
fb10: 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62   a.    ** suitab
fb20: 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75 65 72  le state to quer
fb30: 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  y for the column
fb40: 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73   names and types
fb50: 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20   to be used.    
fb60: 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74 61  ** by the new ta
fb70: 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ble..    **.    
fb80: 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63 68  ** A shared-cach
fb90: 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20  e write-lock is 
fba0: 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20  not required to 
fbb0: 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77  write to the new
fbc0: 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61   table,.    ** a
fbd0: 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20  s a schema-lock 
fbe0: 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
fbf0: 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  y been obtained 
fc00: 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53 69  to create it. Si
fc10: 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68  nce.    ** a sch
fc20: 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65  ema-lock exclude
fc30: 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61  s all other data
fc40: 62 61 73 65 20 75 73 65 72 73 2c 20 74 68 65 20  base users, the 
fc50: 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64  write-lock would
fc60: 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e  .    ** be redun
fc70: 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  dant..    */.   
fc80: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
fc90: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
fca0: 20 64 65 73 74 3b 20 20 20 20 2f 2a 20 57 68 65   dest;    /* Whe
fcb0: 72 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 68  re the SELECT sh
fcc0: 6f 75 6c 64 20 73 74 6f 72 65 20 72 65 73 75 6c  ould store resul
fcd0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
fce0: 72 65 67 59 69 65 6c 64 3b 20 20 20 20 20 20 20  regYield;       
fcf0: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
fd00: 69 6e 67 20 63 6f 2d 72 6f 75 74 69 6e 65 20 65  ing co-routine e
fd10: 6e 74 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20  ntry-point */.  
fd20: 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b      int addrTop;
fd30: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
fd40: 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  f the co-routine
fd50: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
fd60: 67 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  gRec;         /*
fd70: 20 41 20 72 65 63 6f 72 64 20 74 6f 20 62 65 20   A record to be 
fd80: 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 68 65 20  insert into the 
fd90: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  new table */.   
fda0: 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b     int regRowid;
fdb0: 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
fdc0: 6f 66 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  of the next row 
fdd0: 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20  to insert */.   
fde0: 20 20 20 69 6e 74 20 61 64 64 72 49 6e 73 4c 6f     int addrInsLo
fdf0: 6f 70 3b 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66  op;    /* Top of
fe00: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 69 6e   the loop for in
fe10: 73 65 72 74 69 6e 67 20 72 6f 77 73 20 2a 2f 0a  serting rows */.
fe20: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65        Table *pSe
fe30: 6c 54 61 62 3b 20 20 20 20 20 2f 2a 20 41 20 74  lTab;     /* A t
fe40: 61 62 6c 65 20 74 68 61 74 20 64 65 73 63 72 69  able that descri
fe50: 62 65 73 20 74 68 65 20 53 45 4c 45 43 54 20 72  bes the SELECT r
fe60: 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 20 20 20  esults */..     
fe70: 20 72 65 67 59 69 65 6c 64 20 3d 20 2b 2b 70 50   regYield = ++pP
fe80: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
fe90: 20 20 72 65 67 52 65 63 20 3d 20 2b 2b 70 50 61    regRec = ++pPa
fea0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
feb0: 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50   regRowid = ++pP
fec0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
fed0: 20 20 61 73 73 65 72 74 28 70 50 61 72 73 65 2d    assert(pParse-
fee0: 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20  >nTab==1);.     
fef0: 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
ff00: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
ff10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ff20: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  3(v, OP_OpenWrit
ff30: 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65  e, 1, pParse->re
ff40: 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20  gRoot, iDb);.   
ff50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
ff60: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
ff70: 5f 50 32 49 53 52 45 47 29 3b 0a 20 20 20 20 20  _P2ISREG);.     
ff80: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
ff90: 32 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  2;.      addrTop
ffa0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
ffb0: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31  rrentAddr(v) + 1
ffc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ffd0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
ffe0: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
fff0: 65 67 59 69 65 6c 64 2c 20 30 2c 20 61 64 64 72  egYield, 0, addr
10000 54 6f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Top);.      if( 
10010 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
10020 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 70 53 65  eturn;.      pSe
10030 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
10040 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
10050 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29  pParse, pSelect)
10060 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c  ;.      if( pSel
10070 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Tab==0 ) return;
10080 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10090 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
100a0 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65     p->nCol = pSe
100b0 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
100c0 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c    p->aCol = pSel
100d0 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
100e0 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
100f0 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61   0;.      pSelTa
10100 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
10110 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
10120 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61  Table(db, pSelTa
10130 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
10140 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
10150 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75  &dest, SRT_Corou
10160 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b  tine, regYield);
10170 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
10180 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
10190 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20  lect, &dest);.  
101a0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
101b0 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  nErr ) return;. 
101c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
101d0 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20  EndCoroutine(v, 
101e0 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 20  regYield);.     
101f0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
10200 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 20  Here(v, addrTop 
10210 2d 20 31 29 3b 0a 20 20 20 20 20 20 61 64 64 72  - 1);.      addr
10220 49 6e 73 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65  InsLoop = sqlite
10230 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
10240 50 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e 69 53  P_Yield, dest.iS
10250 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 56 64  DParm);.      Vd
10260 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
10270 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10280 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
10290 65 52 65 63 6f 72 64 2c 20 64 65 73 74 2e 69 53  eRecord, dest.iS
102a0 64 73 74 2c 20 64 65 73 74 2e 6e 53 64 73 74 2c  dst, dest.nSdst,
102b0 20 72 65 67 52 65 63 29 3b 0a 20 20 20 20 20 20   regRec);.      
102c0 73 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66 69  sqlite3TableAffi
102d0 6e 69 74 79 28 76 2c 20 70 2c 20 30 29 3b 0a 20  nity(v, p, 0);. 
102e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
102f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
10300 52 6f 77 69 64 2c 20 31 2c 20 72 65 67 52 6f 77  Rowid, 1, regRow
10310 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
10320 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
10330 4f 50 5f 49 6e 73 65 72 74 2c 20 31 2c 20 72 65  OP_Insert, 1, re
10340 67 52 65 63 2c 20 72 65 67 52 6f 77 69 64 29 3b  gRec, regRowid);
10350 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10360 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 49 6e  beGoto(v, addrIn
10370 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71  sLoop);.      sq
10380 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
10390 65 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70  e(v, addrInsLoop
103a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
103b0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
103c0 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20  _Close, 1);.    
103d0 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  }..    /* Comput
103e0 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  e the complete t
103f0 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
10400 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
10410 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
10420 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  {.      zStmt = 
10430 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
10440 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73  db, p);.    }els
10450 65 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a  e{.      Token *
10460 70 45 6e 64 32 20 3d 20 74 61 62 4f 70 74 73 20  pEnd2 = tabOpts 
10470 3f 20 26 70 50 61 72 73 65 2d 3e 73 4c 61 73 74  ? &pParse->sLast
10480 54 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20  Token : pEnd;.  
10490 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45      n = (int)(pE
104a0 6e 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d  nd2->z - pParse-
104b0 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a  >sNameToken.z);.
104c0 20 20 20 20 20 20 69 66 28 20 70 45 6e 64 32 2d        if( pEnd2-
104d0 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b  >z[0]!=';' ) n +
104e0 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20  = pEnd2->n;.    
104f0 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
10500 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20  3MPrintf(db, .  
10510 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
10520 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32  %s %.*s", zType2
10530 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61  , n, pParse->sNa
10540 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20  meToken.z.      
10550 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
10560 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20   A slot for the 
10570 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61  record has alrea
10580 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
10590 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a  d in the .    **
105a0 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
105b0 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e  able.  We just n
105c0 65 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68  eed to update th
105d0 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c  at slot with all
105e0 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f  .    ** the info
105f0 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f  rmation we've co
10600 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  llected..    */.
10610 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
10620 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
10630 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e       "UPDATE %Q.
10640 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53  %s ".         "S
10650 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61  ET type='%s', na
10660 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d  me=%Q, tbl_name=
10670 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25 64  %Q, rootpage=#%d
10680 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20  , sql=%Q ".     
10690 20 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23    "WHERE rowid=#
106a0 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61  %d",.      db->a
106b0 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
106c0 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20  , MASTER_NAME,. 
106d0 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20       zType,.    
106e0 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
106f0 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
10700 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f    pParse->regRoo
10710 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a  t,.      zStmt,.
10720 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65        pParse->re
10730 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20  gRowid.    );.  
10740 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
10750 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20  db, zStmt);.    
10760 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
10770 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
10780 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
10790 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
107a0 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63  MENT.    /* Chec
107b0 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e  k to see if we n
107c0 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e  eed to create an
107d0 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
107e0 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a   table for.    *
107f0 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20  * keeping track 
10800 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  of autoincrement
10810 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20   keys..    */.  
10820 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61    if( (p->tabFla
10830 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
10840 65 6d 65 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20  ement)!=0 ){.   
10850 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
10860 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20  ->aDb[iDb];.    
10870 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10880 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
10890 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
108a0 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
108b0 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d  Schema->pSeqTab=
108c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
108d0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
108e0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
108f0 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
10900 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
10910 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a  nce(name,seq)",.
10920 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a            pDb->z
10930 44 62 53 4e 61 6d 65 0a 20 20 20 20 20 20 20 20  DbSName.        
10940 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10950 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
10960 52 65 70 61 72 73 65 20 65 76 65 72 79 74 68 69  Reparse everythi
10970 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72  ng to update our
10980 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73   internal data s
10990 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20  tructures */.   
109a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
109b0 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20  arseSchemaOp(v, 
109c0 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
109d0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
109e0 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71  b, "tbl_name='%q
109f0 27 20 41 4e 44 20 74 79 70 65 21 3d 27 74 72 69  ' AND type!='tri
10a00 67 67 65 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65  gger'", p->zName
10a10 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ));.  }...  /* A
10a20 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  dd the table to 
10a30 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
10a40 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
10a50 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
10a60 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
10a70 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54 61  t.busy ){.    Ta
10a80 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53  ble *pOld;.    S
10a90 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
10aa0 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20   p->pSchema;.   
10ab0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10ac0 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
10ad0 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
10ae0 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65     pOld = sqlite
10af0 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53 63  3HashInsert(&pSc
10b00 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70  hema->tblHash, p
10b10 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a 20 20 20  ->zName, p);.   
10b20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20   if( pOld ){.   
10b30 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f     assert( p==pO
10b40 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ld );  /* Malloc
10b50 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
10b60 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73  d inside HashIns
10b70 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 73  ert() */.      s
10b80 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
10b90 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  b);.      return
10ba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
10bb0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
10bc0 30 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c  0;.    db->mDbFl
10bd0 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63  ags |= DBFLAG_Sc
10be0 68 65 6d 61 43 68 61 6e 67 65 3b 0a 0a 23 69 66  hemaChange;..#if
10bf0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10c00 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20  _ALTERTABLE.    
10c10 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20  if( !p->pSelect 
10c20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
10c30 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f  har *zName = (co
10c40 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61 72 73  nst char *)pPars
10c50 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b  e->sNameToken.z;
10c60 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65  .      int nName
10c70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10c80 21 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e  !pSelect && pCon
10c90 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20  s && pEnd );.   
10ca0 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d     if( pCons->z=
10cb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
10cc0 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20  ons = pEnd;.    
10cd0 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20    }.      nName 
10ce0 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73 74 20 63  = (int)((const c
10cf0 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d  har *)pCons->z -
10d00 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70   zName);.      p
10d10 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d  ->addColOffset =
10d20 20 31 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66   13 + sqlite3Utf
10d30 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20  8CharLen(zName, 
10d40 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65  nName);.    }.#e
10d50 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  ndif.  }.}..#ifn
10d60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10d70 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  VIEW./*.** The p
10d80 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
10d90 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65   routine in orde
10da0 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  r to create a ne
10db0 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73  w VIEW.*/.void s
10dc0 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77  qlite3CreateView
10dd0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
10de0 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e,     /* The pa
10df0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
10e00 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e  .  Token *pBegin
10e10 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
10e20 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
10e30 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d  egins the statem
10e40 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
10e50 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54  pName1,     /* T
10e60 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
10e70 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
10e80 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f  the view */.  To
10e90 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
10ea0 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68   /* The token th
10eb0 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  at holds the nam
10ec0 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f  e of the view */
10ed0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 4e  .  ExprList *pCN
10ee0 61 6d 65 73 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61  ames, /* Optiona
10ef0 6c 20 6c 69 73 74 20 6f 66 20 76 69 65 77 20 63  l list of view c
10f00 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
10f10 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
10f20 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20  ,   /* A SELECT 
10f30 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77  statement that w
10f40 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
10f50 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  ew view */.  int
10f60 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20   isTemp,        
10f70 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45  /* TRUE for a TE
10f80 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a  MPORARY view */.
10f90 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
10fa0 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73       /* Suppress
10fb0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
10fc0 69 66 20 56 49 45 57 20 61 6c 72 65 61 64 79 20  if VIEW already 
10fd0 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  exists */.){.  T
10fe0 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  able *p;.  int n
10ff0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
11000 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b  z;.  Token sEnd;
11010 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
11020 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  .  Token *pName 
11030 3d 20 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  = 0;.  int iDb;.
11040 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11050 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
11060 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e  f( pParse->nVar>
11070 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
11080 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11090 20 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65   "parameters are
110a0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20   not allowed in 
110b0 76 69 65 77 73 22 29 3b 0a 20 20 20 20 67 6f 74  views");.    got
110c0 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61  o create_view_fa
110d0 69 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  il;.  }.  sqlite
110e0 33 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72  3StartTable(pPar
110f0 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
11100 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30  e2, isTemp, 1, 0
11110 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20  , noErr);.  p = 
11120 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
11130 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  e;.  if( p==0 ||
11140 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
11150 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77  goto create_view
11160 5f 66 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33  _fail;.  sqlite3
11170 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
11180 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
11190 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69  e2, &pName);.  i
111a0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
111b0 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d  maToIndex(db, p-
111c0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c  >pSchema);.  sql
111d0 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
111e0 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20  x, pParse, iDb, 
111f0 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 3b 0a  "view", pName);.
11200 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78    if( sqlite3Fix
11210 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53  Select(&sFix, pS
11220 65 6c 65 63 74 29 20 29 20 67 6f 74 6f 20 63 72  elect) ) goto cr
11230 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a  eate_view_fail;.
11240 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70  .  /* Make a cop
11250 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  y of the entire 
11260 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11270 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
11280 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69  e view..  ** Thi
11290 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c  s will force all
112a0 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e   the Expr.token.
112b0 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64  z values to be d
112c0 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20  ynamically.  ** 
112d0 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72  allocated rather
112e0 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74   than point to t
112f0 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  he input string 
11300 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  - which means th
11310 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c  at.  ** they wil
11320 6c 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20  l persist after 
11330 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69  the current sqli
11340 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20  te3_exec() call 
11350 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20  returns..  */.  
11360 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  p->pSelect = sql
11370 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
11380 2c 20 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44  , pSelect, EXPRD
11390 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 70 2d  UP_REDUCE);.  p-
113a0 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65  >pCheck = sqlite
113b0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
113c0 20 70 43 4e 61 6d 65 73 2c 20 45 58 50 52 44 55   pCNames, EXPRDU
113d0 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 69 66 28  P_REDUCE);.  if(
113e0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
113f0 64 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f  d ) goto create_
11400 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a  view_fail;..  /*
11410 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20   Locate the end 
11420 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49  of the CREATE VI
11430 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d  EW statement.  M
11440 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74  ake sEnd point t
11450 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a  o.  ** the end..
11460 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50    */.  sEnd = pP
11470 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
11480 3b 0a 20 20 61 73 73 65 72 74 28 20 73 45 6e 64  ;.  assert( sEnd
11490 2e 7a 5b 30 5d 21 3d 30 20 7c 7c 20 73 45 6e 64  .z[0]!=0 || sEnd
114a0 2e 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  .n==0 );.  if( s
114b0 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b  End.z[0]!=';' ){
114c0 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73  .    sEnd.z += s
114d0 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e  End.n;.  }.  sEn
114e0 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28  d.n = 0;.  n = (
114f0 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70 42  int)(sEnd.z - pB
11500 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 61 73 73 65  egin->z);.  asse
11510 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 7a 20 3d  rt( n>0 );.  z =
11520 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68   pBegin->z;.  wh
11530 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70  ile( sqlite3Issp
11540 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e  ace(z[n-1]) ){ n
11550 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d  --; }.  sEnd.z =
11560 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64   &z[n-1];.  sEnd
11570 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73  .n = 1;..  /* Us
11580 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
11590 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76  e() to add the v
115a0 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54  iew to the SQLIT
115b0 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a  E_MASTER table *
115c0 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61  /.  sqlite3EndTa
115d0 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26  ble(pParse, 0, &
115e0 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 0a 63 72  sEnd, 0, 0);..cr
115f0 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3a 0a  eate_view_fail:.
11600 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
11610 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
11620 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
11630 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
11640 70 43 4e 61 6d 65 73 29 3b 0a 20 20 72 65 74 75  pCNames);.  retu
11650 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
11660 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
11670 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
11680 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
11690 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
116a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
116b0 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20  UALTABLE)./*.** 
116c0 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
116d0 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65  ure pTable is re
116e0 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69  ally a VIEW.  Fi
116f0 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20  ll in the names 
11700 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  of.** the column
11710 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e  s of the view in
11720 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75   the pTable stru
11730 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74  cture.  Return t
11740 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
11750 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65  errors.  If an e
11760 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61  rror is seen lea
11770 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
11780 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
11790 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
117a0 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
117b0 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a  umnNames(Parse *
117c0 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
117d0 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20  Table){.  Table 
117e0 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41  *pSelTab;   /* A
117f0 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d   fake table from
11800 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74 68   which we get th
11810 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
11820 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
11830 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74      /* Copy of t
11840 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  he SELECT that i
11850 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
11860 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72  ew */.  int nErr
11870 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d   = 0;     /* Num
11880 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e  ber of errors en
11890 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69  countered */.  i
118a0 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
118b0 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20   /* Temporarily 
118c0 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72  holds the number
118d0 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73 69   of cursors assi
118e0 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  gned */.  sqlite
118f0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
11900 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  db;  /* Database
11910 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20   connection for 
11920 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f  malloc errors */
11930 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11940 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
11950 45 09 0a 20 20 69 6e 74 20 72 63 3b 0a 23 65 6e  E..  int rc;.#en
11960 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
11970 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
11980 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f  ATION.  sqlite3_
11990 78 61 75 74 68 20 78 41 75 74 68 3b 20 20 20 20  xauth xAuth;    
119a0 20 20 20 2f 2a 20 53 61 76 65 64 20 78 41 75 74     /* Saved xAut
119b0 68 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 23 65 6e  h pointer */.#en
119c0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
119d0 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65  Table );..#ifnde
119e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
119f0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 64 62 2d  RTUALTABLE.  db-
11a00 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 2b 2b 3b 0a  >nSchemaLock++;.
11a10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
11a20 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50  abCallConnect(pP
11a30 61 72 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a 20  arse, pTable);. 
11a40 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b   db->nSchemaLock
11a50 2d 2d 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  --;.  if( rc ){.
11a60 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
11a70 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  }.  if( IsVirtua
11a80 6c 28 70 54 61 62 6c 65 29 20 29 20 72 65 74 75  l(pTable) ) retu
11a90 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  rn 0;.#endif..#i
11aa0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11ab0 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f  T_VIEW.  /* A po
11ac0 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e  sitive nCol mean
11ad0 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61  s the columns na
11ae0 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65  mes for this vie
11af0 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61  w are.  ** alrea
11b00 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20  dy known..  */. 
11b10 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
11b20 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  l>0 ) return 0;.
11b30 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65  .  /* A negative
11b40 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69   nCol is a speci
11b50 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e  al marker meanin
11b60 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75  g that we are cu
11b70 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79  rrently.  ** try
11b80 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  ing to compute t
11b90 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  he column names.
11ba0 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68    If we enter th
11bb0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a  is routine with.
11bc0 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20    ** a negative 
11bd0 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  nCol, it means t
11be0 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73  wo or more views
11bf0 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69   form a loop, li
11c00 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  ke this:.  **.  
11c10 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
11c20 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54  EW one AS SELECT
11c30 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a   * FROM two;.  *
11c40 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
11c50 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20  W two AS SELECT 
11c60 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a  * FROM one;.  **
11c70 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
11c80 74 68 65 20 65 72 72 6f 72 20 61 62 6f 76 65 20  the error above 
11c90 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72  is now caught pr
11ca0 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20  ior to reaching 
11cb0 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a  this point..  **
11cc0 20 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69   But the followi
11cd0 6e 67 20 74 65 73 74 20 69 73 20 73 74 69 6c 6c  ng test is still
11ce0 20 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 69 74   important as it
11cf0 20 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20 20   does come up.  
11d00 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ** in the follow
11d10 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ing:.  ** .  ** 
11d20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
11d30 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20   main.ex1(a);.  
11d40 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 45  **     CREATE TE
11d50 4d 50 20 56 49 45 57 20 65 78 31 20 41 53 20 53  MP VIEW ex1 AS S
11d60 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 78 31  ELECT a FROM ex1
11d70 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  ;.  **     SELEC
11d80 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78  T * FROM temp.ex
11d90 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  1;.  */.  if( pT
11da0 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a  able->nCol<0 ){.
11db0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11dc0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65  Msg(pParse, "vie
11dd0 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72  w %s is circular
11de0 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61  ly defined", pTa
11df0 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  ble->zName);.   
11e00 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
11e10 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
11e20 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f  >nCol>=0 );..  /
11e30 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
11e40 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77   far, it means w
11e50 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  e need to comput
11e60 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  e the table name
11e70 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  s..  ** Note tha
11e80 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  t the call to sq
11e90 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
11ea0 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78  Select() will ex
11eb0 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a  pand any.  ** "*
11ec0 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  " elements in th
11ed0 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66  e results set of
11ee0 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77 69   the view and wi
11ef0 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72  ll assign cursor
11f00 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c  s.  ** to the el
11f10 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52  ements of the FR
11f20 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20  OM clause.  But 
11f30 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  we do not want t
11f40 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a  hese changes.  *
11f50 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e  * to be permanen
11f60 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75  t.  So the compu
11f70 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f  tation is done o
11f80 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  n a copy of the 
11f90 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74  SELECT.  ** stat
11fa0 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e  ement that defin
11fb0 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a  es the view..  *
11fc0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
11fd0 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20  le->pSelect );. 
11fe0 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53   pSel = sqlite3S
11ff0 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61  electDup(db, pTa
12000 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  ble->pSelect, 0)
12010 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a  ;.  if( pSel ){.
12020 20 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e      n = pParse->
12030 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  nTab;.    sqlite
12040 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
12050 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53  rsors(pParse, pS
12060 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70  el->pSrc);.    p
12070 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31  Table->nCol = -1
12080 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
12090 69 64 65 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a  ide.bDisable++;.
120a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
120b0 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
120c0 4e 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64 62  N.    xAuth = db
120d0 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d  ->xAuth;.    db-
120e0 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20  >xAuth = 0;.    
120f0 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
12100 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
12110 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29  ct(pParse, pSel)
12120 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20  ;.    db->xAuth 
12130 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20  = xAuth;.#else. 
12140 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
12150 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
12160 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
12170 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  el);.#endif.    
12180 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e  pParse->nTab = n
12190 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  ;.    if( pTable
121a0 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20  ->pCheck ){.    
121b0 20 20 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57    /* CREATE VIEW
121c0 20 6e 61 6d 65 28 61 72 67 6c 69 73 74 29 20 41   name(arglist) A
121d0 53 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 54  S ....      ** T
121e0 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
121f0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
12200 61 62 6c 65 20 61 72 65 20 74 61 6b 65 6e 20 66  able are taken f
12210 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 61 72 67  rom.      ** arg
12220 6c 69 73 74 20 77 68 69 63 68 20 69 73 20 73 74  list which is st
12230 6f 72 65 64 20 69 6e 20 70 54 61 62 6c 65 2d 3e  ored in pTable->
12240 70 43 68 65 63 6b 2e 20 20 54 68 65 20 70 43 68  pCheck.  The pCh
12250 65 63 6b 20 66 69 65 6c 64 0a 20 20 20 20 20 20  eck field.      
12260 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 68 6f 6c 64  ** normally hold
12270 73 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  s CHECK constrai
12280 6e 74 73 20 6f 6e 20 61 6e 20 6f 72 64 69 6e 61  nts on an ordina
12290 72 79 20 74 61 62 6c 65 2c 20 62 75 74 20 66 6f  ry table, but fo
122a0 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 56 49 45  r.      ** a VIE
122b0 57 20 69 74 20 68 6f 6c 64 73 20 74 68 65 20 6c  W it holds the l
122c0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61  ist of column na
122d0 6d 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mes..      */.  
122e0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
122f0 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
12300 50 61 72 73 65 2c 20 70 54 61 62 6c 65 2d 3e 70  Parse, pTable->p
12310 43 68 65 63 6b 2c 20 0a 20 20 20 20 20 20 20 20  Check, .        
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12330 20 20 20 20 20 20 20 20 20 26 70 54 61 62 6c 65           &pTable
12340 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 6c 65 2d  ->nCol, &pTable-
12350 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66  >aCol);.      if
12360 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
12370 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26  ed==0 .       &&
12380 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
12390 0a 20 20 20 20 20 20 20 26 26 20 70 54 61 62 6c  .       && pTabl
123a0 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 2d 3e 70  e->nCol==pSel->p
123b0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20  EList->nExpr.   
123c0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
123d0 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f  lite3SelectAddCo
123e0 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
123f0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
12400 62 6c 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ble, pSel);.    
12410 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
12420 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20  ( pSelTab ){.   
12430 20 20 20 2f 2a 20 43 52 45 41 54 45 20 56 49 45     /* CREATE VIE
12440 57 20 6e 61 6d 65 20 41 53 2e 2e 2e 20 20 77 69  W name AS...  wi
12450 74 68 6f 75 74 20 61 6e 20 61 72 67 75 6d 65 6e  thout an argumen
12460 74 20 6c 69 73 74 2e 20 20 43 6f 6e 73 74 72 75  t list.  Constru
12470 63 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ct.      ** the 
12480 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
12490 6d 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  m the SELECT sta
124a0 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
124b0 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
124c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
124d0 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f  ert( pTable->aCo
124e0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54  l==0 );.      pT
124f0 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65  able->nCol = pSe
12500 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
12510 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d    pTable->aCol =
12520 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a   pSelTab->aCol;.
12530 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e        pSelTab->n
12540 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Col = 0;.      p
12550 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30  SelTab->aCol = 0
12560 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12570 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
12580 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 54  exHeld(db, 0, pT
12590 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20 29  able->pSchema) )
125a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
125b0 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
125c0 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b  = 0;.      nErr+
125d0 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  +;.    }.    sql
125e0 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
125f0 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  db, pSelTab);.  
12600 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
12610 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b  elete(db, pSel);
12620 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
12630 64 65 2e 62 44 69 73 61 62 6c 65 2d 2d 3b 0a 20  de.bDisable--;. 
12640 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45   } else {.    nE
12650 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rr++;.  }.  pTab
12660 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68  le->pSchema->sch
12670 65 6d 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55  emaFlags |= DB_U
12680 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 23 65 6e  nresetViews;.#en
12690 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
126a0 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74  IT_VIEW */.  ret
126b0 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65  urn nErr;  .}.#e
126c0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
126d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
126e0 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
126f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
12700 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66  ALTABLE) */..#if
12710 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12720 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  _VIEW./*.** Clea
12730 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
12740 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49  es from every VI
12750 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  EW in database i
12760 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  dx..*/.static vo
12770 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  id sqliteViewRes
12780 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64  etAll(sqlite3 *d
12790 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48  b, int idx){.  H
127a0 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73  ashElem *i;.  as
127b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
127c0 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
127d0 20 69 64 78 2c 20 30 29 20 29 3b 0a 20 20 69 66   idx, 0) );.  if
127e0 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79  ( !DbHasProperty
127f0 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
12800 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74  esetViews) ) ret
12810 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  urn;.  for(i=sql
12820 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
12830 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65  ->aDb[idx].pSche
12840 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b  ma->tblHash); i;
12850 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
12860 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  (i)){.    Table 
12870 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
12880 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69  shData(i);.    i
12890 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
128a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
128b0 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d  3DeleteColumnNam
128c0 65 73 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  es(db, pTab);.  
128d0 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d      pTab->aCol =
128e0 20 30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   0;.      pTab->
128f0 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  nCol = 0;.    }.
12900 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f    }.  DbClearPro
12910 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
12920 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b  B_UnresetViews);
12930 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
12940 65 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  e sqliteViewRese
12950 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66  tAll(A,B).#endif
12960 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
12970 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  VIEW */../*.** T
12980 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12990 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44  called by the VD
129a0 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  BE to adjust the
129b0 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
129c0 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69  .** used by SQLi
129d0 74 65 20 77 68 65 6e 20 74 68 65 20 62 74 72 65  te when the btre
129e0 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20  e layer moves a 
129f0 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e  table root page.
12a00 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67   The.** root-pag
12a10 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  e of a table or 
12a20 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61 73  index in databas
12a30 65 20 69 44 62 20 68 61 73 20 63 68 61 6e 67 65  e iDb has change
12a40 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20  d from iFrom.** 
12a50 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69  to iTo..**.** Ti
12a60 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68 65  cket #1728:  The
12a70 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69   symbol table mi
12a80 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69  ght still contai
12a90 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  n information.**
12aa0 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f   on tables and/o
12ab0 72 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 61  r indices that a
12ac0 72 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f  re the process o
12ad0 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e  f being deleted.
12ae0 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75  .** If you are u
12af0 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74  nlucky, one of t
12b00 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64  hose deleted ind
12b10 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d  ices or tables m
12b20 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65  ight.** have the
12b30 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e   same rootpage n
12b40 75 6d 62 65 72 20 61 73 20 74 68 65 20 72 65 61  umber as the rea
12b50 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  l table or index
12b60 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e   that is.** bein
12b70 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20  g moved.  So we 
12b80 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72  cannot stop sear
12b90 63 68 69 6e 67 20 61 66 74 65 72 20 74 68 65 20  ching after the 
12ba0 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20  first match .** 
12bb0 62 65 63 61 75 73 65 20 74 68 65 20 66 69 72 73  because the firs
12bc0 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65  t match might be
12bd0 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
12be0 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a  deleted indices.
12bf0 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64  ** or tables and
12c00 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69   not the table/i
12c10 6e 64 65 78 20 74 68 61 74 20 69 73 20 61 63 74  ndex that is act
12c20 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65  ually being move
12c30 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f  d..** We must co
12c40 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75  ntinue looping u
12c50 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20  ntil all tables 
12c60 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74 68  and indices with
12c70 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46  .** rootpage==iF
12c80 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f  rom have been co
12c90 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76 65 20  nverted to have 
12ca0 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54  a rootpage of iT
12cb0 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  o.** in order to
12cc0 20 62 65 20 63 65 72 74 61 69 6e 20 74 68 61 74   be certain that
12cd0 20 77 65 20 67 6f 74 20 74 68 65 20 72 69 67 68   we got the righ
12ce0 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  t one..*/.#ifnde
12cf0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12d00 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71  TOVACUUM.void sq
12d10 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76  lite3RootPageMov
12d20 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ed(sqlite3 *db, 
12d30 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 46 72  int iDb, int iFr
12d40 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20  om, int iTo){.  
12d50 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b  HashElem *pElem;
12d60 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a  .  Hash *pHash;.
12d70 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73    Db *pDb;..  as
12d80 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
12d90 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
12da0 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 44   iDb, 0) );.  pD
12db0 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
12dc0 5d 3b 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44  ];.  pHash = &pD
12dd0 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
12de0 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  ash;.  for(pElem
12df0 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
12e00 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20  (pHash); pElem; 
12e10 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
12e20 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
12e30 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
12e40 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
12e50 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Elem);.    if( p
12e60 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d  Tab->tnum==iFrom
12e70 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
12e80 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20  tnum = iTo;.    
12e90 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20  }.  }.  pHash = 
12ea0 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69  &pDb->pSchema->i
12eb0 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45  dxHash;.  for(pE
12ec0 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
12ed0 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
12ee0 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
12ef0 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
12f00 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
12f10 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
12f20 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
12f30 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pIdx->tnum==iF
12f40 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64  rom ){.      pId
12f50 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  x->tnum = iTo;. 
12f60 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
12f70 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63  f../*.** Write c
12f80 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 68 65  ode to erase the
12f90 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
12fa0 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f  -page iTable fro
12fb0 6d 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a  m database iDb..
12fc0 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f  ** Also write co
12fd0 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  de to modify the
12fe0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
12ff0 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61  able and interna
13000 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61  l schema.** if a
13010 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e   root-page of an
13020 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d  other table is m
13030 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65  oved by the btre
13040 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a  e-layer whilst.*
13050 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65  * erasing iTable
13060 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65   (this can happe
13070 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76  n with an auto-v
13080 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e  acuum database).
13090 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
130a0 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
130b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
130c0 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20  int iTable, int 
130d0 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  iDb){.  Vdbe *v 
130e0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
130f0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
13100 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
13110 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
13120 20 20 61 73 73 65 72 74 28 20 69 54 61 62 6c 65    assert( iTable
13130 3e 31 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  >1 );.  sqlite3V
13140 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
13150 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c  Destroy, iTable,
13160 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c   r1, iDb);.  sql
13170 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
13180 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  rse);.#ifndef SQ
13190 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
131a0 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73  CUUM.  /* OP_Des
131b0 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69  troy stores an i
131c0 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66  n integer r1. If
131d0 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20   this integer.  
131e0 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ** is non-zero, 
131f0 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
13200 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
13210 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64  of a table moved
13220 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f   to.  ** locatio
13230 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f  n iTable. The fo
13240 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64  llowing code mod
13250 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65  ifies the sqlite
13260 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f  _master table to
13270 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  .  ** reflect th
13280 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  is..  **.  ** Th
13290 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20  e "#NNN" in the 
132a0 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c  SQL is a special
132b0 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d   constant that m
132c0 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61  eans whatever va
132d0 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72  lue.  ** is in r
132e0 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65  egister NNN.  Se
132f0 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20  e grammar rules 
13300 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
13310 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a  the TK_REGISTER.
13320 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61    ** token for a
13330 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
13340 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71  ation..  */.  sq
13350 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
13360 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22  (pParse, .     "
13370 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54  UPDATE %Q.%s SET
13380 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45   rootpage=%d WHE
13390 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70  RE #%d AND rootp
133a0 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70  age=#%d",.     p
133b0 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
133c0 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41  Db].zDbSName, MA
133d0 53 54 45 52 5f 4e 41 4d 45 2c 20 69 54 61 62 6c  STER_NAME, iTabl
133e0 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64  e, r1, r1);.#end
133f0 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  if.  sqlite3Rele
13400 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
13410 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e, r1);.}../*.**
13420 20 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65   Write VDBE code
13430 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20   to erase table 
13440 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73  pTab and all ass
13450 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20  ociated indices 
13460 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65  on disk..** Code
13470 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73   to update the s
13480 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
13490 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  les and internal
134a0 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69   schema definiti
134b0 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61  ons.** in case a
134c0 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e   root-page belon
134d0 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20  ging to another 
134e0 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
134f0 79 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  y the btree laye
13500 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64  r.** is also add
13510 65 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  ed (this can hap
13520 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
13530 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
13540 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
13550 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50  d destroyTable(P
13560 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
13570 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 2f 2a  ble *pTab){.  /*
13580 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
13590 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63   may be auto-vac
135a0 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20  uum capable (if 
135b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
135c0 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e  VACUUM.  ** is n
135d0 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65  ot defined), the
135e0 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  n it is importan
135f0 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73  t to call OP_Des
13600 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  troy on the.  **
13610 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
13620 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f   root-pages in o
13630 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77  rder, starting w
13640 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61  ith the numerica
13650 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73  lly .  ** larges
13660 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
13670 65 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  er. This guarant
13680 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66  ees that none of
13690 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a   the root-pages.
136a0 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72    ** to be destr
136b0 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65  oyed is relocate
136c0 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
136d0 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e  OP_Destroy. i.e.
136e0 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c   if the.  ** fol
136f0 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65  lowing were code
13700 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f  d:.  **.  ** OP_
13710 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a  Destroy 4 0.  **
13720 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73   ....  ** OP_Des
13730 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20  troy 5 0.  **.  
13740 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  ** and root page
13750 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62   5 happened to b
13760 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  e the largest ro
13770 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69  ot-page number i
13780 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
13790 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70  ase, then root p
137a0 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d  age 5 would be m
137b0 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62  oved to page 4 b
137c0 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f  y the .  ** "OP_
137d0 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63  Destroy 4 0" opc
137e0 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75  ode. The subsequ
137f0 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20  ent "OP_Destroy 
13800 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20  5 0" would hit. 
13810 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20   ** a free-list 
13820 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  page..  */.  int
13830 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e   iTab = pTab->tn
13840 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72  um;.  int iDestr
13850 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69  oyed = 0;..  whi
13860 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64  le( 1 ){.    Ind
13870 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e  ex *pIdx;.    in
13880 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a  t iLargest = 0;.
13890 0a 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f  .    if( iDestro
138a0 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69  yed==0 || iTab<i
138b0 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20  Destroyed ){.   
138c0 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54     iLargest = iT
138d0 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ab;.    }.    fo
138e0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
138f0 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
13900 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
13910 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70      int iIdx = p
13920 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  Idx->tnum;.     
13930 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70   assert( pIdx->p
13940 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
13950 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69  chema );.      i
13960 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d  f( (iDestroyed==
13970 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74  0 || (iIdx<iDest
13980 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e  royed)) && iIdx>
13990 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20  iLargest ){.    
139a0 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69      iLargest = i
139b0 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Idx;.      }.   
139c0 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67   }.    if( iLarg
139d0 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  est==0 ){.      
139e0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73  return;.    }els
139f0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  e{.      int iDb
13a00 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
13a10 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
13a20 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
13a30 61 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  a);.      assert
13a40 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
13a50 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20  pParse->db->nDb 
13a60 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79  );.      destroy
13a70 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
13a80 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b   iLargest, iDb);
13a90 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f 79 65  .      iDestroye
13aa0 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20  d = iLargest;.  
13ab0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
13ac0 20 52 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20   Remove entries 
13ad0 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f  from the sqlite_
13ae0 73 74 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f  statN tables (fo
13af0 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a  r N in (1,2,3)).
13b00 2a 2a 20 61 66 74 65 72 20 61 20 44 52 4f 50 20  ** after a DROP 
13b10 49 4e 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41  INDEX or DROP TA
13b20 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  BLE command..*/.
13b30 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
13b40 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c  te3ClearStatTabl
13b50 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
13b60 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
13b70 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
13b80 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ext */.  int iDb
13b90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13ba0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
13bb0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73  number */.  cons
13bc0 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20  t char *zType,  
13bd0 20 20 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22     /* "idx" or "
13be0 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tbl" */.  const 
13bf0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20  char *zName     
13c00 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65   /* Name of inde
13c10 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  x or table */.){
13c20 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
13c30 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20  t char *zDbName 
13c40 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  = pParse->db->aD
13c50 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  b[iDb].zDbSName;
13c60 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 34  .  for(i=1; i<=4
13c70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
13c80 20 7a 54 61 62 5b 32 34 5d 3b 0a 20 20 20 20 73   zTab[24];.    s
13c90 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
13ca0 73 69 7a 65 6f 66 28 7a 54 61 62 29 2c 7a 54 61  sizeof(zTab),zTa
13cb0 62 2c 22 73 71 6c 69 74 65 5f 73 74 61 74 25 64  b,"sqlite_stat%d
13cc0 22 2c 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ",i);.    if( sq
13cd0 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70  lite3FindTable(p
13ce0 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54 61 62 2c  Parse->db, zTab,
13cf0 20 7a 44 62 4e 61 6d 65 29 20 29 7b 0a 20 20 20   zDbName) ){.   
13d00 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
13d10 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
13d20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
13d30 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 25  OM %Q.%s WHERE %
13d40 73 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 7a  s=%Q",.        z
13d50 44 62 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 54  DbName, zTab, zT
13d60 79 70 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20  ype, zName.     
13d70 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   );.    }.  }.}.
13d80 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
13d90 63 6f 64 65 20 74 6f 20 64 72 6f 70 20 61 20 74  code to drop a t
13da0 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
13db0 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62  lite3CodeDropTab
13dc0 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
13dd0 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69  , Table *pTab, i
13de0 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 73 56 69  nt iDb, int isVi
13df0 65 77 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ew){.  Vdbe *v;.
13e00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
13e10 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72  pParse->db;.  Tr
13e20 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
13e30 0a 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  .  Db *pDb = &db
13e40 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 76  ->aDb[iDb];..  v
13e50 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
13e60 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
13e70 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73  ert( v!=0 );.  s
13e80 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
13e90 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
13ea0 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  , 1, iDb);..#ifn
13eb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13ec0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
13ed0 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
13ee0 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
13ef0 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
13f00 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 7d 0a 23  P_VBegin);.  }.#
13f10 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70  endif..  /* Drop
13f20 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73   all triggers as
13f30 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
13f40 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
13f50 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 2a 2a  opped. Code.  **
13f60 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f   is generated to
13f70 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20   remove entries 
13f80 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74  from sqlite_mast
13f90 65 72 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73  er and/or.  ** s
13fa0 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
13fb0 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20  r if required.. 
13fc0 20 2a 2f 0a 20 20 70 54 72 69 67 67 65 72 20 3d   */.  pTrigger =
13fd0 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c   sqlite3TriggerL
13fe0 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ist(pParse, pTab
13ff0 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72 69  );.  while( pTri
14000 67 67 65 72 20 29 7b 0a 20 20 20 20 61 73 73 65  gger ){.    asse
14010 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53  rt( pTrigger->pS
14020 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
14030 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20  hema || .       
14040 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
14050 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
14060 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71  Schema );.    sq
14070 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72  lite3DropTrigger
14080 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69  Ptr(pParse, pTri
14090 67 67 65 72 29 3b 0a 20 20 20 20 70 54 72 69 67  gger);.    pTrig
140a0 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e  ger = pTrigger->
140b0 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e  pNext;.  }..#ifn
140c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
140d0 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
140e0 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e  /* Remove any en
140f0 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c  tries of the sql
14100 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
14110 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
14120 74 68 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  th.  ** the tabl
14130 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
14140 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
14150 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20 69  fore the table i
14160 73 20 64 72 6f 70 70 65 64 0a 20 20 2a 2a 20 61  s dropped.  ** a
14170 74 20 74 68 65 20 62 74 72 65 65 20 6c 65 76 65  t the btree leve
14180 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  l, in case the s
14190 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
141a0 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20  able needs to.  
141b0 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73  ** move as a res
141c0 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20  ult of the drop 
141d0 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61  (can happen in a
141e0 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29  uto-vacuum mode)
141f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
14200 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
14210 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29  _Autoincrement )
14220 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  {.    sqlite3Nes
14230 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
14240 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46  .      "DELETE F
14250 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 65  ROM %Q.sqlite_se
14260 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d  quence WHERE nam
14270 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 70 44 62  e=%Q",.      pDb
14280 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 70 54 61 62  ->zDbSName, pTab
14290 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  ->zName.    );. 
142a0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
142b0 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f  Drop all SQLITE_
142c0 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64  MASTER table and
142d0 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74   index entries t
142e0 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
142f0 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65  .  ** table. The
14300 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f   program name lo
14310 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ops through the 
14320 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
14330 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a 20 65 76   deletes.  ** ev
14340 65 72 79 20 72 6f 77 20 74 68 61 74 20 72 65 66  ery row that ref
14350 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f  ers to a table o
14360 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  f the same name 
14370 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67  as the one being
14380 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54  .  ** dropped. T
14390 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64  riggers are hand
143a0 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 20 62  led separately b
143b0 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72  ecause a trigger
143c0 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 63 72 65   can be.  ** cre
143d0 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70  ated in the temp
143e0 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 72   database that r
143f0 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
14400 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a   in another.  **
14410 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
14420 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
14430 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
14440 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
14450 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c   %Q.%s WHERE tbl
14460 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70  _name=%Q and typ
14470 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20  e!='trigger'",. 
14480 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61       pDb->zDbSNa
14490 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c  me, MASTER_NAME,
144a0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
144b0 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
144c0 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
144d0 20 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 54   ){.    destroyT
144e0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
144f0 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  b);.  }..  /* Re
14500 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65  move the table e
14510 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65  ntry from SQLite
14520 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  's internal sche
14530 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20  ma and modify.  
14540 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  ** the schema co
14550 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  okie..  */.  if(
14560 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
14570 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
14580 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
14590 56 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30  VDestroy, iDb, 0
145a0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
145b0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
145c0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
145d0 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69   OP_DropTable, i
145e0 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e  Db, 0, 0, pTab->
145f0 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c  zName, 0);.  sql
14600 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
14610 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
14620 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
14630 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d 0a  All(db, iDb);.}.
14640 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
14650 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
14660 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   do the work of 
14670 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61  a DROP TABLE sta
14680 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65  tement..** pName
14690 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
146a0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
146b0 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64  dropped..*/.void
146c0 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c   sqlite3DropTabl
146d0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
146e0 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
146f0 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e 74   int isView, int
14700 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c 65   noErr){.  Table
14710 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a   *pTab;.  Vdbe *
14720 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
14730 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
14740 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28   int iDb;..  if(
14750 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
14760 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
14770 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
14780 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
14790 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a  rse->nErr==0 );.
147a0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
147b0 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66  >nSrc==1 );.  if
147c0 28 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  ( sqlite3ReadSch
147d0 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
147e0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
147f0 6c 65 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20  le;.  if( noErr 
14800 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72  ) db->suppressEr
14810 72 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 69  r++;.  assert( i
14820 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69  sView==0 || isVi
14830 65 77 3d 3d 4c 4f 43 41 54 45 5f 56 49 45 57 20  ew==LOCATE_VIEW 
14840 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  );.  pTab = sqli
14850 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74  te3LocateTableIt
14860 65 6d 28 70 50 61 72 73 65 2c 20 69 73 56 69 65  em(pParse, isVie
14870 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d 29  w, &pName->a[0])
14880 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20  ;.  if( noErr ) 
14890 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2d  db->suppressErr-
148a0 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  -;..  if( pTab==
148b0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45  0 ){.    if( noE
148c0 72 72 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65  rr ) sqlite3Code
148d0 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d  VerifyNamedSchem
148e0 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d  a(pParse, pName-
148f0 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
14900 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
14910 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
14920 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
14930 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
14940 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
14950 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
14960 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
14970 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61   );..  /* If pTa
14980 62 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74  b is a virtual t
14990 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77 47  able, call ViewG
149a0 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20  etColumnNames() 
149b0 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69  to ensure.  ** i
149c0 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  t is initialized
149d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  ..  */.  if( IsV
149e0 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20  irtual(pTab) && 
149f0 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
14a00 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
14a10 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67  , pTab) ){.    g
14a20 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
14a30 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  ble;.  }.#ifndef
14a40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
14a50 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
14a60 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
14a70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
14a80 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
14a90 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74  (iDb);.    const
14aa0 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
14ab0 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
14ac0 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
14ad0 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20  ar *zArg2 = 0;. 
14ae0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
14af0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
14b00 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
14b10 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20  Tab, 0, zDb)){. 
14b20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
14b30 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
14b40 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
14b50 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  ){.      if( !OM
14b60 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
14b70 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
14b80 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
14b90 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  P_TEMP_VIEW;.   
14ba0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14bb0 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
14bc0 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  DROP_VIEW;.     
14bd0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
14be0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
14bf0 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  BLE.    }else if
14c00 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
14c10 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 20  ) ){.      code 
14c20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  = SQLITE_DROP_VT
14c30 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72 67  ABLE;.      zArg
14c40 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  2 = sqlite3GetVT
14c50 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 2d 3e  able(db, pTab)->
14c60 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e  pMod->zName;.#en
14c70 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
14c80 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
14c90 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
14ca0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
14cb0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
14cc0 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
14cd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
14ce0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
14cf0 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
14d00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
14d10 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
14d20 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
14d30 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32  ab->zName, zArg2
14d40 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
14d50 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
14d60 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
14d70 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
14d80 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
14d90 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62  ITE_DELETE, pTab
14da0 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
14db0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
14dc0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
14dd0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
14de0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
14df0 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
14e00 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
14e10 29 3d 3d 30 20 0a 20 20 20 20 26 26 20 73 71 6c  )==0 .    && sql
14e20 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
14e30 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
14e40 65 5f 73 74 61 74 22 2c 20 31 31 29 21 3d 30 20  e_stat", 11)!=0 
14e50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
14e60 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
14e70 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
14e80 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54   be dropped", pT
14e90 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
14ea0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
14eb0 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  able;.  }..#ifnd
14ec0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
14ed0 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  IEW.  /* Ensure 
14ee0 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f  DROP TABLE is no
14ef0 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77  t used on a view
14f00 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20  , and DROP VIEW 
14f10 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a  is not used.  **
14f20 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a   on a table..  *
14f30 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26  /.  if( isView &
14f40 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  & pTab->pSelect=
14f50 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
14f60 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14f70 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c  , "use DROP TABL
14f80 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c  E to delete tabl
14f90 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  e %s", pTab->zNa
14fa0 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
14fb0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
14fc0 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77   }.  if( !isView
14fd0 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
14fe0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
14ff0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15000 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20   "use DROP VIEW 
15010 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25  to delete view %
15020 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
15030 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
15040 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
15050 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
15060 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
15070 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66  move the table f
15080 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
15090 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73  able.  ** on dis
150a0 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  k..  */.  v = sq
150b0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
150c0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
150d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
150e0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
150f0 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
15100 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61  .    sqlite3Clea
15110 72 53 74 61 74 54 61 62 6c 65 73 28 70 50 61 72  rStatTables(pPar
15120 73 65 2c 20 69 44 62 2c 20 22 74 62 6c 22 2c 20  se, iDb, "tbl", 
15130 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
15140 20 20 73 71 6c 69 74 65 33 46 6b 44 72 6f 70 54    sqlite3FkDropT
15150 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61  able(pParse, pNa
15160 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 73  me, pTab);.    s
15170 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61  qlite3CodeDropTa
15180 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
15190 2c 20 69 44 62 2c 20 69 73 56 69 65 77 29 3b 0a  , iDb, isView);.
151a0 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74    }..exit_drop_t
151b0 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53  able:.  sqlite3S
151c0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
151d0 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pName);.}../*.*
151e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
151f0 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
15200 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e  te a new foreign
15210 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c   key on the tabl
15220 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  e.** currently u
15230 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
15240 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74  n.  pFromCol det
15250 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f  ermines which co
15260 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
15270 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f  current table po
15280 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69  int to the forei
15290 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f  gn key.  If pFro
152a0 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  mCol==0 then.** 
152b0 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20  connect the key 
152c0 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  to the last colu
152d0 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54  mn inserted.  pT
152e0 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
152f0 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65  .** the table re
15300 66 65 72 72 65 64 20 74 6f 20 28 61 2e 6b 2e 61  ferred to (a.k.a
15310 20 74 68 65 20 22 70 61 72 65 6e 74 22 20 74 61   the "parent" ta
15320 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c 20 69 73  ble).  pToCol is
15330 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 74 61   a list.** of ta
15340 62 6c 65 73 20 69 6e 20 74 68 65 20 70 61 72 65  bles in the pare
15350 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e 20 20 66  nt pTo table.  f
15360 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c  lags contains al
15370 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
15380 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c   about the confl
15390 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
153a0 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66  lgorithms specif
153b0 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  ied.** in the ON
153c0 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41   DELETE, ON UPDA
153d0 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54  TE and ON INSERT
153e0 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
153f0 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72  An FKey structur
15400 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  e is created and
15410 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
15420 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  ble currently.**
15430 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
15440 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73  ion in the pPars
15450 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65  e->pNewTable fie
15460 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ld..**.** The fo
15470 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74  reign key is set
15480 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70   for IMMEDIATE p
15490 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75  rocessing.  A su
154a0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a  bsequent call.**
154b0 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72   to sqlite3Defer
154c0 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67  ForeignKey() mig
154d0 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74  ht change this t
154e0 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76  o DEFERRED..*/.v
154f0 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
15500 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50  eForeignKey(.  P
15510 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
15520 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
15530 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
15540 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20  List *pFromCol, 
15550 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
15560 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70  his table that p
15570 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61  oint to other ta
15580 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
15590 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  pTo,          /*
155a0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68   Name of the oth
155b0 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  er table */.  Ex
155c0 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20  prList *pToCol, 
155d0 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e     /* Columns in
155e0 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
155f0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
15600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
15610 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
15620 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f  n algorithms. */
15630 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
15640 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
15650 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15660 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
15670 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20    FKey *pFKey = 
15680 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78 74  0;.  FKey *pNext
15690 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d  To;.  Table *p =
156a0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
156b0 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  le;.  int nByte;
156c0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
156d0 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nCol;.  char *z;
156e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21  ..  assert( pTo!
156f0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
15700 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56   || IN_DECLARE_V
15710 54 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  TAB ) goto fk_en
15720 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  d;.  if( pFromCo
15730 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  l==0 ){.    int 
15740 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  iCol = p->nCol-1
15750 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
15760 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66  iCol<0) ) goto f
15770 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70  k_end;.    if( p
15780 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
15790 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
157a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
157b0 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65  sg(pParse, "fore
157c0 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20  ign key on %s". 
157d0 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64          " should
157e0 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20   reference only 
157f0 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  one column of ta
15800 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20  ble %T",.       
15810 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e    p->aCol[iCol].
15820 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20  zName, pTo);.   
15830 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
15840 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d      }.    nCol =
15850 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
15860 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
15870 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f  ->nExpr!=pFromCo
15880 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  l->nExpr ){.    
15890 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
158a0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
158b0 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d  "number of colum
158c0 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  ns in foreign ke
158d0 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
158e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22   the number of "
158f0 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e  .        "column
15900 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e  s in the referen
15910 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20  ced table");.   
15920 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
15930 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20  }else{.    nCol 
15940 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  = pFromCol->nExp
15950 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  r;.  }.  nByte =
15960 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20   sizeof(*pFKey) 
15970 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f  + (nCol-1)*sizeo
15980 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d  f(pFKey->aCol[0]
15990 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a  ) + pTo->n + 1;.
159a0 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
159b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
159c0 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b  ToCol->nExpr; i+
159d0 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20  +){.      nByte 
159e0 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
159f0 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  30(pToCol->a[i].
15a00 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  zName) + 1;.    
15a10 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20  }.  }.  pFKey = 
15a20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
15a30 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b  ero(db, nByte );
15a40 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20  .  if( pFKey==0 
15a50 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  ){.    goto fk_e
15a60 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d  nd;.  }.  pFKey-
15a70 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46  >pFrom = p;.  pF
15a80 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d  Key->pNextFrom =
15a90 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d   p->pFKey;.  z =
15aa0 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e   (char*)&pFKey->
15ab0 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46  aCol[nCol];.  pF
15ac0 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20  Key->zTo = z;.  
15ad0 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a  memcpy(z, pTo->z
15ae0 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70  , pTo->n);.  z[p
15af0 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71  To->n] = 0;.  sq
15b00 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b  lite3Dequote(z);
15b10 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31  .  z += pTo->n+1
15b20 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20  ;.  pFKey->nCol 
15b30 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46  = nCol;.  if( pF
15b40 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
15b50 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e   pFKey->aCol[0].
15b60 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  iFrom = p->nCol-
15b70 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
15b80 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
15b90 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
15ba0 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
15bb0 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b  0; j<p->nCol; j+
15bc0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
15bd0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
15be0 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
15bf0 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
15c00 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
15c10 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43         pFKey->aC
15c20 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b  ol[i].iFrom = j;
15c30 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
15c40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15c50 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e    }.      if( j>
15c60 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  =p->nCol ){.    
15c70 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
15c80 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
15c90 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20         "unknown 
15ca0 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e  column \"%s\" in
15cb0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
15cc0 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20  inition", .     
15cd0 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61       pFromCol->a
15ce0 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
15cf0 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
15d00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15d10 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20   }.  if( pToCol 
15d20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
15d30 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
15d40 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
15d50 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43  te3Strlen30(pToC
15d60 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
15d70 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  .      pFKey->aC
15d80 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a  ol[i].zCol = z;.
15d90 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20        memcpy(z, 
15da0 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
15db0 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b  me, n);.      z[
15dc0 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20  n] = 0;.      z 
15dd0 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  += n+1;.    }.  
15de0 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  }.  pFKey->isDef
15df0 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b  erred = 0;.  pFK
15e00 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d  ey->aAction[0] =
15e10 20 28 75 38 29 28 66 6c 61 67 73 20 26 20 30 78   (u8)(flags & 0x
15e20 66 66 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ff);            
15e30 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20 61 63 74  /* ON DELETE act
15e40 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e  ion */.  pFKey->
15e50 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38  aAction[1] = (u8
15e60 29 28 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20  )((flags >> 8 ) 
15e70 26 20 30 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f  & 0xff);    /* O
15e80 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e 20  N UPDATE action 
15e90 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
15ea0 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
15eb0 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 2d 3e 70  Held(db, 0, p->p
15ec0 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 70 4e 65  Schema) );.  pNe
15ed0 78 74 54 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73  xtTo = (FKey *)s
15ee0 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
15ef0 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b  (&p->pSchema->fk
15f00 65 79 48 61 73 68 2c 20 0a 20 20 20 20 20 20 70  eyHash, .      p
15f10 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76 6f 69 64  FKey->zTo, (void
15f20 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20   *)pFKey.  );.  
15f30 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b  if( pNextTo==pFK
15f40 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
15f50 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
15f60 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
15f70 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 78 74 54    }.  if( pNextT
15f80 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  o ){.    assert(
15f90 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54   pNextTo->pPrevT
15fa0 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b 65  o==0 );.    pFKe
15fb0 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e 65  y->pNextTo = pNe
15fc0 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74 54  xtTo;.    pNextT
15fd0 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70 46 4b  o->pPrevTo = pFK
15fe0 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69  ey;.  }..  /* Li
15ff0 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  nk the foreign k
16000 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ey to the table 
16010 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70  as the last step
16020 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65  ..  */.  p->pFKe
16030 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b  y = pFKey;.  pFK
16040 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a  ey = 0;..fk_end:
16050 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
16060 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e  (db, pFKey);.#en
16070 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
16080 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
16090 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71  IGN_KEY) */.  sq
160a0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
160b0 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c  ete(db, pFromCol
160c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
160d0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
160e0 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ToCol);.}../*.**
160f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
16100 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
16110 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
16120 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59  ATE or INITIALLY
16130 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61   DEFERRED.** cla
16140 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70  use is seen as p
16150 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e  art of a foreign
16160 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e   key definition.
16170 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64    The isDeferred
16180 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
16190 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   1 for INITIALLY
161a0 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20   DEFERRED and 0 
161b0 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d  for INITIALLY IM
161c0 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20  MEDIATE..** The 
161d0 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20  behavior of the 
161e0 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72  most recently cr
161f0 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  eated foreign ke
16200 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a  y is adjusted.**
16210 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f   accordingly..*/
16220 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
16230 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72  erForeignKey(Par
16240 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
16250 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66  isDeferred){.#if
16260 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16270 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54  _FOREIGN_KEY.  T
16280 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b  able *pTab;.  FK
16290 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28  ey *pFKey;.  if(
162a0 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   (pTab = pParse-
162b0 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c  >pNewTable)==0 |
162c0 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d  | (pFKey = pTab-
162d0 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74  >pFKey)==0 ) ret
162e0 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69  urn;.  assert( i
162f0 73 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20  sDeferred==0 || 
16300 69 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29 3b  isDeferred==1 );
16310 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33 32 33 2d   /* EV: R-30323-
16320 32 31 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65 79  21917 */.  pFKey
16330 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 28  ->isDeferred = (
16340 75 38 29 69 73 44 65 66 65 72 72 65 64 3b 0a 23  u8)isDeferred;.#
16350 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  endif.}../*.** G
16360 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
16370 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64  t will erase and
16380 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70   refill index *p
16390 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  Idx.  This is.**
163a0 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c   used to initial
163b0 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61  ize a newly crea
163c0 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20  ted index or to 
163d0 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  recompute the.**
163e0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69   content of an i
163f0 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65  ndex in response
16400 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f   to a REINDEX co
16410 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20  mmand..**.** if 
16420 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e  memRootPage is n
16430 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20  ot negative, it 
16440 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 69  means that the i
16450 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a  ndex is newly.**
16460 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 72   created.  The r
16470 65 67 69 73 74 65 72 20 73 70 65 63 69 66 69 65  egister specifie
16480 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65  d by memRootPage
16490 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a   contains the.**
164a0 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
164b0 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  r of the index. 
164c0 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   If memRootPage 
164d0 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
164e0 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61  n.** the index a
164f0 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 6e  lready exists an
16500 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65  d must be cleare
16510 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72  d before being r
16520 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74  efilled and.** t
16530 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
16540 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
16550 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70   is taken from p
16560 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a  Index->tnum..*/.
16570 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
16580 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50  te3RefillIndex(P
16590 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
165a0 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74  dex *pIndex, int
165b0 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20   memRootPage){. 
165c0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
165d0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20  Index->pTable;  
165e0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68 61  /* The table tha
165f0 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a  t is indexed */.
16600 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61    int iTab = pPa
16610 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
16620 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72   /* Btree cursor
16630 20 75 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a   used for pTab *
16640 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70  /.  int iIdx = p
16650 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
16660 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73     /* Btree curs
16670 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64  or used for pInd
16680 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72  ex */.  int iSor
16690 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
166a0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
166b0 20 6f 70 65 6e 65 64 20 62 79 20 4f 70 65 6e 53   opened by OpenS
166c0 6f 72 74 65 72 20 28 69 66 20 69 6e 20 75 73 65  orter (if in use
166d0 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31  ) */.  int addr1
166e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
166f0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
16700 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20   of top of loop 
16710 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 32 3b 20  */.  int addr2; 
16720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16730 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 74      /* Address t
16740 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 6e 65  o jump to for ne
16750 78 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a  xt iteration */.
16760 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20    int tnum;     
16770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16780 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
16790 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
167a0 69 50 61 72 74 49 64 78 4c 61 62 65 6c 3b 20 20  iPartIdxLabel;  
167b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
167c0 6d 70 20 74 6f 20 74 68 69 73 20 6c 61 62 65 6c  mp to this label
167d0 20 74 6f 20 73 6b 69 70 20 61 20 72 6f 77 20 2a   to skip a row *
167e0 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
167f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16800 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
16810 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69  ode into this vi
16820 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f  rtual machine */
16830 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
16840 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16850 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72    /* KeyInfo for
16860 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
16870 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20  regRecord;      
16880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
16890 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61  gister holding a
168a0 73 73 65 6d 62 6c 65 64 20 69 6e 64 65 78 20 72  ssembled index r
168b0 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ecord */.  sqlit
168c0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
168d0 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  >db;      /* The
168e0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
168f0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44  tion */.  int iD
16900 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
16910 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  aToIndex(db, pIn
16920 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  dex->pSchema);..
16930 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16940 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
16950 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  N.  if( sqlite3A
16960 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
16970 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c   SQLITE_REINDEX,
16980 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
16990 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  0,.      db->aDb
169a0 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 29  [iDb].zDbSName )
169b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
169c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
169d0 20 52 65 71 75 69 72 65 20 61 20 77 72 69 74 65   Require a write
169e0 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62  -lock on the tab
169f0 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  le to perform th
16a00 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  is operation */.
16a10 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
16a20 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
16a30 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70  pTab->tnum, 1, p
16a40 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
16a50 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
16a60 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
16a70 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
16a80 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61  .  if( memRootPa
16a90 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75  ge>=0 ){.    tnu
16aa0 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b  m = memRootPage;
16ab0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e  .  }else{.    tn
16ac0 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75  um = pIndex->tnu
16ad0 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20  m;.  }.  pKey = 
16ae0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
16af0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
16b00 6e 64 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  ndex);.  assert(
16b10 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e   pKey!=0 || db->
16b20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
16b30 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a  pParse->nErr );.
16b40 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73  .  /* Open the s
16b50 6f 72 74 65 72 20 63 75 72 73 6f 72 20 69 66 20  orter cursor if 
16b60 77 65 20 61 72 65 20 74 6f 20 75 73 65 20 6f 6e  we are to use on
16b70 65 2e 20 2a 2f 0a 20 20 69 53 6f 72 74 65 72 20  e. */.  iSorter 
16b80 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
16b90 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16ba0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp4(v, OP_Sort
16bb0 65 72 4f 70 65 6e 2c 20 69 53 6f 72 74 65 72 2c  erOpen, iSorter,
16bc0 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79   0, pIndex->nKey
16bd0 43 6f 6c 2c 20 28 63 68 61 72 2a 29 0a 20 20 20  Col, (char*).   
16be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bf0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52   sqlite3KeyInfoR
16c00 65 66 28 70 4b 65 79 29 2c 20 50 34 5f 4b 45 59  ef(pKey), P4_KEY
16c10 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  INFO);..  /* Ope
16c20 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f  n the table. Loo
16c30 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f  p through all ro
16c40 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c  ws of the table,
16c50 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 64 65 78   inserting index
16c60 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e  .  ** records in
16c70 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a  to the sorter. *
16c80 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  /.  sqlite3OpenT
16c90 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61  able(pParse, iTa
16ca0 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  b, iDb, pTab, OP
16cb0 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64  _OpenRead);.  ad
16cc0 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
16cd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
16ce0 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 20  wind, iTab, 0); 
16cf0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
16d00 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  .  regRecord = s
16d10 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
16d20 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 73 71 6c  (pParse);..  sql
16d30 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
16d40 78 4b 65 79 28 70 50 61 72 73 65 2c 70 49 6e 64  xKey(pParse,pInd
16d50 65 78 2c 69 54 61 62 2c 72 65 67 52 65 63 6f 72  ex,iTab,regRecor
16d60 64 2c 30 2c 26 69 50 61 72 74 49 64 78 4c 61 62  d,0,&iPartIdxLab
16d70 65 6c 2c 30 2c 30 29 3b 0a 20 20 73 71 6c 69 74  el,0,0);.  sqlit
16d80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16d90 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c  OP_SorterInsert,
16da0 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63   iSorter, regRec
16db0 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ord);.  sqlite3R
16dc0 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62  esolvePartIdxLab
16dd0 65 6c 28 70 50 61 72 73 65 2c 20 69 50 61 72 74  el(pParse, iPart
16de0 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c  IdxLabel);.  sql
16df0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16e00 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
16e10 20 61 64 64 72 31 2b 31 29 3b 20 56 64 62 65 43   addr1+1); VdbeC
16e20 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
16e30 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
16e40 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 69  e(v, addr1);.  i
16e50 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3c 30  f( memRootPage<0
16e60 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
16e70 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72  dOp2(v, OP_Clear
16e80 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  , tnum, iDb);.  
16e90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16ea0 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  4(v, OP_OpenWrit
16eb0 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69  e, iIdx, tnum, i
16ec0 44 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  Db, .           
16ed0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 20 2a           (char *
16ee0 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46  )pKey, P4_KEYINF
16ef0 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  O);.  sqlite3Vdb
16f00 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
16f10 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 28 28 6d 65  LAG_BULKCSR|((me
16f20 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 29 3f 4f 50  mRootPage>=0)?OP
16f30 46 4c 41 47 5f 50 32 49 53 52 45 47 3a 30 29 29  FLAG_P2ISREG:0))
16f40 3b 0a 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  ;..  addr1 = sql
16f50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16f60 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c  , OP_SorterSort,
16f70 20 69 53 6f 72 74 65 72 2c 20 30 29 3b 20 56 64   iSorter, 0); Vd
16f80 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16f90 20 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64   if( IsUniqueInd
16fa0 65 78 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  ex(pIndex) ){.  
16fb0 20 20 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74    int j2 = sqlit
16fc0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
16fd0 72 28 76 29 20 2b 20 33 3b 0a 20 20 20 20 73 71  r(v) + 3;.    sq
16fe0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
16ff0 20 6a 32 29 3b 0a 20 20 20 20 61 64 64 72 32 20   j2);.    addr2 
17000 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
17010 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
17020 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17030 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 6f 72 74  p4Int(v, OP_Sort
17040 65 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74  erCompare, iSort
17050 65 72 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f 72  er, j2, regRecor
17060 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
17070 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64              pInd
17080 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64  ex->nKeyCol); Vd
17090 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
170a0 20 20 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65     sqlite3Unique
170b0 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
170c0 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 70 49 6e  e, OE_Abort, pIn
170d0 64 65 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  dex);.  }else{. 
170e0 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
170f0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
17100 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  r(v);.  }.  sqli
17110 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
17120 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20   OP_SorterData, 
17130 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f  iSorter, regReco
17140 72 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c  rd, iIdx);.  sql
17150 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
17160 2c 20 4f 50 5f 53 65 65 6b 45 6e 64 2c 20 69 49  , OP_SeekEnd, iI
17170 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dx);.  sqlite3Vd
17180 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
17190 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20  dxInsert, iIdx, 
171a0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
171b0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
171c0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
171d0 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71  EEKRESULT);.  sq
171e0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
171f0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
17200 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
17210 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17220 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 53  P_SorterNext, iS
17230 6f 72 74 65 72 2c 20 61 64 64 72 32 29 3b 20 56  orter, addr2); V
17240 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
17250 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
17260 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
17270 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ..  sqlite3VdbeA
17280 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
17290 65 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69  e, iTab);.  sqli
172a0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
172b0 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29   OP_Close, iIdx)
172c0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
172d0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
172e0 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a  e, iSorter);.}..
172f0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68  /*.** Allocate h
17300 65 61 70 20 73 70 61 63 65 20 74 6f 20 68 6f 6c  eap space to hol
17310 64 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63  d an Index objec
17320 74 20 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75  t with nCol colu
17330 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65  mns..**.** Incre
17340 61 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  ase the allocati
17350 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72 6f 76 69  on size to provi
17360 64 65 20 61 6e 20 65 78 74 72 61 20 6e 45 78 74  de an extra nExt
17370 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38  ra bytes.** of 8
17380 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 73 70  -byte aligned sp
17390 61 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e  ace after the In
173a0 64 65 78 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  dex object and r
173b0 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74  eturn a.** point
173c0 65 72 20 74 6f 20 74 68 69 73 20 65 78 74 72 61  er to this extra
173d0 20 73 70 61 63 65 20 69 6e 20 2a 70 70 45 78 74   space in *ppExt
173e0 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71  ra..*/.Index *sq
173f0 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64  lite3AllocateInd
17400 65 78 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c 69  exObject(.  sqli
17410 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
17420 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
17430 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36  nection */.  i16
17440 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   nCol,          
17450 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
17460 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
17470 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  the index */.  i
17480 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
17490 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
174a0 20 62 79 74 65 73 20 6f 66 20 65 78 74 72 61 20   bytes of extra 
174b0 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a  space to alloc *
174c0 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 45 78 74  /.  char **ppExt
174d0 72 61 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ra       /* Poin
174e0 74 65 72 20 74 6f 20 74 68 65 20 22 65 78 74 72  ter to the "extr
174f0 61 22 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20  a" space */.){. 
17500 20 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20   Index *p;      
17510 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
17520 65 64 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ed index object 
17530 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
17540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
17550 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
17560 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2b 20 61  Index object + a
17570 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74  rrays */..  nByt
17580 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e = ROUND8(sizeo
17590 66 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20  f(Index)) +     
175a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
175b0 78 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a  x structure  */.
175c0 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38            ROUND8
175d0 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e  (sizeof(char*)*n
175e0 43 6f 6c 29 20 2b 20 20 20 20 20 20 20 20 20 2f  Col) +         /
175f0 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20  * Index.azColl  
17600 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
17610 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4c 6f  ROUND8(sizeof(Lo
17620 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b  gEst)*(nCol+1) +
17630 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
17640 52 6f 77 4c 6f 67 45 73 74 20 20 20 2a 2f 0a 20  RowLogEst   */. 
17650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17660 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c  sizeof(i16)*nCol
17670 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   +            /*
17680 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20   Index.aiColumn 
17690 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
176a0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29        sizeof(u8)
176b0 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20 20 20  *nCol);         
176c0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f      /* Index.aSo
176d0 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d  rtOrder */.  p =
176e0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
176f0 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b  Zero(db, nByte +
17700 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20   nExtra);.  if( 
17710 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70  p ){.    char *p
17720 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29  Extra = ((char*)
17730 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)+ROUND8(sizeof
17740 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70 2d  (Index));.    p-
17750 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74  >azColl = (const
17760 20 63 68 61 72 2a 2a 29 70 45 78 74 72 61 3b 20   char**)pExtra; 
17770 70 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38  pExtra += ROUND8
17780 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e  (sizeof(char*)*n
17790 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52  Col);.    p->aiR
177a0 6f 77 4c 6f 67 45 73 74 20 3d 20 28 4c 6f 67 45  owLogEst = (LogE
177b0 73 74 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74  st*)pExtra; pExt
177c0 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67  ra += sizeof(Log
177d0 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20  Est)*(nCol+1);. 
177e0 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d     p->aiColumn =
177f0 20 28 69 31 36 2a 29 70 45 78 74 72 61 3b 20 20   (i16*)pExtra;  
17800 20 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20 73       pExtra += s
17810 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b  izeof(i16)*nCol;
17820 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64  .    p->aSortOrd
17830 65 72 20 3d 20 28 75 38 2a 29 70 45 78 74 72 61  er = (u8*)pExtra
17840 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e  ;.    p->nColumn
17850 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e   = nCol;.    p->
17860 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d  nKeyCol = nCol -
17870 20 31 3b 0a 20 20 20 20 2a 70 70 45 78 74 72 61   1;.    *ppExtra
17880 20 3d 20 28 28 63 68 61 72 2a 29 70 29 20 2b 20   = ((char*)p) + 
17890 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74  nByte;.  }.  ret
178a0 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
178b0 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64  Create a new ind
178c0 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61  ex for an SQL ta
178d0 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61  ble.  pName1.pNa
178e0 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20  me2 is the name 
178f0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a  of the index .**
17900 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73   and pTblList is
17910 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
17920 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
17930 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42  o be indexed.  B
17940 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20  oth will .** be 
17950 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61  NULL for a prima
17960 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64  ry key or an ind
17970 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74  ex that is creat
17980 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a  ed to satisfy a.
17990 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ** UNIQUE constr
179a0 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65  aint.  If pTable
179b0 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20   and pIndex are 
179c0 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65  NULL, use pParse
179d0 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61  ->pNewTable.** a
179e0 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  s the table to b
179f0 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72  e indexed.  pPar
17a00 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73  se->pNewTable is
17a10 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73   a table that is
17a20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65  .** currently be
17a30 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
17a40 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  by a CREATE TABL
17a50 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
17a60 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  ** pList is a li
17a70 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
17a80 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c   be indexed.  pL
17a90 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ist will be NULL
17aa0 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61   if this.** is a
17ab0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
17ac0 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e  unique-constrain
17ad0 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
17ae0 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  cent column adde
17af0 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c  d.** to the tabl
17b00 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
17b10 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
17b20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
17b30 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20  3CreateIndex(.  
17b40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
17b50 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d     /* All inform
17b60 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73  ation about this
17b70 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65   parse */.  Toke
17b80 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
17b90 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20  * First part of 
17ba0 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20  index name. May 
17bb0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b  be NULL */.  Tok
17bc0 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
17bd0 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f  /* Second part o
17be0 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
17bf0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53  y be NULL */.  S
17c00 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65  rcList *pTblName
17c10 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e  , /* Table to in
17c20 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d  dex. Use pParse-
17c30 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20  >pNewTable if 0 
17c40 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
17c50 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73  List,   /* A lis
17c60 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
17c70 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
17c80 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
17c90 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20     /* OE_Abort, 
17ca0 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65  OE_Ignore, OE_Re
17cb0 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e  place, or OE_Non
17cc0 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53  e */.  Token *pS
17cd0 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  tart,     /* The
17ce0 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
17cf0 61 74 20 62 65 67 69 6e 73 20 74 68 69 73 20 73  at begins this s
17d00 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  tatement */.  Ex
17d10 70 72 20 2a 70 50 49 57 68 65 72 65 2c 20 20 20  pr *pPIWhere,   
17d20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
17d30 20 66 6f 72 20 70 61 72 74 69 61 6c 20 69 6e 64   for partial ind
17d40 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  ices */.  int so
17d50 72 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20  rtOrder,     /* 
17d60 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72  Sort order of pr
17d70 69 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70  imary key when p
17d80 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20  List==NULL */.  
17d90 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 2c 20  int ifNotExist, 
17da0 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72     /* Omit error
17db0 20 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64   if index alread
17dc0 79 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 75 38  y exists */.  u8
17dd0 20 69 64 78 54 79 70 65 20 20 20 20 20 20 20 20   idxType        
17de0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 79   /* The index ty
17df0 70 65 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  pe */.){.  Table
17e00 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
17e10 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69  /* Table to be i
17e20 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ndexed */.  Inde
17e30 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20  x *pIndex = 0;  
17e40 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
17e50 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20   be created */. 
17e60 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
17e70 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
17e80 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
17e90 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
17ea0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
17eb0 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
17ec0 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69  zName */.  int i
17ed0 2c 20 6a 3b 0a 20 20 44 62 46 69 78 65 72 20 73  , j;.  DbFixer s
17ee0 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  Fix;        /* F
17ef0 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74  or assigning dat
17f00 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70  abase names to p
17f10 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73  Table */.  int s
17f20 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20  ortOrderMask;   
17f30 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45  /* 1 to honor DE
17f40 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20  SC in index.  0 
17f50 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20  to ignore. */.  
17f60 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
17f70 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a  arse->db;.  Db *
17f80 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
17f90 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63   /* The specific
17fa0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
17fb0 67 20 74 68 65 20 69 6e 64 65 78 65 64 20 64 61  g the indexed da
17fc0 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
17fd0 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
17fe0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
17ff0 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69   database that i
18000 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  s being written 
18010 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
18020 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71  e = 0;    /* Unq
18030 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
18040 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72   the index to cr
18050 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  eate */.  struct
18060 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
18070 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f  pListItem; /* Fo
18080 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
18090 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  List */.  int nE
180a0 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20  xtra = 0;       
180b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
180c0 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
180d0 72 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20  r zExtra[] */.  
180e0 69 6e 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20  int nExtraCol;  
180f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18100 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
18110 74 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64  tra columns need
18120 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45  ed */.  char *zE
18130 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20  xtra = 0;       
18140 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
18150 61 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68  a space after th
18160 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  e Index object *
18170 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d  /.  Index *pPk =
18180 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 52 49 4d   0;      /* PRIM
18190 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f  ARY KEY index fo
181a0 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
181b0 74 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 69 66 28  tables */..  if(
181c0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
181d0 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
181e0 72 3e 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  r>0 ){.    goto 
181f0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18200 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e 5f  x;.  }.  if( IN_
18210 44 45 43 4c 41 52 45 5f 56 54 41 42 20 26 26 20  DECLARE_VTAB && 
18220 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  idxType!=SQLITE_
18230 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b  IDXTYPE_PRIMARYK
18240 45 59 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  EY ){.    goto e
18250 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18260 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49  ;.  }.  if( SQLI
18270 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
18280 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
18290 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
182a0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
182b0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
182c0 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68  ind the table th
182d0 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
182e0 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72  xed.  Return ear
182f0 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ly if not found.
18300 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c  .  */.  if( pTbl
18310 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20  Name!=0 ){..    
18320 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70  /* Use the two-p
18330 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74  art index name t
18340 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
18350 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
18360 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74   to search for t
18370 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20  he table. 'Fix' 
18380 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  the table name t
18390 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a  o this db.    **
183a0 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20   before looking 
183b0 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  up the table..  
183c0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
183d0 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65   pName1 && pName
183e0 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  2 );.    iDb = s
183f0 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
18400 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
18410 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
18420 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
18430 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
18440 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61  ate_index;.    a
18450 73 73 65 72 74 28 20 70 4e 61 6d 65 20 26 26 20  ssert( pName && 
18460 70 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66  pName->z );..#if
18470 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18480 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49  _TEMPDB.    /* I
18490 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
184a0 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64   was unqualified
184b0 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74  , check if the t
184c0 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61  able.    ** is a
184d0 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20   temp table. If 
184e0 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  so, set the data
184f0 62 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f  base to 1. Do no
18500 74 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a  t do this.    **
18510 20 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67   if initialising
18520 20 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65   a database sche
18530 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ma..    */.    i
18540 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
18550 79 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  y ){.      pTab 
18560 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
18570 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
18580 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TblName);.      
18590 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30  if( pName2->n==0
185a0 20 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62   && pTab && pTab
185b0 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61  ->pSchema==db->a
185c0 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b  Db[1].pSchema ){
185d0 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31  .        iDb = 1
185e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
185f0 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69  #endif..    sqli
18600 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
18610 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
18620 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a  index", pName);.
18630 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
18640 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c  ixSrcList(&sFix,
18650 20 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20   pTblName) ){.  
18660 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74      /* Because t
18670 68 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72  he parser constr
18680 75 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72  ucts pTblName fr
18690 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e  om a single iden
186a0 74 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a  tifier,.      **
186b0 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
186c0 73 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69  st can never fai
186d0 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  l. */.      asse
186e0 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rt(0);.    }.   
186f0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
18700 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70  ocateTableItem(p
18710 50 61 72 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e  Parse, 0, &pTblN
18720 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20  ame->a[0]);.    
18730 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
18740 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70  ocFailed==0 || p
18750 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab==0 );.    if
18760 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f  ( pTab==0 ) goto
18770 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18780 65 78 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d  ex;.    if( iDb=
18790 3d 31 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 44  =1 && db->aDb[iD
187a0 62 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54 61 62  b].pSchema!=pTab
187b0 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
187c0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
187d0 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
187e0 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63         "cannot c
187f0 72 65 61 74 65 20 61 20 54 45 4d 50 20 69 6e 64  reate a TEMP ind
18800 65 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74  ex on non-TEMP t
18810 61 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20  able \"%s\"",.  
18820 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a           pTab->z
18830 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
18840 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18850 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
18860 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
18870 62 29 20 29 20 70 50 6b 20 3d 20 73 71 6c 69 74  b) ) pPk = sqlit
18880 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
18890 78 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65  x(pTab);.  }else
188a0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
188b0 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ame==0 );.    as
188c0 73 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20  sert( pStart==0 
188d0 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50  );.    pTab = pP
188e0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
188f0 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29  .    if( !pTab )
18900 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18910 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62  e_index;.    iDb
18920 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
18930 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
18940 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a  ->pSchema);.  }.
18950 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
18960 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74  [iDb];..  assert
18970 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61  ( pTab!=0 );.  a
18980 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
18990 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Err==0 );.  if( 
189a0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
189b0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
189c0 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20  lite_", 7)==0 . 
189d0 20 20 20 20 20 20 26 26 20 64 62 2d 3e 69 6e 69        && db->ini
189e0 74 2e 62 75 73 79 3d 3d 30 0a 23 69 66 20 53 51  t.busy==0.#if SQ
189f0 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
18a00 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 20 20  TICATION.       
18a10 26 26 20 73 71 6c 69 74 65 33 55 73 65 72 41 75  && sqlite3UserAu
18a20 74 68 54 61 62 6c 65 28 70 54 61 62 2d 3e 7a 4e  thTable(pTab->zN
18a30 61 6d 65 29 3d 3d 30 0a 23 65 6e 64 69 66 0a 20  ame)==0.#endif. 
18a40 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
18a50 53 74 72 4e 49 43 6d 70 28 26 70 54 61 62 2d 3e  StrNICmp(&pTab->
18a60 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74  zName[7],"altert
18a70 61 62 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20  ab_",9)!=0 ){.  
18a80 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
18a90 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
18aa0 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69   %s may not be i
18ab0 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a  ndexed", pTab->z
18ac0 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
18ad0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18ae0 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  x;.  }.#ifndef S
18af0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
18b00 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
18b10 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
18b20 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
18b30 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f  e, "views may no
18b40 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a  t be indexed");.
18b50 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
18b60 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
18b70 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
18b80 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
18b90 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73  ALTABLE.  if( Is
18ba0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
18bb0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
18bc0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
18bd0 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79  rtual tables may
18be0 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
18bf0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
18c00 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18c10 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a   }.#endif..  /*.
18c20 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61    ** Find the na
18c30 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  me of the index.
18c40 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72    Make sure ther
18c50 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
18c60 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e   another.  ** in
18c70 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74  dex or table wit
18c80 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
18c90 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63    .  **.  ** Exc
18ca0 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61  eption:  If we a
18cb0 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e  re reading the n
18cc0 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e  ames of permanen
18cd0 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74  t indices from t
18ce0 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d  he.  ** sqlite_m
18cf0 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63  aster table (bec
18d00 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  ause some other 
18d10 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20  process changed 
18d20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a  the schema) and.
18d30 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20    ** one of the 
18d40 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c  index names coll
18d50 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61  ides with the na
18d60 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72  me of a temporar
18d70 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20  y table or.  ** 
18d80 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77  index, then we w
18d90 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
18da0 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64  process this ind
18db0 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ex..  **.  ** If
18dc0 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61   pName==0 it mea
18dd0 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20  ns that we are. 
18de0 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68   ** dealing with
18df0 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
18e00 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
18e10 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f  int.  We have to
18e20 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a   invent our.  **
18e30 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   own name..  */.
18e40 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
18e50 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
18e60 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
18e70 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  db, pName);.    
18e80 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67  if( zName==0 ) g
18e90 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18ea0 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72  index;.    asser
18eb0 74 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29  t( pName->z!=0 )
18ec0 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
18ed0 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63  _OK!=sqlite3Chec
18ee0 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72  kObjectName(pPar
18ef0 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  se, zName) ){.  
18f00 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
18f10 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
18f20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  }.    if( !db->i
18f30 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
18f40 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
18f50 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
18f60 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)!=0 ){.     
18f70 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
18f80 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
18f90 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74  e is already a t
18fa0 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20  able named %s", 
18fb0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
18fc0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
18fd0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
18fe0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
18ff0 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
19000 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a  b, zName, pDb->z
19010 44 62 53 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  DbSName)!=0 ){. 
19020 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45       if( !ifNotE
19030 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  xist ){.        
19040 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
19050 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25  pParse, "index %
19060 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  s already exists
19070 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
19080 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19090 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
190a0 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20  t.busy );.      
190b0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
190c0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
190d0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a  , iDb);.      }.
190e0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
190f0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
19100 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
19110 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65   int n;.    Inde
19120 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f  x *pLoop;.    fo
19130 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49  r(pLoop=pTab->pI
19140 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70  ndex, n=1; pLoop
19150 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
19160 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  Next, n++){}.   
19170 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
19180 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c  MPrintf(db, "sql
19190 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73  ite_autoindex_%s
191a0 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  _%d", pTab->zNam
191b0 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a  e, n);.    if( z
191c0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
191d0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
191e0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 0a  e_index;.    }..
191f0 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63      /* Automatic
19200 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 67 65 6e   index names gen
19210 65 72 61 74 65 64 20 66 72 6f 6d 20 77 69 74 68  erated from with
19220 69 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61  in sqlite3_decla
19230 72 65 5f 76 74 61 62 28 29 0a 20 20 20 20 2a 2a  re_vtab().    **
19240 20 6d 75 73 74 20 68 61 76 65 20 6e 61 6d 65 73   must have names
19250 20 74 68 61 74 20 61 72 65 20 64 69 73 74 69 6e   that are distin
19260 63 74 20 66 72 6f 6d 20 6e 6f 72 6d 61 6c 20 61  ct from normal a
19270 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6e  utomatic index n
19280 61 6d 65 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65  ames..    ** The
19290 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65   following state
192a0 6d 65 6e 74 20 63 6f 6e 76 65 72 74 73 20 22 73  ment converts "s
192b0 71 6c 69 74 65 33 5f 61 75 74 6f 69 6e 64 65 78  qlite3_autoindex
192c0 2e 2e 2e 22 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ..." into.    **
192d0 20 22 73 71 6c 69 74 65 33 5f 62 75 74 6f 69 6e   "sqlite3_butoin
192e0 64 65 78 2e 2e 2e 22 20 69 6e 20 6f 72 64 65 72  dex..." in order
192f0 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d   to make the nam
19300 65 73 20 64 69 73 74 69 6e 63 74 2e 0a 20 20 20  es distinct..   
19310 20 2a 2a 20 54 68 65 20 22 76 74 61 62 5f 65 72   ** The "vtab_er
19320 72 2e 74 65 73 74 22 20 74 65 73 74 20 64 65 6d  r.test" test dem
19330 6f 6e 73 74 72 61 74 65 73 20 74 68 65 20 6e 65  onstrates the ne
19340 65 64 20 6f 66 20 74 68 69 73 20 73 74 61 74 65  ed of this state
19350 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ment. */.    if(
19360 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42   IN_DECLARE_VTAB
19370 20 29 20 7a 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a 20   ) zName[7]++;. 
19380 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66   }..  /* Check f
19390 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  or authorization
193a0 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e   to create an in
193b0 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  dex..  */.#ifnde
193c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
193d0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
193e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
193f0 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 44 62 53 4e  zDb = pDb->zDbSN
19400 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ame;.    if( sql
19410 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
19420 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53  arse, SQLITE_INS
19430 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ERT, SCHEMA_TABL
19440 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20  E(iDb), 0, zDb) 
19450 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
19460 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19470 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53  .    }.    i = S
19480 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44  QLITE_CREATE_IND
19490 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49  EX;.    if( !OMI
194a0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
194b0 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f  =1 ) i = SQLITE_
194c0 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
194d0 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
194e0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
194f0 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54  se, i, zName, pT
19500 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  ab->zName, zDb) 
19510 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
19520 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19530 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
19540 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74  f..  /* If pList
19550 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ==0, it means th
19560 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
19570 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20  alled to make a 
19580 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79  primary.  ** key
19590 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74   out of the last
195a0 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f   column added to
195b0 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72   the table under
195c0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20   construction.. 
195d0 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20   ** So create a 
195e0 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d  fake list to sim
195f0 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f  ulate this..  */
19600 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
19610 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 70 72 65  ){.    Token pre
19620 76 43 6f 6c 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e  vCol;.    Column
19630 20 2a 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e   *pCol = &pTab->
19640 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d  aCol[pTab->nCol-
19650 31 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f  1];.    pCol->co
19660 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
19670 47 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 73 71  G_UNIQUE;.    sq
19680 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26  lite3TokenInit(&
19690 70 72 65 76 43 6f 6c 2c 20 70 43 6f 6c 2d 3e 7a  prevCol, pCol->z
196a0 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74  Name);.    pList
196b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
196c0 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
196d0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
196e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c    sqlite3ExprAll
196f0 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 70  oc(db, TK_ID, &p
19700 72 65 76 43 6f 6c 2c 20 30 29 29 3b 0a 20 20 20  revCol, 0));.   
19710 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
19720 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19730 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65  _index;.    asse
19740 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
19750 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==1 );.    sqlit
19760 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72  e3ExprListSetSor
19770 74 4f 72 64 65 72 28 70 4c 69 73 74 2c 20 73 6f  tOrder(pList, so
19780 72 74 4f 72 64 65 72 29 3b 0a 20 20 7d 65 6c 73  rtOrder);.  }els
19790 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
197a0 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74  prListCheckLengt
197b0 68 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  h(pParse, pList,
197c0 20 22 69 6e 64 65 78 22 29 3b 0a 20 20 7d 0a 0a   "index");.  }..
197d0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
197e0 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  how many bytes o
197f0 66 20 73 70 61 63 65 20 61 72 65 20 72 65 71 75  f space are requ
19800 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78  ired to store ex
19810 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70  plicitly.  ** sp
19820 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f  ecified collatio
19830 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73  n sequence names
19840 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
19850 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
19860 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
19870 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d   *pExpr = pList-
19880 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
19890 20 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d   assert( pExpr!=
198a0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  0 );.    if( pEx
198b0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pr->op==TK_COLLA
198c0 54 45 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74  TE ){.      nExt
198d0 72 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74  ra += (1 + sqlit
198e0 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72  e3Strlen30(pExpr
198f0 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20  ->u.zToken));.  
19900 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20    }.  }..  /* . 
19910 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   ** Allocate the
19920 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
19930 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20  . .  */.  nName 
19940 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
19950 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 45 78 74  0(zName);.  nExt
19960 72 61 43 6f 6c 20 3d 20 70 50 6b 20 3f 20 70 50  raCol = pPk ? pP
19970 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a  k->nKeyCol : 1;.
19980 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
19990 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f  e3AllocateIndexO
199a0 62 6a 65 63 74 28 64 62 2c 20 70 4c 69 73 74 2d  bject(db, pList-
199b0 3e 6e 45 78 70 72 20 2b 20 6e 45 78 74 72 61 43  >nExpr + nExtraC
199c0 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
199d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199e0 20 20 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20            nName 
199f0 2b 20 6e 45 78 74 72 61 20 2b 20 31 2c 20 26 7a  + nExtra + 1, &z
19a00 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 64 62  Extra);.  if( db
19a10 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
19a20 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
19a30 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
19a40 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  }.  assert( EIGH
19a50 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
19a60 28 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f  (pIndex->aiRowLo
19a70 67 45 73 74 29 20 29 3b 0a 20 20 61 73 73 65 72  gEst) );.  asser
19a80 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
19a90 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e  IGNMENT(pIndex->
19aa0 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49 6e  azColl) );.  pIn
19ab0 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78  dex->zName = zEx
19ac0 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d  tra;.  zExtra +=
19ad0 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 6d 65   nName + 1;.  me
19ae0 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  mcpy(pIndex->zNa
19af0 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  me, zName, nName
19b00 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70  +1);.  pIndex->p
19b10 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20  Table = pTab;.  
19b20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
19b30 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20  = (u8)onError;. 
19b40 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74   pIndex->uniqNot
19b50 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 21 3d  Null = onError!=
19b60 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64 65  OE_None;.  pInde
19b70 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 69 64 78  x->idxType = idx
19b80 54 79 70 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  Type;.  pIndex->
19b90 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
19ba0 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a  b[iDb].pSchema;.
19bb0 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f    pIndex->nKeyCo
19bc0 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  l = pList->nExpr
19bd0 3b 0a 20 20 69 66 28 20 70 50 49 57 68 65 72 65  ;.  if( pPIWhere
19be0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
19bf0 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65  esolveSelfRefere
19c00 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  nce(pParse, pTab
19c10 2c 20 4e 43 5f 50 61 72 74 49 64 78 2c 20 70 50  , NC_PartIdx, pP
19c20 49 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  IWhere, 0);.    
19c30 70 49 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78  pIndex->pPartIdx
19c40 57 68 65 72 65 20 3d 20 70 50 49 57 68 65 72 65  Where = pPIWhere
19c50 3b 0a 20 20 20 20 70 50 49 57 68 65 72 65 20 3d  ;.    pPIWhere =
19c60 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
19c70 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
19c80 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
19c90 2c 20 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  , 0) );..  /* Ch
19ca0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
19cb0 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45   should honor DE
19cc0 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69  SC requests on i
19cd0 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a  ndex columns.  *
19ce0 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63  /.  if( pDb->pSc
19cf0 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  hema->file_forma
19d00 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74  t>=4 ){.    sort
19d10 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20  OrderMask = -1; 
19d20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20    /* Honor DESC 
19d30 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
19d40 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20  sortOrderMask = 
19d50 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20  0;    /* Ignore 
19d60 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  DESC */.  }..  /
19d70 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 6c 69  * Analyze the li
19d80 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
19d90 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  s that form the 
19da0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64  terms of the ind
19db0 65 78 20 61 6e 64 0a 20 20 2a 2a 20 72 65 70 6f  ex and.  ** repo
19dc0 72 74 20 61 6e 79 20 65 72 72 6f 72 73 2e 20 20  rt any errors.  
19dd0 49 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  In the common ca
19de0 73 65 20 77 68 65 72 65 20 74 68 65 20 65 78 70  se where the exp
19df0 72 65 73 73 69 6f 6e 20 69 73 20 65 78 61 63 74  ression is exact
19e00 6c 79 0a 20 20 2a 2a 20 61 20 74 61 62 6c 65 20  ly.  ** a table 
19e10 63 6f 6c 75 6d 6e 2c 20 73 74 6f 72 65 20 74 68  column, store th
19e20 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 69 43  at column in aiC
19e30 6f 6c 75 6d 6e 5b 5d 2e 20 20 46 6f 72 20 67 65  olumn[].  For ge
19e40 6e 65 72 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  neral expression
19e50 73 2c 0a 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65  s,.  ** populate
19e60 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70   pIndex->aColExp
19e70 72 20 61 6e 64 20 73 74 6f 72 65 20 58 4e 5f 45  r and store XN_E
19e80 58 50 52 20 28 2d 32 29 20 69 6e 20 61 69 43 6f  XPR (-2) in aiCo
19e90 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  lumn[]..  **.  *
19ea0 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65 20 61 20  * TODO: Issue a 
19eb0 77 61 72 6e 69 6e 67 20 69 66 20 74 77 6f 20 6f  warning if two o
19ec0 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f  r more columns o
19ed0 66 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20  f the index are 
19ee0 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 20  identical..  ** 
19ef0 54 4f 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61  TODO: Issue a wa
19f00 72 6e 69 6e 67 20 69 66 20 74 68 65 20 74 61 62  rning if the tab
19f10 6c 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  le primary key i
19f20 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  s used as part o
19f30 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  f the.  ** index
19f40 20 6b 65 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   key..  */.  for
19f50 28 69 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d  (i=0, pListItem=
19f60 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73  pList->a; i<pLis
19f70 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
19f80 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  ListItem++){.   
19f90 20 45 78 70 72 20 2a 70 43 45 78 70 72 3b 20 20   Expr *pCExpr;  
19fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fb0 2f 2a 20 54 68 65 20 69 2d 74 68 20 69 6e 64 65  /* The i-th inde
19fc0 78 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  x expression */.
19fd0 20 20 20 20 69 6e 74 20 72 65 71 75 65 73 74 65      int requeste
19fe0 64 53 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 20  dSortOrder;     
19ff0 20 20 20 2f 2a 20 41 53 43 20 6f 72 20 44 45 53     /* ASC or DES
1a000 43 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 65 78  C on the i-th ex
1a010 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
1a020 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
1a030 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
1a040 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  * Collation sequ
1a050 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20  ence name */..  
1a060 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54    sqlite3StringT
1a070 6f 49 64 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70  oId(pListItem->p
1a080 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
1a090 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66  e3ResolveSelfRef
1a0a0 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70  erence(pParse, p
1a0b0 54 61 62 2c 20 4e 43 5f 49 64 78 45 78 70 72 2c  Tab, NC_IdxExpr,
1a0c0 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
1a0d0 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 0);.    if( p
1a0e0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
1a0f0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1a100 6e 64 65 78 3b 0a 20 20 20 20 70 43 45 78 70 72  ndex;.    pCExpr
1a110 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
1a120 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 49  ipCollate(pListI
1a130 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
1a140 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70 21   if( pCExpr->op!
1a150 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
1a160 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50      if( pTab==pP
1a170 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
1a180 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1a190 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1a1a0 65 2c 20 22 65 78 70 72 65 73 73 69 6f 6e 73 20  e, "expressions 
1a1b0 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 50 52  prohibited in PR
1a1c0 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 22 0a  IMARY KEY and ".
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1f0 22 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69  "UNIQUE constrai
1a200 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20 67  nts");.        g
1a210 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1a220 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
1a230 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d       if( pIndex-
1a240 3e 61 43 6f 6c 45 78 70 72 3d 3d 30 20 29 7b 0a  >aColExpr==0 ){.
1a250 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
1a260 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65   *pCopy = sqlite
1a270 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
1a280 20 70 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20   pList, 0);.    
1a290 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c      pIndex->aCol
1a2a0 45 78 70 72 20 3d 20 70 43 6f 70 79 3b 0a 20 20  Expr = pCopy;.  
1a2b0 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d        if( !db->m
1a2c0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1a2d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1a2e0 20 70 43 6f 70 79 21 3d 30 20 29 3b 0a 20 20 20   pCopy!=0 );.   
1a2f0 20 20 20 20 20 20 20 70 4c 69 73 74 49 74 65 6d         pListItem
1a300 20 3d 20 26 70 43 6f 70 79 2d 3e 61 5b 69 5d 3b   = &pCopy->a[i];
1a310 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a320 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20 58 4e 5f   }.      j = XN_
1a330 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64  EXPR;.      pInd
1a340 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
1a350 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20  = XN_EXPR;.     
1a360 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74   pIndex->uniqNot
1a370 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Null = 0;.    }e
1a380 6c 73 65 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70  lse{.      j = p
1a390 43 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  CExpr->iColumn;.
1a3a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
1a3b0 3d 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20 20  =0x7fff );.     
1a3c0 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20   if( j<0 ){.    
1a3d0 20 20 20 20 6a 20 3d 20 70 54 61 62 2d 3e 69 50      j = pTab->iP
1a3e0 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Key;.      }else
1a3f0 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b   if( pTab->aCol[
1a400 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b  j].notNull==0 ){
1a410 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1a420 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30  >uniqNotNull = 0
1a430 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a440 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1a450 5b 69 5d 20 3d 20 28 69 31 36 29 6a 3b 0a 20 20  [i] = (i16)j;.  
1a460 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20    }.    zColl = 
1a470 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  0;.    if( pList
1a480 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d  Item->pExpr->op=
1a490 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20  =TK_COLLATE ){. 
1a4a0 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a       int nColl;.
1a4b0 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c        zColl = pL
1a4c0 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
1a4d0 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
1a4e0 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53  nColl = sqlite3S
1a4f0 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b  trlen30(zColl) +
1a500 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
1a510 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20  ( nExtra>=nColl 
1a520 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
1a530 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e  zExtra, zColl, n
1a540 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f  Coll);.      zCo
1a550 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20  ll = zExtra;.   
1a560 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f     zExtra += nCo
1a570 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  ll;.      nExtra
1a580 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d   -= nColl;.    }
1a590 65 6c 73 65 20 69 66 28 20 6a 3e 3d 30 20 29 7b  else if( j>=0 ){
1a5a0 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
1a5b0 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f  Tab->aCol[j].zCo
1a5c0 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ll;.    }.    if
1a5d0 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c  ( !zColl ) zColl
1a5e0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
1a5f0 41 52 59 3b 0a 20 20 20 20 69 66 28 20 21 64 62  ARY;.    if( !db
1a600 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21  ->init.busy && !
1a610 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
1a620 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
1a630 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ll) ){.      got
1a640 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1a650 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
1a660 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
1a670 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65   = zColl;.    re
1a680 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
1a690 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f   = pListItem->so
1a6a0 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72  rtOrder & sortOr
1a6b0 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e  derMask;.    pIn
1a6c0 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
1a6d0 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73 74  i] = (u8)request
1a6e0 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  edSortOrder;.  }
1a6f0 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68  ..  /* Append th
1a700 65 20 74 61 62 6c 65 20 6b 65 79 20 74 6f 20 74  e table key to t
1a710 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
1a720 64 65 78 2e 20 20 46 6f 72 20 57 49 54 48 4f 55  dex.  For WITHOU
1a730 54 20 52 4f 57 49 44 0a 20 20 2a 2a 20 74 61 62  T ROWID.  ** tab
1a740 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 21 3d 30  les (when pPk!=0
1a750 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74  ) this will be t
1a760 68 65 20 64 65 63 6c 61 72 65 64 20 50 52 49 4d  he declared PRIM
1a770 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 0a 20 20  ARY KEY.  For.  
1a780 2a 2a 20 6e 6f 72 6d 61 6c 20 74 61 62 6c 65 73  ** normal tables
1a790 20 28 77 68 65 6e 20 70 50 6b 3d 3d 30 29 20 74   (when pPk==0) t
1a7a0 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
1a7b0 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  rowid..  */.  if
1a7c0 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 66 6f 72  ( pPk ){.    for
1a7d0 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65  (j=0; j<pPk->nKe
1a7e0 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  yCol; j++){.    
1a7f0 20 20 69 6e 74 20 78 20 3d 20 70 50 6b 2d 3e 61    int x = pPk->a
1a800 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
1a810 20 20 61 73 73 65 72 74 28 20 78 3e 3d 30 20 29    assert( x>=0 )
1a820 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 43  ;.      if( hasC
1a830 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d 3e 61 69  olumn(pIndex->ai
1a840 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e  Column, pIndex->
1a850 6e 4b 65 79 43 6f 6c 2c 20 78 29 20 29 7b 0a 20  nKeyCol, x) ){. 
1a860 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e         pIndex->n
1a870 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20  Column--; .     
1a880 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a890 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1a8a0 5b 69 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20 20  [i] = x;.       
1a8b0 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1a8c0 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c  i] = pPk->azColl
1a8d0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  [j];.        pIn
1a8e0 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
1a8f0 69 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f  i] = pPk->aSortO
1a900 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  rder[j];.       
1a910 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   i++;.      }.  
1a920 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1a930 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  i==pIndex->nColu
1a940 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  mn );.  }else{. 
1a950 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
1a960 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 52 4f 57 49  umn[i] = XN_ROWI
1a970 44 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  D;.    pIndex->a
1a980 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74  zColl[i] = sqlit
1a990 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d  e3StrBINARY;.  }
1a9a0 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c  .  sqlite3Defaul
1a9b0 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b  tRowEst(pIndex);
1a9c0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70  .  if( pParse->p
1a9d0 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 20 65 73  NewTable==0 ) es
1a9e0 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68  timateIndexWidth
1a9f0 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20  (pIndex);..  /* 
1aa00 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 63 6f  If this index co
1aa10 6e 74 61 69 6e 73 20 65 76 65 72 79 20 63 6f 6c  ntains every col
1aa20 75 6d 6e 20 6f 66 20 69 74 73 20 74 61 62 6c 65  umn of its table
1aa30 2c 20 74 68 65 6e 20 6d 61 72 6b 0a 20 20 2a 2a  , then mark.  **
1aa40 20 69 74 20 61 73 20 61 20 63 6f 76 65 72 69 6e   it as a coverin
1aa50 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73  g index */.  ass
1aa60 65 72 74 28 20 48 61 73 52 6f 77 69 64 28 70 54  ert( HasRowid(pT
1aa70 61 62 29 20 0a 20 20 20 20 20 20 7c 7c 20 70 54  ab) .      || pT
1aa80 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 73  ab->iPKey<0 || s
1aa90 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
1aaa0 64 65 78 28 70 49 6e 64 65 78 2c 20 70 54 61 62  dex(pIndex, pTab
1aab0 2d 3e 69 50 4b 65 79 29 3e 3d 30 20 29 3b 0a 20  ->iPKey)>=0 );. 
1aac0 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
1aad0 20 26 26 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c   && pIndex->nCol
1aae0 75 6d 6e 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  umn>=pTab->nCol 
1aaf0 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 69  ){.    pIndex->i
1ab00 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20  sCovering = 1;. 
1ab10 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
1ab20 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
1ab30 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61        if( j==pTa
1ab40 62 2d 3e 69 50 4b 65 79 20 29 20 63 6f 6e 74 69  b->iPKey ) conti
1ab50 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73  nue;.      if( s
1ab60 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
1ab70 64 65 78 28 70 49 6e 64 65 78 2c 6a 29 3e 3d 30  dex(pIndex,j)>=0
1ab80 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1ab90 20 20 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76     pIndex->isCov
1aba0 65 72 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  ering = 0;.     
1abb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1abc0 7d 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70  }..  if( pTab==p
1abd0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
1abe0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1abf0 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e  routine has been
1ac00 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
1ac10 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  e an automatic i
1ac20 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a  ndex as a.    **
1ac30 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49   result of a PRI
1ac40 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
1ac50 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63  UE clause on a c
1ac60 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
1ac70 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52  , or.    ** a PR
1ac80 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
1ac90 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f  QUE clause follo
1aca0 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20  wing the column 
1acb0 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20  definitions..   
1acc0 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a   ** i.e. one of:
1acd0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
1ace0 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 20  REATE TABLE t(x 
1acf0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b  PRIMARY KEY, y);
1ad00 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
1ad10 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49  ABLE t(x, y, UNI
1ad20 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20  QUE(x, y));.    
1ad30 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72  **.    ** Either
1ad40 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73   way, check to s
1ad50 65 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ee if the table 
1ad60 61 6c 72 65 61 64 79 20 68 61 73 20 73 75 63 68  already has such
1ad70 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20   an index. If.  
1ad80 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62    ** so, don't b
1ad90 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67 20 74  other creating t
1ada0 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e  his one. This on
1adb0 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20  ly applies to.  
1adc0 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
1add0 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 69 63  ly created indic
1ade0 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f  es. Users can do
1adf0 20 61 73 20 74 68 65 79 20 77 69 73 68 20 77 69   as they wish wi
1ae00 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63  th.    ** explic
1ae10 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  it indices..    
1ae20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e  **.    ** Two UN
1ae30 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20  IQUE or PRIMARY 
1ae40 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  KEY constraints 
1ae50 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65  are considered e
1ae60 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a  quivalent.    **
1ae70 20 28 61 6e 64 20 74 68 75 73 20 73 75 70 70 72   (and thus suppr
1ae80 65 73 73 69 6e 67 20 74 68 65 20 73 65 63 6f 6e  essing the secon
1ae90 64 20 6f 6e 65 29 20 65 76 65 6e 20 69 66 20 74  d one) even if t
1aea0 68 65 79 20 68 61 76 65 20 64 69 66 66 65 72 65  hey have differe
1aeb0 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f  nt.    ** sort o
1aec0 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20  rders..    **.  
1aed0 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72    ** If there ar
1aee0 65 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c  e different coll
1aef0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
1af00 6f 72 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  or if the column
1af10 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  s of.    ** the 
1af20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63 63 75 72  constraint occur
1af30 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 6f 72   in different or
1af40 64 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ders, then the c
1af50 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a 20  onstraints are. 
1af60 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64     ** considered
1af70 20 64 69 73 74 69 6e 63 74 20 61 6e 64 20 62 6f   distinct and bo
1af80 74 68 20 72 65 73 75 6c 74 20 69 6e 20 73 65 70  th result in sep
1af90 61 72 61 74 65 20 69 6e 64 69 63 65 73 2e 0a 20  arate indices.. 
1afa0 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20     */.    Index 
1afb0 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
1afc0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
1afd0 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
1afe0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
1aff0 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73   int k;.      as
1b000 73 65 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e  sert( IsUniqueIn
1b010 64 65 78 28 70 49 64 78 29 20 29 3b 0a 20 20 20  dex(pIdx) );.   
1b020 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
1b030 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45  >idxType!=SQLITE
1b040 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20  _IDXTYPE_APPDEF 
1b050 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1b060 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
1b070 49 6e 64 65 78 29 20 29 3b 0a 0a 20 20 20 20 20  Index) );..     
1b080 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43   if( pIdx->nKeyC
1b090 6f 6c 21 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  ol!=pIndex->nKey
1b0a0 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Col ) continue;.
1b0b0 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
1b0c0 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
1b0d0 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  k++){.        co
1b0e0 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20  nst char *z1;.  
1b0f0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1b100 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 61 73   *z2;.        as
1b110 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f  sert( pIdx->aiCo
1b120 6c 75 6d 6e 5b 6b 5d 3e 3d 30 20 29 3b 0a 20 20  lumn[k]>=0 );.  
1b130 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1b140 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e  aiColumn[k]!=pIn
1b150 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  dex->aiColumn[k]
1b160 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1b170 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43    z1 = pIdx->azC
1b180 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  oll[k];.        
1b190 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43  z2 = pIndex->azC
1b1a0 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  oll[k];.        
1b1b0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1b1c0 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65  mp(z1, z2) ) bre
1b1d0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1b1e0 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e    if( k==pIdx->n
1b1f0 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  KeyCol ){.      
1b200 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
1b210 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45  ror!=pIndex->onE
1b220 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rror ){.        
1b230 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72    /* This constr
1b240 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65  aint creates the
1b250 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61   same index as a
1b260 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
1b270 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
1b280 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65  t specified some
1b290 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45  where in the CRE
1b2a0 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
1b2b0 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ent..          *
1b2c0 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e  * However the ON
1b2d0 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
1b2e0 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e  s are different.
1b2f0 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20   If both this . 
1b300 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
1b310 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70  traint and the p
1b320 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65  revious equivale
1b330 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  nt constraint ha
1b340 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20  ve explicit.    
1b350 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46        ** ON CONF
1b360 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69  LICT clauses thi
1b370 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f  s is an error. O
1b380 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
1b390 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  e.          ** e
1b3a0 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
1b3b0 69 65 64 20 62 65 68 61 76 69 6f 72 20 66 6f 72  ied behavior for
1b3c0 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
1b3d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1b3e0 20 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f     if( !(pIdx->o
1b3f0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
1b400 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e  lt || pIndex->on
1b410 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
1b420 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
1b430 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1b440 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
1b450 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66             "conf
1b460 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c  licting ON CONFL
1b470 49 43 54 20 63 6c 61 75 73 65 73 20 73 70 65 63  ICT clauses spec
1b480 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  ified", 0);.    
1b490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b4a0 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
1b4b0 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
1b4c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1b4d0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70  Idx->onError = p
1b4e0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a  Index->onError;.
1b4f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b500 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1b510 28 20 69 64 78 54 79 70 65 3d 3d 53 51 4c 49 54  ( idxType==SQLIT
1b520 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52  E_IDXTYPE_PRIMAR
1b530 59 4b 45 59 20 29 20 70 49 64 78 2d 3e 69 64 78  YKEY ) pIdx->idx
1b540 54 79 70 65 20 3d 20 69 64 78 54 79 70 65 3b 0a  Type = idxType;.
1b550 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
1b560 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1b570 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b580 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  }..  /* Link the
1b590 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63   new Index struc
1b5a0 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c  ture to its tabl
1b5b0 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68  e and to the oth
1b5c0 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  er.  ** in-memor
1b5d0 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  y database struc
1b5e0 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 61  tures. .  */.  a
1b5f0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
1b600 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Err==0 );.  if( 
1b610 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
1b620 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  .    Index *p;. 
1b630 20 20 20 61 73 73 65 72 74 28 20 21 49 4e 5f 44     assert( !IN_D
1b640 45 43 4c 41 52 45 5f 56 54 41 42 20 29 3b 0a 20  ECLARE_VTAB );. 
1b650 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
1b660 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
1b670 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d  d(db, 0, pIndex-
1b680 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20  >pSchema) );.   
1b690 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
1b6a0 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e  Insert(&pIndex->
1b6b0 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
1b6c0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
1b6e0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64  dex->zName, pInd
1b6f0 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  ex);.    if( p )
1b700 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1b710 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a  p==pIndex );  /*
1b720 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
1b730 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  e failed */.    
1b740 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
1b750 74 28 64 62 29 3b 0a 20 20 20 20 20 20 67 6f 74  t(db);.      got
1b760 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1b770 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  dex;.    }.    d
1b780 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44  b->mDbFlags |= D
1b790 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e  BFLAG_SchemaChan
1b7a0 67 65 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c  ge;.    if( pTbl
1b7b0 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
1b7c0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
1b7d0 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
1b7e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1b7f0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1b800 20 69 6e 69 74 69 61 6c 20 43 52 45 41 54 45 20   initial CREATE 
1b810 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
1b820 28 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c 45  (or CREATE TABLE
1b830 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   if the.  ** ind
1b840 65 78 20 69 73 20 61 6e 20 69 6d 70 6c 69 65 64  ex is an implied
1b850 20 69 6e 64 65 78 20 66 6f 72 20 61 20 55 4e 49   index for a UNI
1b860 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b  QUE or PRIMARY K
1b870 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 74  EY constraint) t
1b880 68 65 6e 0a 20 20 2a 2a 20 65 6d 69 74 20 63 6f  hen.  ** emit co
1b890 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  de to allocate t
1b8a0 68 65 20 69 6e 64 65 78 20 72 6f 6f 74 70 61 67  he index rootpag
1b8b0 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64 20 6d 61  e on disk and ma
1b8c0 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 0a  ke an entry for.
1b8d0 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
1b8e0 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
1b8f0 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 70 6f  ter table and po
1b900 70 75 6c 61 74 65 20 74 68 65 20 69 6e 64 65 78  pulate the index
1b910 20 77 69 74 68 0a 20 20 2a 2a 20 63 6f 6e 74 65   with.  ** conte
1b920 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f 74  nt.  But, do not
1b930 20 64 6f 20 74 68 69 73 20 69 66 20 77 65 20 61   do this if we a
1b940 72 65 20 73 69 6d 70 6c 79 20 72 65 61 64 69 6e  re simply readin
1b950 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
1b960 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 74  ter.  ** table t
1b970 6f 20 70 61 72 73 65 20 74 68 65 20 73 63 68 65  o parse the sche
1b980 6d 61 2c 20 6f 72 20 69 66 20 74 68 69 73 20 69  ma, or if this i
1b990 6e 64 65 78 20 69 73 20 74 68 65 20 50 52 49 4d  ndex is the PRIM
1b9a0 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20  ARY KEY index.  
1b9b0 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20  ** of a WITHOUT 
1b9c0 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20 20 2a  ROWID table..  *
1b9d0 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61  *.  ** If pTblNa
1b9e0 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
1b9f0 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e  his index is gen
1ba00 65 72 61 74 65 64 20 61 73 20 61 6e 20 69 6d 70  erated as an imp
1ba10 6c 69 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59  lied PRIMARY KEY
1ba20 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20  .  ** or UNIQUE 
1ba30 69 6e 64 65 78 20 69 6e 20 61 20 43 52 45 41 54  index in a CREAT
1ba40 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
1ba50 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61  t.  Since the ta
1ba60 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73  ble.  ** has jus
1ba70 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  t been created, 
1ba80 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  it contains no d
1ba90 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ata and the inde
1baa0 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  x initialization
1bab0 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62  .  ** step can b
1bac0 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  e skipped..  */.
1bad0 20 20 65 6c 73 65 20 69 66 28 20 48 61 73 52 6f    else if( HasRo
1bae0 77 69 64 28 70 54 61 62 29 20 7c 7c 20 70 54 62  wid(pTab) || pTb
1baf0 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  lName!=0 ){.    
1bb00 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61  Vdbe *v;.    cha
1bb10 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e  r *zStmt;.    in
1bb20 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  t iMem = ++pPars
1bb30 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20  e->nMem;..    v 
1bb40 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1bb50 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
1bb60 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ( v==0 ) goto ex
1bb70 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1bb80 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ..    sqlite3Beg
1bb90 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
1bba0 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
1bbb0 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ;..    /* Create
1bbc0 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f   the rootpage fo
1bbd0 72 20 74 68 65 20 69 6e 64 65 78 20 75 73 69 6e  r the index usin
1bbe0 67 20 43 72 65 61 74 65 49 6e 64 65 78 2e 20 42  g CreateIndex. B
1bbf0 75 74 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ut before.    **
1bc00 20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f 64 65 20   doing so, code 
1bc10 61 20 4e 6f 6f 70 20 69 6e 73 74 72 75 63 74 69  a Noop instructi
1bc20 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 69 74 73  on and store its
1bc30 20 61 64 64 72 65 73 73 20 69 6e 20 0a 20 20 20   address in .   
1bc40 20 2a 2a 20 49 6e 64 65 78 2e 74 6e 75 6d 2e 20   ** Index.tnum. 
1bc50 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
1bc60 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 69 6e   in case this in
1bc70 64 65 78 20 69 73 20 61 63 74 75 61 6c 6c 79 20  dex is actually 
1bc80 61 20 0a 20 20 20 20 2a 2a 20 50 52 49 4d 41 52  a .    ** PRIMAR
1bc90 59 20 4b 45 59 20 61 6e 64 20 74 68 65 20 74 61  Y KEY and the ta
1bca0 62 6c 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ble is actually 
1bcb0 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
1bcc0 74 61 62 6c 65 2e 20 49 6e 20 0a 20 20 20 20 2a  table. In .    *
1bcd0 2a 20 74 68 61 74 20 63 61 73 65 20 74 68 65 20  * that case the 
1bce0 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74  convertToWithout
1bcf0 52 6f 77 69 64 54 61 62 6c 65 28 29 20 72 6f 75  RowidTable() rou
1bd00 74 69 6e 65 20 77 69 6c 6c 20 72 65 70 6c 61 63  tine will replac
1bd10 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 4e 6f 6f  e.    ** the Noo
1bd20 70 20 77 69 74 68 20 61 20 47 6f 74 6f 20 74 6f  p with a Goto to
1bd30 20 6a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 56   jump over the V
1bd40 44 42 45 20 63 6f 64 65 20 67 65 6e 65 72 61 74  DBE code generat
1bd50 65 64 20 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20  ed below. */.   
1bd60 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
1bd70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bd80 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20  0(v, OP_Noop);. 
1bd90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bda0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74  dOp3(v, OP_Creat
1bdb0 65 42 74 72 65 65 2c 20 69 44 62 2c 20 69 4d 65  eBtree, iDb, iMe
1bdc0 6d 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59  m, BTREE_BLOBKEY
1bdd0 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65  );..    /* Gathe
1bde0 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  r the complete t
1bdf0 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
1be00 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
1be10 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68  t into.    ** th
1be20 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65  e zStmt variable
1be30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1be40 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  pStart ){.      
1be50 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 28 70 50  int n = (int)(pP
1be60 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
1be70 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b  .z - pName->z) +
1be80 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f   pParse->sLastTo
1be90 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28  ken.n;.      if(
1bea0 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d   pName->z[n-1]==
1beb0 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20  ';' ) n--;.     
1bec0 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65   /* A named inde
1bed0 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63  x with an explic
1bee0 69 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  it CREATE INDEX 
1bef0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
1bf00 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
1bf10 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43  e3MPrintf(db, "C
1bf20 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e  REATE%s INDEX %.
1bf30 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45  *s",.        onE
1bf40 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20  rror==OE_None ? 
1bf50 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 20  "" : " UNIQUE", 
1bf60 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20  n, pName->z);.  
1bf70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
1bf80 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  * An automatic i
1bf90 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79 20  ndex created by 
1bfa0 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
1bfb0 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
1bfc0 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a  nt */.      /* z
1bfd0 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
1bfe0 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20  rintf(""); */.  
1bff0 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20      zStmt = 0;. 
1c000 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
1c010 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c   an entry in sql
1c020 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74  ite_master for t
1c030 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f  his index.    */
1c040 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
1c050 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
1c060 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54  .        "INSERT
1c070 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55   INTO %Q.%s VALU
1c080 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51  ES('index',%Q,%Q
1c090 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20  ,#%d,%Q);",.    
1c0a0 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
1c0b0 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45  .zDbSName, MASTE
1c0c0 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20 20 20  R_NAME,.        
1c0d0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20  pIndex->zName,. 
1c0e0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
1c0f0 6d 65 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d  me,.        iMem
1c100 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a  ,.        zStmt.
1c110 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
1c120 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74  e3DbFree(db, zSt
1c130 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c  mt);..    /* Fil
1c140 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  l the index with
1c150 20 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73   data and repars
1c160 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f  e the schema. Co
1c170 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a  de an OP_Expire.
1c180 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69      ** to invali
1c190 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d  date all pre-com
1c1a0 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
1c1b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1c1c0 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20   pTblName ){.   
1c1d0 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
1c1e0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
1c1f0 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  ndex, iMem);.   
1c200 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
1c210 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
1c220 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
1c230 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63  e3VdbeAddParseSc
1c240 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20  hemaOp(v, iDb,. 
1c250 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
1c260 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65  Printf(db, "name
1c270 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27  ='%q' AND type='
1c280 69 6e 64 65 78 27 22 2c 20 70 49 6e 64 65 78 2d  index'", pIndex-
1c290 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
1c2a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c2b0 30 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b  0(v, OP_Expire);
1c2c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
1c2d0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1c2e0 76 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 29  v, pIndex->tnum)
1c2f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
1c300 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78   adding an index
1c310 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
1c320 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61  indices for a ta
1c330 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  ble, make.  ** s
1c340 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ure all indices 
1c350 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61  labeled OE_Repla
1c360 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c  ce come after al
1c370 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a  l those labeled.
1c380 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20    ** OE_Ignore. 
1c390 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
1c3a0 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ry for the corre
1c3b0 63 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68  ct constraint ch
1c3c0 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73  eck.  ** process
1c3d0 69 6e 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47  ing (in sqlite3G
1c3e0 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e  enerateConstrain
1c3f0 74 43 68 65 63 6b 73 28 29 29 20 61 73 20 70 61  tChecks()) as pa
1c400 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54  rt of.  ** UPDAT
1c410 45 20 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61  E and INSERT sta
1c420 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a  tements.  .  */.
1c430 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
1c440 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d  usy || pTblName=
1c450 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e  =0 ){.    if( on
1c460 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
1c470 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
1c480 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  x==0.         ||
1c490 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
1c4a0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
1c4b0 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  ce){.      pInde
1c4c0 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
1c4d0 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70  >pIndex;.      p
1c4e0 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  Tab->pIndex = pI
1c4f0 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ndex;.    }else{
1c500 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  .      Index *pO
1c510 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e  ther = pTab->pIn
1c520 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  dex;.      while
1c530 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20  ( pOther->pNext 
1c540 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  && pOther->pNext
1c550 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ->onError!=OE_Re
1c560 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  place ){.       
1c570 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72   pOther = pOther
1c580 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
1c590 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
1c5a0 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
1c5b0 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68  Next;.      pOth
1c5c0 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64  er->pNext = pInd
1c5d0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
1c5e0 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ndex = 0;.  }.. 
1c5f0 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
1c600 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
1c610 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1c620 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  :.  if( pIndex )
1c630 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70   freeIndex(db, p
1c640 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65  Index);.  sqlite
1c650 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1c660 70 50 49 57 68 65 72 65 29 3b 0a 20 20 73 71 6c  pPIWhere);.  sql
1c670 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
1c680 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
1c690 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
1c6a0 65 6c 65 74 65 28 64 62 2c 20 70 54 62 6c 4e 61  elete(db, pTblNa
1c6b0 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
1c6c0 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
1c6d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74  .}../*.** Fill t
1c6e0 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73  he Index.aiRowEs
1c6f0 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 64  t[] array with d
1c700 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69  efault informati
1c710 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  on - information
1c720 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77  .** to be used w
1c730 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20  hen we have not 
1c740 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20  run the ANALYZE 
1c750 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61  command..**.** a
1c760 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75  iRowEst[0] is su
1c770 70 70 6f 73 65 64 20 74 6f 20 63 6f 6e 74 61 69  pposed to contai
1c780 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1c790 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
1c7a0 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20  index..** Since 
1c7b0 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20  we do not know, 
1c7c0 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e  guess 1 million.
1c7d0 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73    aiRowEst[1] is
1c7e0 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
1c7f0 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
1c800 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
1c810 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e  le that match an
1c820 79 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c  y particular val
1c830 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72  ue of the.** fir
1c840 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
1c850 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73   index.  aiRowEs
1c860 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[2] is an estim
1c870 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
1c880 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61  r.** of rows tha
1c890 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
1c8a0 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69  icular combinati
1c8b0 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  on of the first 
1c8c0 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20  2 columns.** of 
1c8d0 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20  the index.  And 
1c8e0 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75  so forth.  It mu
1c8f0 73 74 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  st always be the
1c900 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20   case that.*.** 
1c910 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45            aiRowE
1c920 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b  st[N]<=aiRowEst[
1c930 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20  N-1].**         
1c940 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31    aiRowEst[N]>=1
1c950 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f  .**.** Apart fro
1c960 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76 65 20  m that, we have 
1c970 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20  little to go on 
1c980 62 65 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f  besides intuitio
1c990 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61  n as to.** how a
1c9a0 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64  iRowEst[] should
1c9b0 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
1c9c0 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65    The numbers ge
1c9d0 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20  nerated here.** 
1c9e0 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70  are based on typ
1c9f0 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e  ical values foun
1ca00 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69  d in actual indi
1ca10 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ces..*/.void sql
1ca20 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
1ca30 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  t(Index *pIdx){.
1ca40 20 20 2f 2a 20 20 20 20 20 20 20 20 20 20 20 20    /*            
1ca50 20 20 20 20 31 30 2c 20 20 39 2c 20 20 38 2c 20      10,  9,  8, 
1ca60 20 37 2c 20 20 36 20 2a 2f 0a 20 20 4c 6f 67 45   7,  6 */.  LogE
1ca70 73 74 20 61 56 61 6c 5b 5d 20 3d 20 7b 20 33 33  st aVal[] = { 33
1ca80 2c 20 33 32 2c 20 33 30 2c 20 32 38 2c 20 32 36  , 32, 30, 28, 26
1ca90 20 7d 3b 0a 20 20 4c 6f 67 45 73 74 20 2a 61 20   };.  LogEst *a 
1caa0 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67  = pIdx->aiRowLog
1cab0 45 73 74 3b 0a 20 20 69 6e 74 20 6e 43 6f 70 79  Est;.  int nCopy
1cac0 20 3d 20 4d 49 4e 28 41 72 72 61 79 53 69 7a 65   = MIN(ArraySize
1cad0 28 61 56 61 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b  (aVal), pIdx->nK
1cae0 65 79 43 6f 6c 29 3b 0a 20 20 69 6e 74 20 69 3b  eyCol);.  int i;
1caf0 0a 0a 20 20 2f 2a 20 49 6e 64 65 78 65 73 20 77  ..  /* Indexes w
1cb00 69 74 68 20 64 65 66 61 75 6c 74 20 72 6f 77 20  ith default row 
1cb10 65 73 74 69 6d 61 74 65 73 20 73 68 6f 75 6c 64  estimates should
1cb20 20 6e 6f 74 20 68 61 76 65 20 73 74 61 74 31 20   not have stat1 
1cb30 64 61 74 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  data */.  assert
1cb40 28 20 21 70 49 64 78 2d 3e 68 61 73 53 74 61 74  ( !pIdx->hasStat
1cb50 31 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  1 );..  /* Set t
1cb60 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 28  he first entry (
1cb70 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
1cb80 6e 20 74 68 65 20 69 6e 64 65 78 29 20 74 6f 20  n the index) to 
1cb90 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 0a 20  the estimated . 
1cba0 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f   ** number of ro
1cbb0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c  ws in the table,
1cbc0 20 6f 72 20 68 61 6c 66 20 74 68 65 20 6e 75 6d   or half the num
1cbd0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1cbe0 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 66 6f  he table.  ** fo
1cbf0 72 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65  r a partial inde
1cc00 78 2e 20 20 20 42 75 74 20 64 6f 20 6e 6f 74 20  x.   But do not 
1cc10 6c 65 74 20 74 68 65 20 65 73 74 69 6d 61 74 65  let the estimate
1cc20 20 64 72 6f 70 20 62 65 6c 6f 77 20 31 30 2e 20   drop below 10. 
1cc30 2a 2f 0a 20 20 61 5b 30 5d 20 3d 20 70 49 64 78  */.  a[0] = pIdx
1cc40 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f  ->pTable->nRowLo
1cc50 67 45 73 74 3b 0a 20 20 69 66 28 20 70 49 64 78  gEst;.  if( pIdx
1cc60 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21  ->pPartIdxWhere!
1cc70 3d 30 20 29 20 61 5b 30 5d 20 2d 3d 20 31 30 3b  =0 ) a[0] -= 10;
1cc80 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71    assert( 10==sq
1cc90 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29  lite3LogEst(2) )
1cca0 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3c 33 33 20  ;.  if( a[0]<33 
1ccb0 29 20 61 5b 30 5d 20 3d 20 33 33 3b 20 20 20 20  ) a[0] = 33;    
1ccc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1ccd0 73 65 72 74 28 20 33 33 3d 3d 73 71 6c 69 74 65  sert( 33==sqlite
1cce0 33 4c 6f 67 45 73 74 28 31 30 29 20 29 3b 0a 0a  3LogEst(10) );..
1ccf0 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68    /* Estimate th
1cd00 61 74 20 61 5b 31 5d 20 69 73 20 31 30 2c 20 61  at a[1] is 10, a
1cd10 5b 32 5d 20 69 73 20 39 2c 20 61 5b 33 5d 20 69  [2] is 9, a[3] i
1cd20 73 20 38 2c 20 61 5b 34 5d 20 69 73 20 37 2c 20  s 8, a[4] is 7, 
1cd30 61 5b 35 5d 20 69 73 0a 20 20 2a 2a 20 36 20 61  a[5] is.  ** 6 a
1cd40 6e 64 20 65 61 63 68 20 73 75 62 73 65 71 75 65  nd each subseque
1cd50 6e 74 20 76 61 6c 75 65 20 28 69 66 20 61 6e 79  nt value (if any
1cd60 29 20 69 73 20 35 2e 20 20 2a 2f 0a 20 20 6d 65  ) is 5.  */.  me
1cd70 6d 63 70 79 28 26 61 5b 31 5d 2c 20 61 56 61 6c  mcpy(&a[1], aVal
1cd80 2c 20 6e 43 6f 70 79 2a 73 69 7a 65 6f 66 28 4c  , nCopy*sizeof(L
1cd90 6f 67 45 73 74 29 29 3b 0a 20 20 66 6f 72 28 69  ogEst));.  for(i
1cda0 3d 6e 43 6f 70 79 2b 31 3b 20 69 3c 3d 70 49 64  =nCopy+1; i<=pId
1cdb0 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29  x->nKeyCol; i++)
1cdc0 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 32 33 3b  {.    a[i] = 23;
1cdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cde0 20 20 20 20 61 73 73 65 72 74 28 20 32 33 3d 3d      assert( 23==
1cdf0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 35 29  sqlite3LogEst(5)
1ce00 20 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72   );.  }..  asser
1ce10 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  t( 0==sqlite3Log
1ce20 45 73 74 28 31 29 20 29 3b 0a 20 20 69 66 28 20  Est(1) );.  if( 
1ce30 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
1ce40 64 78 29 20 29 20 61 5b 70 49 64 78 2d 3e 6e 4b  dx) ) a[pIdx->nK
1ce50 65 79 43 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f  eyCol] = 0;.}../
1ce60 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1ce70 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65  e will drop an e
1ce80 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e  xisting named in
1ce90 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69  dex.  This routi
1cea0 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73  ne.** implements
1ceb0 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20   the DROP INDEX 
1cec0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
1ced0 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e  id sqlite3DropIn
1cee0 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
1cef0 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
1cf00 65 2c 20 69 6e 74 20 69 66 45 78 69 73 74 73 29  e, int ifExists)
1cf10 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
1cf20 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  x;.  Vdbe *v;.  
1cf30 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1cf40 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
1cf50 69 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  iDb;..  assert( 
1cf60 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
1cf70 29 3b 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61  );   /* Never ca
1cf80 6c 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72 20  lled with prior 
1cf90 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20  errors */.  if( 
1cfa0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1cfb0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
1cfc0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1cfd0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  }.  assert( pNam
1cfe0 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
1cff0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
1d000 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
1d010 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
1d020 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1d030 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  ndex;.  }.  pInd
1d040 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
1d050 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d  Index(db, pName-
1d060 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61  >a[0].zName, pNa
1d070 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
1d080 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  se);.  if( pInde
1d090 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  x==0 ){.    if( 
1d0a0 21 69 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20  !ifExists ){.   
1d0b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1d0c0 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
1d0d0 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20  uch index: %S", 
1d0e0 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d  pName, 0);.    }
1d0f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
1d100 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d  te3CodeVerifyNam
1d110 65 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  edSchema(pParse,
1d120 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
1d130 74 61 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20  tabase);.    }. 
1d140 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
1d150 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
1d160 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1d170 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
1d180 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 21  pIndex->idxType!
1d190 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
1d1a0 41 50 50 44 45 46 20 29 7b 0a 20 20 20 20 73 71  APPDEF ){.    sq
1d1b0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1d1c0 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73  arse, "index ass
1d1d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49  ociated with UNI
1d1e0 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20  QUE ".      "or 
1d1f0 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
1d200 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65  traint cannot be
1d210 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20   dropped", 0);. 
1d220 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1d230 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  p_index;.  }.  i
1d240 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
1d250 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49  maToIndex(db, pI
1d260 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  ndex->pSchema);.
1d270 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d280 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
1d290 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
1d2a0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
1d2b0 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c  _INDEX;.    Tabl
1d2c0 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
1d2d0 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f  ->pTable;.    co
1d2e0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
1d2f0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
1d300 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  SName;.    const
1d310 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
1d320 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b  HEMA_TABLE(iDb);
1d330 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1d340 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1d350 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
1d360 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29   zTab, 0, zDb) )
1d370 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
1d380 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1d390 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49    }.    if( !OMI
1d3a0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 20  T_TEMPDB && iDb 
1d3b0 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  ) code = SQLITE_
1d3c0 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  DROP_TEMP_INDEX;
1d3d0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1d3e0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1d3f0 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e  , code, pIndex->
1d400 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
1d410 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
1d420 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1d430 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
1d440 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
1d450 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1d460 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78  remove the index
1d470 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61   and from the ma
1d480 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
1d490 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1d4a0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1d4b0 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
1d4c0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
1d4d0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
1d4e0 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
1d4f0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
1d500 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45  arse,.       "DE
1d510 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
1d520 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e  WHERE name=%Q AN
1d530 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c  D type='index'",
1d540 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  .       db->aDb[
1d550 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d  iDb].zDbSName, M
1d560 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70 49 6e 64  ASTER_NAME, pInd
1d570 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b  ex->zName.    );
1d580 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61  .    sqlite3Clea
1d590 72 53 74 61 74 54 61 62 6c 65 73 28 70 50 61 72  rStatTables(pPar
1d5a0 73 65 2c 20 69 44 62 2c 20 22 69 64 78 22 2c 20  se, iDb, "idx", 
1d5b0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a  pIndex->zName);.
1d5c0 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
1d5d0 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
1d5e0 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f  iDb);.    destro
1d5f0 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
1d600 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20  , pIndex->tnum, 
1d610 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
1d620 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1d630 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62  P_DropIndex, iDb
1d640 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  , 0, 0, pIndex->
1d650 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a  zName, 0);.  }..
1d660 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a  exit_drop_index:
1d670 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
1d680 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d  tDelete(db, pNam
1d690 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72  e);.}../*.** pAr
1d6a0 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ray is a pointer
1d6b0 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20   to an array of 
1d6c0 6f 62 6a 65 63 74 73 2e 20 45 61 63 68 20 6f 62  objects. Each ob
1d6d0 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61  ject in the.** a
1d6e0 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20  rray is szEntry 
1d6f0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54  bytes in size. T
1d700 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 73  his routine uses
1d710 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
1d720 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e 64  c().** to extend
1d730 20 74 68 65 20 61 72 72 61 79 20 73 6f 20 74 68   the array so th
1d740 61 74 20 74 68 65 72 65 20 69 73 20 73 70 61 63  at there is spac
1d750 65 20 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a 65  e for a new obje
1d760 63 74 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a  ct at the end..*
1d770 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
1d780 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1d790 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e 74  d, *pnEntry cont
1d7a0 61 69 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74  ains the current
1d7b0 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20   size of.** the 
1d7c0 61 72 72 61 79 20 28 69 6e 20 65 6e 74 72 69 65  array (in entrie
1d7d0 73 20 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f 63  s - so the alloc
1d7e0 61 74 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45 6e  ation is ((*pnEn
1d7f0 74 72 79 29 20 2a 20 73 7a 45 6e 74 72 79 29 20  try) * szEntry) 
1d800 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74 61  bytes.** in tota
1d810 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  l)..**.** If the
1d820 20 72 65 61 6c 6c 6f 63 28 29 20 69 73 20 73 75   realloc() is su
1d830 63 63 65 73 73 66 75 6c 20 28 69 2e 65 2e 20 69  ccessful (i.e. i
1d840 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74 69  f no OOM conditi
1d850 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74 68 65 0a  on occurs), the.
1d860 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  ** space allocat
1d870 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6f  ed for the new o
1d880 62 6a 65 63 74 20 69 73 20 7a 65 72 6f 65 64 2c  bject is zeroed,
1d890 20 2a 70 6e 45 6e 74 72 79 20 75 70 64 61 74 65   *pnEntry update
1d8a0 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20  d to.** reflect 
1d8b0 74 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20  the new size of 
1d8c0 74 68 65 20 61 72 72 61 79 20 61 6e 64 20 61 20  the array and a 
1d8d0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
1d8e0 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ew allocation.**
1d8f0 20 72 65 74 75 72 6e 65 64 2e 20 2a 70 49 64 78   returned. *pIdx
1d900 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69   is set to the i
1d910 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20  ndex of the new 
1d920 61 72 72 61 79 20 65 6e 74 72 79 20 69 6e 20 74  array entry in t
1d930 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
1d940 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1d950 65 20 72 65 61 6c 6c 6f 63 28 29 20 66 61 69 6c  e realloc() fail
1d960 73 2c 20 2a 70 49 64 78 20 69 73 20 73 65 74 20  s, *pIdx is set 
1d970 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79 20  to -1, *pnEntry 
1d980 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68 61  remains.** uncha
1d990 6e 67 65 64 20 61 6e 64 20 61 20 63 6f 70 79 20  nged and a copy 
1d9a0 6f 66 20 70 41 72 72 61 79 20 72 65 74 75 72 6e  of pArray return
1d9b0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ed..*/.void *sql
1d9c0 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
1d9d0 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
1d9e0 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ,      /* Connec
1d9f0 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f  tion to notify o
1da00 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  f malloc failure
1da10 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  s */.  void *pAr
1da20 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61  ray,     /* Arra
1da30 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d  y of objects.  M
1da40 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61  ight be realloca
1da50 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45  ted */.  int szE
1da60 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69  ntry,      /* Si
1da70 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63  ze of each objec
1da80 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a  t in the array *
1da90 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79  /.  int *pnEntry
1daa0 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
1dab0 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65  of objects curre
1dac0 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20  ntly in use */. 
1dad0 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20   int *pIdx      
1dae0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1daf0 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73  index of a new s
1db00 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lot here */.){. 
1db10 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20   char *z;.  int 
1db20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20  n = *pnEntry;.  
1db30 69 66 28 20 28 6e 20 26 20 28 6e 2d 31 29 29 3d  if( (n & (n-1))=
1db40 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  =0 ){.    int sz
1db50 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31 20 3a 20   = (n==0) ? 1 : 
1db60 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70  2*n;.    void *p
1db70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
1db80 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61  ealloc(db, pArra
1db90 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a  y, sz*szEntry);.
1dba0 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
1dbb0 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d  ){.      *pIdx =
1dbc0 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
1dbd0 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a  n pArray;.    }.
1dbe0 20 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65      pArray = pNe
1dbf0 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68  w;.  }.  z = (ch
1dc00 61 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65  ar*)pArray;.  me
1dc10 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e  mset(&z[n * szEn
1dc20 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79  try], 0, szEntry
1dc30 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 6e 3b 0a  );.  *pIdx = n;.
1dc40 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20    ++*pnEntry;.  
1dc50 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d  return pArray;.}
1dc60 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
1dc70 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
1dc80 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74  the given IdList
1dc90 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
1dca0 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  IdList if.** nee
1dcb0 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  d be..**.** A ne
1dcc0 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74 75  w IdList is retu
1dcd0 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
1dce0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
1dcf0 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69  .*/.IdList *sqli
1dd00 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
1dd10 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c  sqlite3 *db, IdL
1dd20 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
1dd30 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e  n *pToken){.  in
1dd40 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
1dd50 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
1dd60 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1dd70 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
1dd80 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20  f(IdList) );.   
1dd90 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1dda0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1ddb0 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74  pList->a = sqlit
1ddc0 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
1ddd0 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20  .      db,.     
1dde0 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20   pList->a,.     
1ddf0 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
1de00 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c 69  [0]),.      &pLi
1de10 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26  st->nId,.      &
1de20 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30  i.  );.  if( i<0
1de30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   ){.    sqlite3I
1de40 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
1de50 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75  pList);.    retu
1de60 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
1de70 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
1de80 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1de90 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29  oken(db, pToken)
1dea0 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
1deb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
1dec0 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a  e an IdList..*/.
1ded0 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69  void sqlite3IdLi
1dee0 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
1def0 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c   *db, IdList *pL
1df00 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
1df10 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1df20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
1df30 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
1df40 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
1df50 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
1df60 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
1df70 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
1df80 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
1df90 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  a);.  sqlite3DbF
1dfa0 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29  reeNN(db, pList)
1dfb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1dfc0 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70  n the index in p
1dfd0 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e  List of the iden
1dfe0 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64  tifier named zId
1dff0 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20  .  Return -1.** 
1e000 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
1e010 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69  .int sqlite3IdLi
1e020 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a  stIndex(IdList *
1e030 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61  pList, const cha
1e040 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
1e050 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1e060 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  =0 ) return -1;.
1e070 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
1e080 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
1e090 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1e0a0 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
1e0b0 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ].zName, zName)=
1e0c0 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
1e0d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
1e0e0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20  }../*.** Expand 
1e0f0 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61  the space alloca
1e100 74 65 64 20 66 6f 72 20 74 68 65 20 67 69 76 65  ted for the give
1e110 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74  n SrcList object
1e120 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20   by.** creating 
1e130 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74 73  nExtra new slots
1e140 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53   beginning at iS
1e150 74 61 72 74 2e 20 20 69 53 74 61 72 74 20 69 73  tart.  iStart is
1e160 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20   zero based..** 
1e170 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a 65  New slots are ze
1e180 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  roed..**.** For 
1e190 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65  example, suppose
1e1a0 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74 69   a SrcList initi
1e1b0 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 77  ally contains tw
1e1c0 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a  o entries: A,B..
1e1d0 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20 6e  ** To append 3 n
1e1e0 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20  ew entries onto 
1e1f0 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69 73  the end, do this
1e200 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74  :.**.**    sqlit
1e210 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
1e220 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20 33  (db, pSrclist, 3
1e230 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65  , 2);.**.** Afte
1e240 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65  r the call above
1e250 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69   it would contai
1e260 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e  n:  A, B, nil, n
1e270 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74  il, nil..** If t
1e280 68 65 20 69 53 74 61 72 74 20 61 72 67 75 6d 65  he iStart argume
1e290 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20 69 6e  nt had been 1 in
1e2a0 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65 6e  stead of 2, then
1e2b0 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77   the result.** w
1e2c0 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a 20  ould have been: 
1e2d0 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69   A, nil, nil, ni
1e2e0 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65 6e  l, B.  To prepen
1e2f0 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c  d the new slots,
1e300 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20 76  .** the iStart v
1e310 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30 2e  alue would be 0.
1e320 20 20 54 68 65 20 72 65 73 75 6c 74 20 74 68 65    The result the
1e330 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e  n would.** be: n
1e340 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c  il, nil, nil, A,
1e350 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d   B..**.** If a m
1e360 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1e370 20 66 61 69 6c 73 20 74 68 65 20 53 72 63 4c 69   fails the SrcLi
1e380 73 74 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e  st is unchanged.
1e390 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c    The.** db->mal
1e3a0 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 77  locFailed flag w
1e3b0 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 72  ill be set to tr
1e3c0 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  ue..*/.SrcList *
1e3d0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
1e3e0 6c 61 72 67 65 28 0a 20 20 73 71 6c 69 74 65 33  large(.  sqlite3
1e3f0 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20 44   *db,       /* D
1e400 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1e410 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20  on to notify of 
1e420 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  OOM errors */.  
1e430 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
1e440 20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c 69 73     /* The SrcLis
1e450 74 20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65 64  t to be enlarged
1e460 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
1e470 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ,        /* Numb
1e480 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20  er of new slots 
1e490 74 6f 20 61 64 64 20 74 6f 20 70 53 72 63 2d 3e  to add to pSrc->
1e4a0 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74  a[] */.  int iSt
1e4b0 61 72 74 20 20 20 20 20 20 20 20 20 2f 2a 20 49  art         /* I
1e4c0 6e 64 65 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b  ndex in pSrc->a[
1e4d0 5d 20 6f 66 20 66 69 72 73 74 20 6e 65 77 20 73  ] of first new s
1e4e0 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lot */.){.  int 
1e4f0 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  i;..  /* Sanity 
1e500 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c  checking on call
1e510 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ing parameters *
1e520 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  /.  assert( iSta
1e530 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  rt>=0 );.  asser
1e540 74 28 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a  t( nExtra>=1 );.
1e550 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d    assert( pSrc!=
1e560 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1e570 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72  Start<=pSrc->nSr
1e580 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  c );..  /* Alloc
1e590 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ate additional s
1e5a0 70 61 63 65 20 69 66 20 6e 65 65 64 65 64 20 2a  pace if needed *
1e5b0 2f 0a 20 20 69 66 28 20 28 75 33 32 29 70 53 72  /.  if( (u32)pSr
1e5c0 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70  c->nSrc+nExtra>p
1e5d0 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  Src->nAlloc ){. 
1e5e0 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77     SrcList *pNew
1e5f0 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63  ;.    int nAlloc
1e600 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2a 32 2b   = pSrc->nSrc*2+
1e610 6e 45 78 74 72 61 3b 0a 20 20 20 20 69 6e 74 20  nExtra;.    int 
1e620 6e 47 6f 74 3b 0a 20 20 20 20 70 4e 65 77 20 3d  nGot;.    pNew =
1e630 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
1e640 63 28 64 62 2c 20 70 53 72 63 2c 0a 20 20 20 20  c(db, pSrc,.    
1e650 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
1e660 66 28 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c  f(*pSrc) + (nAll
1e670 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53 72  oc-1)*sizeof(pSr
1e680 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20  c->a[0]) );.    
1e690 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
1e6a0 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
1e6b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1e6c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 53  .      return pS
1e6d0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  rc;.    }.    pS
1e6e0 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e  rc = pNew;.    n
1e6f0 47 6f 74 20 3d 20 28 73 71 6c 69 74 65 33 44 62  Got = (sqlite3Db
1e700 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70  MallocSize(db, p
1e710 4e 65 77 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70  New) - sizeof(*p
1e720 53 72 63 29 29 2f 73 69 7a 65 6f 66 28 70 53 72  Src))/sizeof(pSr
1e730 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20  c->a[0])+1;.    
1e740 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e  pSrc->nAlloc = n
1e750 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  Got;.  }..  /* M
1e760 6f 76 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f  ove existing slo
1e770 74 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74  ts that come aft
1e780 65 72 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73  er the newly ins
1e790 65 72 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a  erted slots.  **
1e7a0 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79 20   out of the way 
1e7b0 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d  */.  for(i=pSrc-
1e7c0 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61  >nSrc-1; i>=iSta
1e7d0 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53  rt; i--){.    pS
1e7e0 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20  rc->a[i+nExtra] 
1e7f0 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  = pSrc->a[i];.  
1e800 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b  }.  pSrc->nSrc +
1e810 3d 20 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20  = nExtra;..  /* 
1e820 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20 61  Zero the newly a
1e830 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20 2a  llocated slots *
1e840 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72 63  /.  memset(&pSrc
1e850 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20  ->a[iStart], 0, 
1e860 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
1e870 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f  ])*nExtra);.  fo
1e880 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69 53  r(i=iStart; i<iS
1e890 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b  tart+nExtra; i++
1e8a0 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  ){.    pSrc->a[i
1e8b0 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  ].iCursor = -1;.
1e8c0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e    }..  /* Return
1e8d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1e8e0 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c 69  e enlarged SrcLi
1e8f0 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  st */.  return p
1e900 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  Src;.}.../*.** A
1e910 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c  ppend a new tabl
1e920 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69  e name to the gi
1e930 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72  ven SrcList.  Cr
1e940 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69  eate a new SrcLi
1e950 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
1e960 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
1e970 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  s created in the
1e980 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66   SrcList even if
1e990 20 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e   pTable is NULL.
1e9a0 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74  .**.** A SrcList
1e9b0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
1e9c0 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69   NULL if there i
1e9d0 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20  s an OOM error. 
1e9e0 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a   The returned.**
1e9f0 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 62   SrcList might b
1ea00 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
1ea10 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 77  e SrcList that w
1ea20 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20 6d  as input or it m
1ea30 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77  ight be.** a new
1ea40 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d   one.  If an OOM
1ea50 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75   error does occu
1ea60 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72 69  rs, then the pri
1ea70 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69 73  or value of pLis
1ea80 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 70  t.** that is inp
1ea90 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ut to this routi
1eaa0 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  ne is automatica
1eab0 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  lly freed..**.**
1eac0 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69 73   If pDatabase is
1ead0 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65   not null, it me
1eae0 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61 62  ans that the tab
1eaf0 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e  le has an option
1eb00 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e  al.** database n
1eb10 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b  ame prefix.  Lik
1eb20 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62 61  e this:  "databa
1eb30 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20  se.table".  The 
1eb40 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69  pDatabase.** poi
1eb50 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65  nts to the table
1eb60 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54   name and the pT
1eb70 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74  able points to t
1eb80 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
1eb90 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74  ..** The SrcList
1eba0 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64  .a[].zName field
1ebb0 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
1ebc0 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
1ebd0 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f  hich might.** co
1ebe0 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28  me from pTable (
1ebf0 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20  if pDatabase is 
1ec00 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44  NULL) or from pD
1ec10 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72  atabase.  .** Sr
1ec20 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62  cList.a[].zDatab
1ec30 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69  ase is filled wi
1ec40 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
1ec50 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  name from pTable
1ec60 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c  ,.** or with NUL
1ec70 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65  L if no database
1ec80 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a   is specified..*
1ec90 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f  *.** In other wo
1eca0 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b  rds, if call lik
1ecb0 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
1ecc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
1ecd0 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42  ListAppend(D,A,B
1ece0 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,0);.**.** Then 
1ecf0 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d  B is a table nam
1ed00 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
1ed10 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65  se name is unspe
1ed20 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c  cified.  If call
1ed30 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a  ed.** like this:
1ed40 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
1ed50 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1ed60 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a  end(D,A,B,C);.**
1ed70 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68  .** Then C is th
1ed80 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
1ed90 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61   B is the databa
1eda0 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43 20 69  se name.  If C i
1edb0 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68 65  s defined.** the
1edc0 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e 20 6f  n so is B.  In o
1edd0 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65 20 6e  ther words, we n
1ede0 65 76 65 72 20 68 61 76 65 20 61 20 63 61 73 65  ever have a case
1edf0 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   where:.**.**   
1ee00 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
1ee10 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 30  ListAppend(D,A,0
1ee20 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20  ,C);.**.** Both 
1ee30 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61  pTable and pData
1ee40 62 61 73 65 20 61 72 65 20 61 73 73 75 6d 65 64  base are assumed
1ee50 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20 20   to be quoted.  
1ee60 54 68 65 79 20 61 72 65 20 64 65 71 75 6f 74 65  They are dequote
1ee70 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65 69 6e  d.** before bein
1ee80 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 53  g added to the S
1ee90 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69  rcList..*/.SrcLi
1eea0 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
1eeb0 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71 6c 69  stAppend(.  sqli
1eec0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
1eed0 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  /* Connection to
1eee0 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f   notify of mallo
1eef0 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20  c failures */.  
1ef00 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  SrcList *pList, 
1ef10 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f      /* Append to
1ef20 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20 4e   this SrcList. N
1ef30 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e 65  ULL creates a ne
1ef40 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54  w SrcList */.  T
1ef50 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20  oken *pTable,   
1ef60 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61     /* Table to a
1ef70 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ppend */.  Token
1ef80 20 2a 70 44 61 74 61 62 61 73 65 20 20 20 20 2f   *pDatabase    /
1ef90 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20 74 68  * Database of th
1efa0 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  e table */.){.  
1efb0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1efc0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73  tem *pItem;.  as
1efd0 73 65 72 74 28 20 70 44 61 74 61 62 61 73 65 3d  sert( pDatabase=
1efe0 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20  =0 || pTable!=0 
1eff0 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61  );  /* Cannot ha
1f000 76 65 20 43 20 77 69 74 68 6f 75 74 20 42 20 2a  ve C without B *
1f010 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  /.  assert( db!=
1f020 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
1f030 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
1f040 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1f050 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
1f060 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20  of(SrcList) );. 
1f070 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
1f080 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1f090 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
1f0a0 31 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 53  1;.    pList->nS
1f0b0 72 63 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73  rc = 1;.    mems
1f0c0 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 30 5d 2c  et(&pList->a[0],
1f0d0 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74   0, sizeof(pList
1f0e0 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 70 4c  ->a[0]));.    pL
1f0f0 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
1f100 72 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  r = -1;.  }else{
1f110 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
1f120 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
1f130 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c  ge(db, pList, 1,
1f140 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20   pList->nSrc);. 
1f150 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c   }.  if( db->mal
1f160 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1f170 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
1f180 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
1f190 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1f1a0 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
1f1b0 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
1f1c0 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44  Src-1];.  if( pD
1f1d0 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61  atabase && pData
1f1e0 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  base->z==0 ){.  
1f1f0 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b    pDatabase = 0;
1f200 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61  .  }.  if( pData
1f210 62 61 73 65 20 29 7b 0a 20 20 20 20 70 49 74 65  base ){.    pIte
1f220 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
1f230 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1f240 64 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a  db, pDatabase);.
1f250 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61      pItem->zData
1f260 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  base = sqlite3Na
1f270 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1f280 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65  pTable);.  }else
1f290 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  {.    pItem->zNa
1f2a0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
1f2b0 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
1f2c0 61 62 6c 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  able);.    pItem
1f2d0 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b  ->zDatabase = 0;
1f2e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c  .  }.  return pL
1f2f0 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  ist;.}../*.** As
1f300 73 69 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20  sign VdbeCursor 
1f310 69 6e 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f  index numbers to
1f320 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
1f330 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64   SrcList.*/.void
1f340 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1f350 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72  ssignCursors(Par
1f360 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
1f370 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
1f380 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53  nt i;.  struct S
1f390 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1f3a0 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69  em;.  assert(pLi
1f3b0 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  st || pParse->db
1f3c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1f3d0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
1f3e0 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
1f3f0 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
1f400 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
1f410 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1f420 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75    if( pItem->iCu
1f430 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b  rsor>=0 ) break;
1f440 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43  .      pItem->iC
1f450 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
1f460 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nTab++;.      if
1f470 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
1f480 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1f490 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
1f4a0 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
1f4b0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e  pItem->pSelect->
1f4c0 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSrc);.      }. 
1f4d0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1f4e0 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
1f4f0 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75  re SrcList inclu
1f500 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62  ding all its sub
1f510 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f  structure..*/.vo
1f520 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1f530 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
1f540 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  *db, SrcList *pL
1f550 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
1f560 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1f570 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
1f580 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1f590 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65  turn;.  for(pIte
1f5a0 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
1f5b0 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20   i<pList->nSrc; 
1f5c0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
1f5d0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1f5e0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74  (db, pItem->zDat
1f5f0 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  abase);.    sqli
1f600 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1f610 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
1f620 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1f630 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  b, pItem->zAlias
1f640 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  );.    if( pItem
1f650 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
1f660 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
1f670 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 7a  (db, pItem->u1.z
1f680 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20  IndexedBy);.    
1f690 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
1f6a0 54 61 62 46 75 6e 63 20 29 20 73 71 6c 69 74 65  TabFunc ) sqlite
1f6b0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
1f6c0 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46  db, pItem->u1.pF
1f6d0 75 6e 63 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  uncArg);.    sql
1f6e0 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
1f6f0 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29  db, pItem->pTab)
1f700 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
1f710 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  ectDelete(db, pI
1f720 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  tem->pSelect);. 
1f730 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
1f740 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
1f750 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pOn);.    sqlite
1f760 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
1f770 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29  , pItem->pUsing)
1f780 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
1f790 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73  bFreeNN(db, pLis
1f7a0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
1f7b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1f7c0 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
1f7d0 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74  r to add a new t
1f7e0 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  erm to the.** en
1f7f0 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46  d of a growing F
1f800 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ROM clause.  The
1f810 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
1f820 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a  s the part of.**
1f830 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1f840 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
1f850 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74  y been construct
1f860 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c  ed.  "p" is NULL
1f870 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74  .** if this is t
1f880 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66  he first term of
1f890 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1f8a0 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  .  pTable and pD
1f8b0 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74  atabase.** are t
1f8c0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
1f8d0 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73  able and databas
1f8e0 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
1f8f0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ROM clause term.
1f900 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69 73  .** pDatabase is
1f910 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74   NULL if the dat
1f920 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69  abase name quali
1f930 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20  fier is missing 
1f940 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63  - the.** usual c
1f950 61 73 65 2e 20 20 49 66 20 74 68 65 20 74 65 72  ase.  If the ter
1f960 6d 20 68 61 73 20 61 6e 20 61 6c 69 61 73 2c 20  m has an alias, 
1f970 74 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e  then pAlias poin
1f980 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69  ts to the.** ali
1f990 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68  as token.  If th
1f9a0 65 20 74 65 72 6d 20 69 73 20 61 20 73 75 62 71  e term is a subq
1f9b0 75 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71  uery, then pSubq
1f9c0 75 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53  uery is the.** S
1f9d0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1f9e0 74 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72  that the subquer
1f9f0 79 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20  y encodes.  The 
1fa00 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44  pTable and.** pD
1fa10 61 74 61 62 61 73 65 20 70 61 72 61 6d 65 74 65  atabase paramete
1fa20 72 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20  rs are NULL for 
1fa30 73 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65  subqueries.  The
1fa40 20 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a   pOn and pUsing.
1fa50 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  ** parameters ar
1fa60 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
1fa70 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
1fa80 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  G clauses..**.**
1fa90 20 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72   Return a new Sr
1faa0 63 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f  cList which enco
1fab0 64 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20  des is the FROM 
1fac0 77 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20  with the new.** 
1fad0 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53  term added..*/.S
1fae0 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
1faf0 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d  rcListAppendFrom
1fb00 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
1fb10 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
1fb20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1fb30 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
1fb40 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1fb50 2f 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72 74  /* The left part
1fb60 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1fb70 75 73 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e  use already seen
1fb80 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
1fb90 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
1fba0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
1fbb0 6c 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65  le to add to the
1fbc0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
1fbd0 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61    Token *pDataba
1fbe0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  se,       /* Nam
1fbf0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1fc00 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61  e containing pTa
1fc10 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
1fc20 70 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20  pAlias,         
1fc30 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61   /* The right-ha
1fc40 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 41  nd side of the A
1fc50 53 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  S subexpression 
1fc60 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
1fc70 62 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20  bquery,      /* 
1fc80 41 20 73 75 62 71 75 65 72 79 20 75 73 65 64 20  A subquery used 
1fc90 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61  in place of a ta
1fca0 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78  ble name */.  Ex
1fcb0 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20  pr *pOn,        
1fcc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20        /* The ON 
1fcd0 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e  clause of a join
1fce0 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55   */.  IdList *pU
1fcf0 73 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a  sing          /*
1fd00 20 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   The USING claus
1fd10 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29  e of a join */.)
1fd20 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  {.  struct SrcLi
1fd30 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1fd40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1fd50 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
1fd60 28 20 21 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20  ( !p && (pOn || 
1fd70 70 55 73 69 6e 67 29 20 29 7b 0a 20 20 20 20 73  pUsing) ){.    s
1fd80 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1fd90 50 61 72 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63  Parse, "a JOIN c
1fda0 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65  lause is require
1fdb0 64 20 62 65 66 6f 72 65 20 25 73 22 2c 20 0a 20  d before %s", . 
1fdc0 20 20 20 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22       (pOn ? "ON"
1fdd0 20 3a 20 22 55 53 49 4e 47 22 29 0a 20 20 20 20   : "USING").    
1fde0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65  );.    goto appe
1fdf0 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20  nd_from_error;. 
1fe00 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33   }.  p = sqlite3
1fe10 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62  SrcListAppend(db
1fe20 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61  , p, pTable, pDa
1fe30 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
1fe40 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ==0 ){.    goto 
1fe50 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f  append_from_erro
1fe60 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  r;.  }.  assert(
1fe70 20 70 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20   p->nSrc>0 );.  
1fe80 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d  pItem = &p->a[p-
1fe90 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73 73 65  >nSrc-1];.  asse
1fea0 72 74 28 20 70 41 6c 69 61 73 21 3d 30 20 29 3b  rt( pAlias!=0 );
1feb0 0a 20 20 69 66 28 20 70 41 6c 69 61 73 2d 3e 6e  .  if( pAlias->n
1fec0 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   ){.    pItem->z
1fed0 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e  Alias = sqlite3N
1fee0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
1fef0 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20   pAlias);.  }.  
1ff00 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pItem->pSelect =
1ff10 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20 70 49   pSubquery;.  pI
1ff20 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a  tem->pOn = pOn;.
1ff30 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20    pItem->pUsing 
1ff40 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65 74 75  = pUsing;.  retu
1ff50 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e 64 5f 66  rn p;.. append_f
1ff60 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73  rom_error:.  ass
1ff70 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 73  ert( p==0 );.  s
1ff80 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1ff90 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 73 71 6c  (db, pOn);.  sql
1ffa0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
1ffb0 28 64 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20  (db, pUsing);.  
1ffc0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
1ffd0 65 74 65 28 64 62 2c 20 70 53 75 62 71 75 65 72  ete(db, pSubquer
1ffe0 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  y);.  return 0;.
1fff0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
20000 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20 4e 4f  INDEXED BY or NO
20010 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65  T INDEXED clause
20020 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63   to the most rec
20030 65 6e 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a 20  ently added .** 
20040 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 73  element of the s
20050 6f 75 72 63 65 2d 6c 69 73 74 20 70 61 73 73 65  ource-list passe
20060 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
20070 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  argument..*/.voi
20080 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
20090 49 6e 64 65 78 65 64 42 79 28 50 61 72 73 65 20  IndexedBy(Parse 
200a0 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
200b0 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e 64   *p, Token *pInd
200c0 65 78 65 64 42 79 29 7b 0a 20 20 61 73 73 65 72  exedBy){.  asser
200d0 74 28 20 70 49 6e 64 65 78 65 64 42 79 21 3d 30  t( pIndexedBy!=0
200e0 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70   );.  if( p && p
200f0 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3e 30 20 29  IndexedBy->n>0 )
20100 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
20110 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
20120 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
20130 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20 20 20 70  >nSrc>0 );.    p
20140 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
20150 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73  nSrc-1];.    ass
20160 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e  ert( pItem->fg.n
20170 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a  otIndexed==0 );.
20180 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
20190 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
201a0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  y==0 );.    asse
201b0 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
201c0 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20  TabFunc==0 );.  
201d0 20 20 69 66 28 20 70 49 6e 64 65 78 65 64 42 79    if( pIndexedBy
201e0 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64 65  ->n==1 && !pInde
201f0 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20  xedBy->z ){.    
20200 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45    /* A "NOT INDE
20210 58 45 44 22 20 63 6c 61 75 73 65 20 77 61 73 20  XED" clause was 
20220 73 75 70 70 6c 69 65 64 2e 20 53 65 65 20 70 61  supplied. See pa
20230 72 73 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20  rse.y .      ** 
20240 63 6f 6e 73 74 72 75 63 74 20 22 69 6e 64 65 78  construct "index
20250 65 64 5f 6f 70 74 22 20 66 6f 72 20 64 65 74 61  ed_opt" for deta
20260 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49  ils. */.      pI
20270 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  tem->fg.notIndex
20280 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
20290 65 7b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  e{.      pItem->
202a0 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20  u1.zIndexedBy = 
202b0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
202c0 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
202d0 20 70 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20   pIndexedBy);.  
202e0 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73      pItem->fg.is
202f0 49 6e 64 65 78 65 64 42 79 20 3d 20 31 3b 0a 20  IndexedBy = 1;. 
20300 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
20310 2a 20 41 64 64 20 74 68 65 20 6c 69 73 74 20 6f  * Add the list o
20320 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
20330 65 6e 74 73 20 74 6f 20 74 68 65 20 53 72 63 4c  ents to the SrcL
20340 69 73 74 20 65 6e 74 72 79 20 66 6f 72 20 61 0a  ist entry for a.
20350 2a 2a 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d  ** table-valued-
20360 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
20370 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
20380 46 75 6e 63 41 72 67 73 28 50 61 72 73 65 20 2a  FuncArgs(Parse *
20390 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
203a0 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  *p, ExprList *pL
203b0 69 73 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ist){.  if( p ){
203c0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
203d0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
203e0 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
203f0 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
20400 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64  pItem->fg.notInd
20410 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  exed==0 );.    a
20420 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
20430 2e 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20  .isIndexedBy==0 
20440 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
20450 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
20460 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74  nc==0 );.    pIt
20470 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20  em->u1.pFuncArg 
20480 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 70 49 74  = pList;.    pIt
20490 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
204a0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
204b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
204c0 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
204d0 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d  >db, pList);.  }
204e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62  .}../*.** When b
204f0 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f  uilding up a FRO
20500 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
20510 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e  parser, the join
20520 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20   operator.** is 
20530 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68  initially attach
20540 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ed to the left o
20550 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65  perand.  But the
20560 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
20570 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65 20 6a  ** expects the j
20580 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  oin operator to 
20590 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  be on the right 
205a0 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72  operand.  This r
205b0 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73  outine.** Shifts
205c0 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74   all join operat
205d0 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  ors from left to
205e0 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e   right for an en
205f0 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61  tire FROM.** cla
20600 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  use..**.** Examp
20610 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20  le: Suppose the 
20620 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69  join is like thi
20630 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
20640 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f     A natural cro
20650 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20  ss join B.**.** 
20660 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20  The operator is 
20670 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a  "natural cross j
20680 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64  oin".  The A and
20690 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20   B operands are 
206a0 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e  stored.** in p->
206b0 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d  a[0] and p->a[1]
206c0 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
206d0 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 69 74   The parser init
206e0 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65  ially stores the
206f0 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74  .** operator wit
20700 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69  h A.  This routi
20710 6e 65 20 73 68 69 66 74 73 20 74 68 61 74 20 6f  ne shifts that o
20720 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20  perator over to 
20730 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  B..*/.void sqlit
20740 65 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f  e3SrcListShiftJo
20750 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a  inType(SrcList *
20760 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
20770 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
20780 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69  r(i=p->nSrc-1; i
20790 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
207a0 70 2d 3e 61 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74  p->a[i].fg.joint
207b0 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e  ype = p->a[i-1].
207c0 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  fg.jointype;.   
207d0 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 66   }.    p->a[0].f
207e0 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  g.jointype = 0;.
207f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
20800 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
20810 66 6f 72 20 61 20 42 45 47 49 4e 20 73 74 61 74  for a BEGIN stat
20820 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
20830 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73  qlite3BeginTrans
20840 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
20850 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b  arse, int type){
20860 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
20870 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
20880 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   i;..  assert( p
20890 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62  Parse!=0 );.  db
208a0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
208b0 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
208c0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
208d0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
208e0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
208f0 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c  ION, "BEGIN", 0,
20900 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   0) ){.    retur
20910 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c  n;.  }.  v = sql
20920 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
20930 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20  se);.  if( !v ) 
20940 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79  return;.  if( ty
20950 70 65 3d 3d 54 4b 5f 49 4d 4d 45 44 49 41 54 45  pe==TK_IMMEDIATE
20960 20 7c 7c 20 74 79 70 65 3d 3d 54 4b 5f 45 58 43   || type==TK_EXC
20970 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 66 6f  LUSIVE ){.    fo
20980 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
20990 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
209a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
209b0 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
209c0 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f  n, i, (type==TK_
209d0 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20  EXCLUSIVE)+1);. 
209e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
209f0 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 29 3b  UsesBtree(v, i);
20a00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
20a10 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
20a20 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
20a30 20 30 2c 20 30 2c 20 28 74 79 70 65 3d 3d 54 4b   0, 0, (type==TK
20a40 5f 43 4f 4e 43 55 52 52 45 4e 54 29 29 3b 0a 7d  _CONCURRENT));.}
20a50 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
20a60 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61   VDBE code for a
20a70 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42   COMMIT or ROLLB
20a80 41 43 4b 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ACK statement..*
20a90 2a 20 43 6f 64 65 20 66 6f 72 20 52 4f 4c 4c 42  * Code for ROLLB
20aa0 41 43 4b 20 69 73 20 67 65 6e 65 72 61 74 65 64  ACK is generated
20ab0 20 69 66 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f   if eType==TK_RO
20ac0 4c 4c 42 41 43 4b 2e 20 20 4f 74 68 65 72 77 69  LLBACK.  Otherwi
20ad0 73 65 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65  se.** code is ge
20ae0 6e 65 72 61 74 65 64 20 66 6f 72 20 61 20 43 4f  nerated for a CO
20af0 4d 4d 49 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  MMIT..*/.void sq
20b00 6c 69 74 65 33 45 6e 64 54 72 61 6e 73 61 63 74  lite3EndTransact
20b10 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
20b20 65 2c 20 69 6e 74 20 65 54 79 70 65 29 7b 0a 20  e, int eType){. 
20b30 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
20b40 69 73 52 6f 6c 6c 62 61 63 6b 3b 0a 0a 20 20 61  isRollback;..  a
20b50 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
20b60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
20b70 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  arse->db!=0 );. 
20b80 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
20b90 54 4b 5f 43 4f 4d 4d 49 54 20 7c 7c 20 65 54 79  TK_COMMIT || eTy
20ba0 70 65 3d 3d 54 4b 5f 45 4e 44 20 7c 7c 20 65 54  pe==TK_END || eT
20bb0 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b  ype==TK_ROLLBACK
20bc0 20 29 3b 0a 20 20 69 73 52 6f 6c 6c 62 61 63 6b   );.  isRollback
20bd0 20 3d 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c   = eType==TK_ROL
20be0 4c 42 41 43 4b 3b 0a 20 20 69 66 28 20 73 71 6c  LBACK;.  if( sql
20bf0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
20c00 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
20c10 4e 53 41 43 54 49 4f 4e 2c 20 0a 20 20 20 20 20  NSACTION, .     
20c20 20 20 69 73 52 6f 6c 6c 62 61 63 6b 20 3f 20 22    isRollback ? "
20c30 52 4f 4c 4c 42 41 43 4b 22 20 3a 20 22 43 4f 4d  ROLLBACK" : "COM
20c40 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20  MIT", 0, 0) ){. 
20c50 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
20c60 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
20c70 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
20c80 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
20c90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20ca0 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
20cb0 31 2c 20 69 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a  1, isRollback);.
20cc0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
20cd0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
20ce0 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
20cf0 65 72 20 77 68 65 6e 20 69 74 20 70 61 72 73 65  er when it parse
20d00 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63  s a command to c
20d10 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73  reate,.** releas
20d20 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  e or rollback an
20d30 20 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20   SQL savepoint. 
20d40 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20d50 53 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20  Savepoint(Parse 
20d60 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c  *pParse, int op,
20d70 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
20d80 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
20d90 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
20da0 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
20db0 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
20dc0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  Name ){.    Vdbe
20dd0 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
20de0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69  Vdbe(pParse);.#i
20df0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20e00 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
20e10 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
20e20 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a   char * const az
20e30 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20  [] = { "BEGIN", 
20e40 22 52 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c  "RELEASE", "ROLL
20e50 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73  BACK" };.    ass
20e60 65 72 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f  ert( !SAVEPOINT_
20e70 42 45 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49  BEGIN && SAVEPOI
20e80 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26  NT_RELEASE==1 &&
20e90 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
20ea0 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66  ACK==2 );.#endif
20eb0 0a 20 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73  .    if( !v || s
20ec0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
20ed0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
20ee0 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d  AVEPOINT, az[op]
20ef0 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20  , zName, 0) ){. 
20f00 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
20f10 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
20f20 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
20f30 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  urn;.    }.    s
20f40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
20f50 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74  (v, OP_Savepoint
20f60 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d  , op, 0, 0, zNam
20f70 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  e, P4_DYNAMIC);.
20f80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
20f90 65 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20  e sure the TEMP 
20fa0 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
20fb0 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66   and available f
20fc0 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a  or use.  Return.
20fd0 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
20fe0 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20   errors.  Leave 
20ff0 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
21000 65 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  es in the pParse
21010 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
21020 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65  nt sqlite3OpenTe
21030 6d 70 44 61 74 61 62 61 73 65 28 50 61 72 73 65  mpDatabase(Parse
21040 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
21050 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
21060 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d  e->db;.  if( db-
21070 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26  >aDb[1].pBt==0 &
21080 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  & !pParse->expla
21090 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  in ){.    int rc
210a0 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  ;.    Btree *pBt
210b0 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
210c0 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a  st int flags = .
210d0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
210e0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
210f0 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
21100 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
21110 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
21120 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
21130 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
21140 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
21150 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20  NCLOSE |.       
21160 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
21170 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20  EMP_DB;..    rc 
21180 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  = sqlite3BtreeOp
21190 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20  en(db->pVfs, 0, 
211a0 64 62 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c 61  db, &pBt, 0, fla
211b0 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  gs);.    if( rc!
211c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
211d0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
211e0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
211f0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  ble to open a te
21200 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
21210 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65   ".        "file
21220 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d   for storing tem
21230 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b  porary tables");
21240 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
21250 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  c = rc;.      re
21260 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
21270 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74    db->aDb[1].pBt
21280 20 3d 20 70 42 74 3b 0a 20 20 20 20 61 73 73 65   = pBt;.    asse
21290 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  rt( db->aDb[1].p
212a0 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66  Schema );.    if
212b0 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d  ( SQLITE_NOMEM==
212c0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
212d0 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d  ageSize(pBt, db-
212e0 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 20 2d  >nextPagesize, -
212f0 31 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73  1, 0) ){.      s
21300 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
21310 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  b);.      return
21320 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
21330 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
21340 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61  ** Record the fa
21350 63 74 20 74 68 61 74 20 74 68 65 20 73 63 68 65  ct that the sche
21360 6d 61 20 63 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e  ma cookie will n
21370 65 65 64 20 74 6f 20 62 65 20 76 65 72 69 66 69  eed to be verifi
21380 65 64 0a 2a 2a 20 66 6f 72 20 64 61 74 61 62 61  ed.** for databa
21390 73 65 20 69 44 62 2e 20 20 54 68 65 20 63 6f 64  se iDb.  The cod
213a0 65 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 76 65  e to actually ve
213b0 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
213c0 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f  cookie.** will o
213d0 63 63 75 72 20 61 74 20 74 68 65 20 65 6e 64 20  ccur at the end 
213e0 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  of the top-level
213f0 20 56 44 42 45 20 61 6e 64 20 77 69 6c 6c 20 62   VDBE and will b
21400 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 6c  e generated.** l
21410 61 74 65 72 2c 20 62 79 20 73 71 6c 69 74 65 33  ater, by sqlite3
21420 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
21430 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
21440 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
21450 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
21460 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65  nt iDb){.  Parse
21470 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
21480 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
21490 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 61  el(pParse);..  a
214a0 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
214b0 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d   iDb<pParse->db-
214c0 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
214d0 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  ( pParse->db->aD
214e0 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c  b[iDb].pBt!=0 ||
214f0 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 61 73 73   iDb==1 );.  ass
21500 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f  ert( iDb<SQLITE_
21510 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29  MAX_ATTACHED+2 )
21520 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
21530 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
21540 6c 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 69  ld(pParse->db, i
21550 44 62 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20  Db, 0) );.  if( 
21560 44 62 4d 61 73 6b 54 65 73 74 28 70 54 6f 70 6c  DbMaskTest(pTopl
21570 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  evel->cookieMask
21580 2c 20 69 44 62 29 3d 3d 30 20 29 7b 0a 20 20 20  , iDb)==0 ){.   
21590 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c   DbMaskSet(pTopl
215a0 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  evel->cookieMask
215b0 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , iDb);.    if( 
215c0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
215d0 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
215e0 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
215f0 61 74 61 62 61 73 65 28 70 54 6f 70 6c 65 76 65  atabase(pTopleve
21600 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  l);.    }.  }.}.
21610 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ./*.** If argume
21620 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20  nt zDb is NULL, 
21630 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65  then call sqlite
21640 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
21650 61 28 29 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a  a() for each .**
21660 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
21670 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  se. Otherwise, i
21680 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20 74 68 65  nvoke it for the
21690 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20   database named 
216a0 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69  zDb only..*/.voi
216b0 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  d sqlite3CodeVer
216c0 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 50  ifyNamedSchema(P
216d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
216e0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a  nst char *zDb){.
216f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
21700 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
21710 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
21720 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
21730 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
21740 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
21750 69 66 28 20 70 44 62 2d 3e 70 42 74 20 26 26 20  if( pDb->pBt && 
21760 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73 71 6c 69  (!zDb || 0==sqli
21770 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20  te3StrICmp(zDb, 
21780 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 29 20  pDb->zDbSName)) 
21790 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
217a0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
217b0 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20  (pParse, i);.   
217c0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
217d0 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
217e0 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65 73  de that prepares
217f0 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70   for doing an op
21800 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  eration that.** 
21810 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65  might change the
21820 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
21830 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74   This routine st
21840 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73  arts a new trans
21850 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65  action if we are
21860 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74   not already wit
21870 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63  hin.** a transac
21880 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65  tion.  If we are
21890 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20   already within 
218a0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  a transaction, t
218b0 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  hen a checkpoint
218c0 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74 68  .** is set if th
218d0 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70  e setStatement p
218e0 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65  arameter is true
218f0 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20  .  A checkpoint 
21900 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74  should.** be set
21910 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   for operations 
21920 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20  that might fail 
21930 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72  (due to a constr
21940 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a  aint) part of.**
21950 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67 68   the way through
21960 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20   and which will 
21970 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d  need to undo som
21980 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75 74  e writes without
21990 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f   having to.** ro
219a0 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65  llback the whole
219b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46   transaction.  F
219c0 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68  or operations wh
219d0 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ere all constrai
219e0 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68  nts.** can be ch
219f0 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79  ecked before any
21a00 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
21a10 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
21a20 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a  e, it is never.*
21a30 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75  * necessary to u
21a40 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20  ndo a write and 
21a50 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73  the checkpoint s
21a60 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74  hould not be set
21a70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21a80 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
21a90 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
21aa0 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65  se, int setState
21ab0 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a  ment, int iDb){.
21ac0 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
21ad0 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
21ae0 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
21af0 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65  );.  sqlite3Code
21b00 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
21b10 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 44 62 4d  rse, iDb);.  DbM
21b20 61 73 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c  askSet(pToplevel
21b30 2d 3e 77 72 69 74 65 4d 61 73 6b 2c 20 69 44 62  ->writeMask, iDb
21b40 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
21b50 69 73 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d 20  isMultiWrite |= 
21b60 73 65 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a  setStatement;.}.
21b70 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20  ./*.** Indicate 
21b80 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65  that the stateme
21b90 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  nt currently und
21ba0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
21bb0 6d 69 67 68 74 20 77 72 69 74 65 0a 2a 2a 20 6d  might write.** m
21bc0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e 74  ore than one ent
21bd0 72 79 20 28 65 78 61 6d 70 6c 65 3a 20 64 65 6c  ry (example: del
21be0 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74 68  eting one row th
21bf0 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 61 6e 6f  en inserting ano
21c00 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74 69  ther,.** inserti
21c10 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ng multiple rows
21c20 20 69 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72 20   in a table, or 
21c30 69 6e 73 65 72 74 69 6e 67 20 61 20 72 6f 77 20  inserting a row 
21c40 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65  and index entrie
21c50 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62 6f  s.).** If an abo
21c60 72 74 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  rt occurs after 
21c70 73 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 77 72  some of these wr
21c80 69 74 65 73 20 68 61 76 65 20 63 6f 6d 70 6c 65  ites have comple
21c90 74 65 64 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  ted, then it wil
21ca0 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72  l.** be necessar
21cb0 79 20 74 6f 20 75 6e 64 6f 20 74 68 65 20 63 6f  y to undo the co
21cc0 6d 70 6c 65 74 65 64 20 77 72 69 74 65 73 2e 0a  mpleted writes..
21cd0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  */.void sqlite3M
21ce0 75 6c 74 69 57 72 69 74 65 28 50 61 72 73 65 20  ultiWrite(Parse 
21cf0 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73  *pParse){.  Pars
21d00 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
21d10 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
21d20 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70  vel(pParse);.  p
21d30 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74  Toplevel->isMult
21d40 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f  iWrite = 1;.}../
21d50 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  * .** The code g
21d60 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c 73 20 74  enerator calls t
21d70 68 69 73 20 72 6f 75 74 69 6e 65 20 69 66 20 69  his routine if i
21d80 73 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74  s discovers that
21d90 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62   it is.** possib
21da0 6c 65 20 74 6f 20 61 62 6f 72 74 20 61 20 73 74  le to abort a st
21db0 61 74 65 6d 65 6e 74 20 70 72 69 6f 72 20 74 6f  atement prior to
21dc0 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 6e   completion.  In
21dd0 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70 65   order to .** pe
21de0 72 66 6f 72 6d 20 74 68 69 73 20 61 62 6f 72 74  rform this abort
21df0 20 77 69 74 68 6f 75 74 20 63 6f 72 72 75 70 74   without corrupt
21e00 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
21e10 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b  , we need to mak
21e20 65 0a 2a 2a 20 73 75 72 65 20 74 68 61 74 20 74  e.** sure that t
21e30 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
21e40 70 72 6f 74 65 63 74 65 64 20 62 79 20 61 20 73  protected by a s
21e50 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
21e60 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68  tion..**.** Tech
21e70 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79  nically, we only
21e80 20 6e 65 65 64 20 74 6f 20 73 65 74 20 74 68 65   need to set the
21e90 20 6d 61 79 41 62 6f 72 74 20 66 6c 61 67 20 69   mayAbort flag i
21ea0 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74 69  f the.** isMulti
21eb0 57 72 69 74 65 20 66 6c 61 67 20 77 61 73 20 70  Write flag was p
21ec0 72 65 76 69 6f 75 73 6c 79 20 73 65 74 2e 20 20  reviously set.  
21ed0 54 68 65 72 65 20 69 73 20 61 20 74 69 6d 65 20  There is a time 
21ee0 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73 75  dependency.** su
21ef0 63 68 20 74 68 61 74 20 74 68 65 20 61 62 6f 72  ch that the abor
21f00 74 20 6d 75 73 74 20 6f 63 63 75 72 20 61 66 74  t must occur aft
21f10 65 72 20 74 68 65 20 6d 75 6c 74 69 77 72 69 74  er the multiwrit
21f20 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 0a 2a  e.  This makes.*
21f30 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e 74  * some statement
21f40 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20  s involving the 
21f50 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74  REPLACE conflict
21f60 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
21f70 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69  rithm.** go a li
21f80 74 74 6c 65 20 66 61 73 74 65 72 2e 20 20 42 75  ttle faster.  Bu
21f90 74 20 74 61 6b 69 6e 67 20 61 64 76 61 6e 74 61  t taking advanta
21fa0 67 65 20 6f 66 20 74 68 69 73 20 74 69 6d 65 20  ge of this time 
21fb0 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61  dependency.** ma
21fc0 6b 65 73 20 69 74 20 6d 6f 72 65 20 64 69 66 66  kes it more diff
21fd0 69 63 75 6c 74 20 74 6f 20 70 72 6f 76 65 20 74  icult to prove t
21fe0 68 61 74 20 74 68 65 20 63 6f 64 65 20 69 73 20  hat the code is 
21ff0 63 6f 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a 20  correct (in .** 
22000 70 61 72 74 69 63 75 6c 61 72 2c 20 69 74 20 70  particular, it p
22010 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20  revents us from 
22020 77 72 69 74 69 6e 67 20 61 6e 20 65 66 66 65 63  writing an effec
22030 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tive.** implemen
22040 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  tation of sqlite
22050 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  3AssertMayAbort(
22060 29 29 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76  )) and so we hav
22070 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74  e chosen.** to t
22080 61 6b 65 20 74 68 65 20 73 61 66 65 20 72 6f 75  ake the safe rou
22090 74 65 20 61 6e 64 20 73 6b 69 70 20 74 68 65 20  te and skip the 
220a0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f  optimization..*/
220b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 79  .void sqlite3May
220c0 41 62 6f 72 74 28 50 61 72 73 65 20 2a 70 50 61  Abort(Parse *pPa
220d0 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  rse){.  Parse *p
220e0 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
220f0 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
22100 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c  pParse);.  pTopl
22110 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20 3d  evel->mayAbort =
22120 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64   1;.}../*.** Cod
22130 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68 61  e an OP_Halt tha
22140 74 20 63 61 75 73 65 73 20 74 68 65 20 76 64 62  t causes the vdb
22150 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 53  e to return an S
22160 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
22170 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68 65 20 6f  .** error. The o
22180 6e 45 72 72 6f 72 20 70 61 72 61 6d 65 74 65 72  nError parameter
22190 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
221a0 68 20 28 69 66 20 61 6e 79 29 20 6f 66 20 74 68  h (if any) of th
221b0 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61  e statement.** a
221c0 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74 20 74 72  nd/or current tr
221d0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
221e0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69  led back..*/.voi
221f0 64 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e  d sqlite3HaltCon
22200 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65  straint(.  Parse
22210 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
22220 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
22230 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65  */.  int errCode
22240 2c 20 20 20 20 20 20 2f 2a 20 65 78 74 65 6e 64  ,      /* extend
22250 65 64 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  ed error code */
22260 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
22270 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69       /* Constrai
22280 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61  nt type */.  cha
22290 72 20 2a 70 34 2c 20 20 20 20 20 20 20 20 20 2f  r *p4,         /
222a0 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * Error message 
222b0 2a 2f 0a 20 20 69 38 20 70 34 74 79 70 65 2c 20  */.  i8 p4type, 
222c0 20 20 20 20 20 20 20 2f 2a 20 50 34 5f 53 54 41         /* P4_STA
222d0 54 49 43 20 6f 72 20 50 34 5f 54 52 41 4e 53 49  TIC or P4_TRANSI
222e0 45 4e 54 20 2a 2f 0a 20 20 75 38 20 70 35 45 72  ENT */.  u8 p5Er
222f0 72 6d 73 67 20 20 20 20 20 20 20 2f 2a 20 50 35  rmsg       /* P5
22300 5f 45 72 72 4d 73 67 20 74 79 70 65 20 2a 2f 0a  _ErrMsg type */.
22310 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
22320 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
22330 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
22340 20 28 65 72 72 43 6f 64 65 26 30 78 66 66 29 3d   (errCode&0xff)=
22350 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
22360 4e 54 20 29 3b 0a 20 20 69 66 28 20 6f 6e 45 72  NT );.  if( onEr
22370 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ror==OE_Abort ){
22380 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41  .    sqlite3MayA
22390 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
223a0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
223b0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74  ddOp4(v, OP_Halt
223c0 2c 20 65 72 72 43 6f 64 65 2c 20 6f 6e 45 72 72  , errCode, onErr
223d0 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34 74 79 70  or, 0, p4, p4typ
223e0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
223f0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 45  eChangeP5(v, p5E
22400 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrmsg);.}../*.**
22410 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74   Code an OP_Halt
22420 20 64 75 65 20 74 6f 20 55 4e 49 51 55 45 20 6f   due to UNIQUE o
22430 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
22440 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69  nstraint violati
22450 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
22460 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61  te3UniqueConstra
22470 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
22480 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
22490 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
224a0 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
224b0 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74     /* Constraint
224c0 20 74 79 70 65 20 2a 2f 0a 20 20 49 6e 64 65 78   type */.  Index
224d0 20 2a 70 49 64 78 20 20 20 20 20 20 20 2f 2a 20   *pIdx       /* 
224e0 54 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 74  The index that t
224f0 72 69 67 67 65 72 73 20 74 68 65 20 63 6f 6e 73  riggers the cons
22500 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  traint */.){.  c
22510 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 69 6e 74  har *zErr;.  int
22520 20 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 65   j;.  StrAccum e
22530 72 72 4d 73 67 3b 0a 20 20 54 61 62 6c 65 20 2a  rrMsg;.  Table *
22540 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61  pTab = pIdx->pTa
22550 62 6c 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53  ble;..  sqlite3S
22560 74 72 41 63 63 75 6d 49 6e 69 74 28 26 65 72 72  trAccumInit(&err
22570 4d 73 67 2c 20 70 50 61 72 73 65 2d 3e 64 62 2c  Msg, pParse->db,
22580 20 30 2c 20 30 2c 20 32 30 30 29 3b 0a 20 20 69   0, 0, 200);.  i
22590 66 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70  f( pIdx->aColExp
225a0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
225b0 58 50 72 69 6e 74 66 28 26 65 72 72 4d 73 67 2c  XPrintf(&errMsg,
225c0 20 22 69 6e 64 65 78 20 27 25 71 27 22 2c 20 70   "index '%q'", p
225d0 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  Idx->zName);.  }
225e0 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  else{.    for(j=
225f0 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  0; j<pIdx->nKeyC
22600 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
22610 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
22620 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
22630 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29  aiColumn[j]>=0 )
22640 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70  ;.      zCol = p
22650 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e  Tab->aCol[pIdx->
22660 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61  aiColumn[j]].zNa
22670 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 20  me;.      if( j 
22680 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  ) sqlite3StrAccu
22690 6d 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c  mAppend(&errMsg,
226a0 20 22 2c 20 22 2c 20 32 29 3b 0a 20 20 20 20 20   ", ", 2);.     
226b0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
226c0 41 70 70 65 6e 64 41 6c 6c 28 26 65 72 72 4d 73  AppendAll(&errMs
226d0 67 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  g, pTab->zName);
226e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74  .      sqlite3St
226f0 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 65 72  rAccumAppend(&er
22700 72 4d 73 67 2c 20 22 2e 22 2c 20 31 29 3b 0a 20  rMsg, ".", 1);. 
22710 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
22720 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 65  ccumAppendAll(&e
22730 72 72 4d 73 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20  rrMsg, zCol);.  
22740 20 20 7d 0a 20 20 7d 0a 20 20 7a 45 72 72 20 3d    }.  }.  zErr =
22750 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
22760 46 69 6e 69 73 68 28 26 65 72 72 4d 73 67 29 3b  Finish(&errMsg);
22770 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f  .  sqlite3HaltCo
22780 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
22790 20 0a 20 20 20 20 49 73 50 72 69 6d 61 72 79 4b   .    IsPrimaryK
227a0 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 3f 20  eyIndex(pIdx) ? 
227b0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
227c0 54 5f 50 52 49 4d 41 52 59 4b 45 59 20 0a 20 20  T_PRIMARYKEY .  
227d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227e0 20 20 20 20 20 20 20 20 20 20 3a 20 53 51 4c 49            : SQLI
227f0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e  TE_CONSTRAINT_UN
22800 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45 72 72 6f  IQUE,.    onErro
22810 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41  r, zErr, P4_DYNA
22820 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69  MIC, P5_Constrai
22830 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f  ntUnique);.}.../
22840 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
22850 48 61 6c 74 20 64 75 65 20 74 6f 20 6e 6f 6e 2d  Halt due to non-
22860 75 6e 69 71 75 65 20 72 6f 77 69 64 2e 0a 2a 2f  unique rowid..*/
22870 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 77  .void sqlite3Row
22880 69 64 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  idConstraint(.  
22890 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
228a0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
228b0 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  text */.  int on
228c0 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43  Error,      /* C
228d0 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
228e0 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a  on algorithm */.
228f0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 20 20    Table *pTab   
22900 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
22910 20 77 69 74 68 20 74 68 65 20 6e 6f 6e 2d 75 6e   with the non-un
22920 69 71 75 65 20 72 6f 77 69 64 20 2a 2f 20 0a 29  ique rowid */ .)
22930 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
22940 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
22950 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29  pTab->iPKey>=0 )
22960 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  {.    zMsg = sql
22970 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
22980 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73 22 2c  se->db, "%s.%s",
22990 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
229a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229b0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
229c0 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e  ol[pTab->iPKey].
229d0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d  zName);.    rc =
229e0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
229f0 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20  NT_PRIMARYKEY;. 
22a00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d 73 67   }else{.    zMsg
22a10 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
22a20 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25  f(pParse->db, "%
22a30 73 2e 72 6f 77 69 64 22 2c 20 70 54 61 62 2d 3e  s.rowid", pTab->
22a40 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d  zName);.    rc =
22a50 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
22a60 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a 20 20  NT_ROWID;.  }.  
22a70 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
22a80 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 72 63  raint(pParse, rc
22a90 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73 67 2c  , onError, zMsg,
22aa0 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a 20 20 20   P4_DYNAMIC,.   
22ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ac0 20 20 20 20 20 50 35 5f 43 6f 6e 73 74 72 61 69       P5_Constrai
22ad0 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a  ntUnique);.}../*
22ae0 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
22af0 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20   if pIndex uses 
22b00 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
22b10 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52  quence pColl.  R
22b20 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
22b30 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c   it does and fal
22b40 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  se if it does no
22b50 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  t..*/.#ifndef SQ
22b60 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
22b70 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  X.static int col
22b80 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73  lationMatch(cons
22b90 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49  t char *zColl, I
22ba0 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20  ndex *pIndex){. 
22bb0 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
22bc0 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( zColl!=0 );.  
22bd0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65  for(i=0; i<pInde
22be0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
22bf0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
22c00 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a   *z = pIndex->az
22c10 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73  Coll[i];.    ass
22c20 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20 70 49 6e  ert( z!=0 || pIn
22c30 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
22c40 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  <0 );.    if( pI
22c50 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
22c60 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71 6c 69 74  ]>=0 && 0==sqlit
22c70 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f  e3StrICmp(z, zCo
22c80 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ll) ){.      ret
22c90 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
22ca0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
22cb0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
22cc0 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
22cd0 65 73 20 6f 66 20 70 54 61 62 20 74 68 61 74 20  es of pTab that 
22ce0 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
22cf0 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
22d00 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ..** If pColl==0
22d10 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20   then recompute 
22d20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70  all indices of p
22d30 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  Tab..*/.#ifndef 
22d40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
22d50 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEX.static void 
22d60 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72  reindexTable(Par
22d70 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
22d80 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f  e *pTab, char co
22d90 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49  nst *zColl){.  I
22da0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
22db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
22dc0 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
22dd0 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a  d with pTab */..
22de0 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61    for(pIndex=pTa
22df0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  b->pIndex; pInde
22e00 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78  x; pIndex=pIndex
22e10 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
22e20 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f  ( zColl==0 || co
22e30 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f  llationMatch(zCo
22e40 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20  ll, pIndex) ){. 
22e50 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
22e60 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
22e70 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
22e80 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
22e90 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
22ea0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
22eb0 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
22ec0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
22ed0 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
22ee0 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
22ef0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
22f00 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70  if../*.** Recomp
22f10 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
22f20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  of all tables in
22f30 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77   all databases w
22f40 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69  here the.** indi
22f50 63 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  ces use the coll
22f60 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
22f70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d  Coll.  If pColl=
22f80 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
22f90 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73  e.** all indices
22fa0 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a   everywhere..*/.
22fb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22fc0 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
22fd0 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44  ic void reindexD
22fe0 61 74 61 62 61 73 65 73 28 50 61 72 73 65 20 2a  atabases(Parse *
22ff0 70 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e  pParse, char con
23000 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62  st *zColl){.  Db
23010 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
23020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
23030 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a  ingle database *
23040 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
23050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23060 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
23070 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
23080 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
23090 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
230a0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
230b0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61  nnection */.  Ha
230c0 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20  shElem *k;      
230d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
230e0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61   looping over ta
230f0 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20  bles in pDb */. 
23100 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
23110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23120 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  A table in the d
23130 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73  atabase */..  as
23140 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
23150 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65  eeHoldsAllMutexe
23160 73 28 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65  s(db) );  /* Nee
23170 64 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61  ded for schema a
23180 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69  ccess */.  for(i
23190 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44  Db=0, pDb=db->aD
231a0 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  b; iDb<db->nDb; 
231b0 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20  iDb++, pDb++){. 
231c0 20 20 20 61 73 73 65 72 74 28 20 70 44 62 21 3d     assert( pDb!=
231d0 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73  0 );.    for(k=s
231e0 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
231f0 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
23200 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71  lHash);  k; k=sq
23210 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29  liteHashNext(k))
23220 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28  {.      pTab = (
23230 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73  Table*)sqliteHas
23240 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20  hData(k);.      
23250 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61  reindexTable(pPa
23260 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c  rse, pTab, zColl
23270 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
23280 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
23290 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
232a0 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61  he REINDEX comma
232b0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  nd..**.**       
232c0 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20   REINDEX        
232d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232e0 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20      -- 1.**     
232f0 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c     REINDEX  <col
23300 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20  lation>         
23310 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20        -- 2.**   
23320 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c       REINDEX  ?<
23330 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c  database>.?<tabl
23340 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20  ename>  -- 3.** 
23350 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
23360 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e  ?<database>.?<in
23370 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a  dexname>  -- 4.*
23380 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73  *.** Form 1 caus
23390 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69  es all indices i
233a0 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  n all attached d
233b0 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 72  atabases to be r
233c0 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20  ebuilt..** Form 
233d0 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69  2 rebuilds all i
233e0 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61  ndices in all da
233f0 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73 65  tabases that use
23400 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f   the named.** co
23410 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
23420 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34  .  Forms 3 and 4
23430 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d   rebuild the nam
23440 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a  ed index or all.
23450 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63  ** indices assoc
23460 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  iated with the n
23470 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23  amed table..*/.#
23480 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23490 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20  IT_REINDEX.void 
234a0 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50  sqlite3Reindex(P
234b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
234c0 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b  ken *pName1, Tok
234d0 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43  en *pName2){.  C
234e0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
234f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
23500 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
23510 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
23520 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
23530 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20  har *z;         
23540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
23550 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  me of a table or
23560 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73   index */.  cons
23570 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20  t char *zDb;    
23580 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
23590 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
235a0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
235b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
235c0 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
235d0 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
235e0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
235f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23600 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
23610 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
23620 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
23630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23640 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69  * The database i
23650 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
23660 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
23670 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
23680 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
23690 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b  nection */.  Tok
236a0 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20  en *pObjName;   
236b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
236c0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
236d0 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69   index to be rei
236e0 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  ndexed */..  /* 
236f0 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  Read the databas
23700 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20  e schema. If an 
23710 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65  error occurs, le
23720 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
23730 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f  sage.  ** and co
23740 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  de in pParse and
23750 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f   return NULL. */
23760 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
23770 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
23780 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
23790 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
237a0 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20    if( pName1==0 
237b0 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61  ){.    reindexDa
237c0 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20  tabases(pParse, 
237d0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  0);.    return;.
237e0 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45 56 45    }else if( NEVE
237f0 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20  R(pName2==0) || 
23800 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a  pName2->z==0 ){.
23810 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b      char *zColl;
23820 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
23830 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43  me1->z );.    zC
23840 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  oll = sqlite3Nam
23850 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
23860 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  e->db, pName1);.
23870 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29      if( !zColl )
23880 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f   return;.    pCo
23890 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
238a0 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28  CollSeq(db, ENC(
238b0 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a  db), zColl, 0);.
238c0 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
238d0 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 44 61  .      reindexDa
238e0 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20  tabases(pParse, 
238f0 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  zColl);.      sq
23900 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
23910 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65  zColl);.      re
23920 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
23930 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
23940 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20  , zColl);.  }.  
23950 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
23960 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
23970 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
23980 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69   &pObjName);.  i
23990 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
239a0 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  n;.  z = sqlite3
239b0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
239c0 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69  , pObjName);.  i
239d0 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
239e0 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  zDb = db->aD
239f0 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  b[iDb].zDbSName;
23a00 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
23a10 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
23a20 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54  , zDb);.  if( pT
23a30 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  ab ){.    reinde
23a40 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
23a50 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  Tab, 0);.    sql
23a60 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
23a70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
23a80 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
23a90 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
23aa0 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71  b, z, zDb);.  sq
23ab0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
23ac0 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  z);.  if( pIndex
23ad0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
23ae0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
23af0 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
23b00 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  b);.    sqlite3R
23b10 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
23b20 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
23b30 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
23b40 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
23b50 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
23b60 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68  e to identify th
23b70 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72  e object to be r
23b80 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65  eindexed");.}.#e
23b90 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
23ba0 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  rn a KeyInfo str
23bb0 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20 61  ucture that is a
23bc0 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
23bd0 68 65 20 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a  he given Index..
23be0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
23bf0 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73   should invoke s
23c00 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
23c10 65 66 28 29 20 6f 6e 20 74 68 65 20 72 65 74 75  ef() on the retu
23c20 72 6e 65 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77  rned object.** w
23c30 68 65 6e 20 69 74 20 68 61 73 20 66 69 6e 69 73  hen it has finis
23c40 68 65 64 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f  hed using it..*/
23c50 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
23c60 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
23c70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
23c80 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69  ndex *pIdx){.  i
23c90 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  nt i;.  int nCol
23ca0 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   = pIdx->nColumn
23cb0 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70  ;.  int nKey = p
23cc0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  Idx->nKeyCol;.  
23cd0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20  KeyInfo *pKey;. 
23ce0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
23cf0 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
23d00 69 66 28 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f  if( pIdx->uniqNo
23d10 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70 4b 65  tNull ){.    pKe
23d20 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  y = sqlite3KeyIn
23d30 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  foAlloc(pParse->
23d40 64 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e  db, nKey, nCol-n
23d50 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Key);.  }else{. 
23d60 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65     pKey = sqlite
23d70 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50  3KeyInfoAlloc(pP
23d80 61 72 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20  arse->db, nCol, 
23d90 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b  0);.  }.  if( pK
23da0 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ey ){.    assert
23db0 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
23dc0 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
23dd0 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ) );.    for(i=0
23de0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
23df0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
23e00 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
23e10 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  azColl[i];.     
23e20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20   pKey->aColl[i] 
23e30 3d 20 7a 43 6f 6c 6c 3d 3d 73 71 6c 69 74 65 33  = zColl==sqlite3
23e40 53 74 72 42 49 4e 41 52 59 20 3f 20 30 20 3a 0a  StrBINARY ? 0 :.
23e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c          sqlite3L
23e70 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
23e80 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  rse, zColl);.   
23e90 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72     pKey->aSortOr
23ea0 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61  der[i] = pIdx->a
23eb0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20  SortOrder[i];.  
23ec0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72    }.    if( pPar
23ed0 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
23ee0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
23ef0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52  ->rc==SQLITE_ERR
23f00 4f 52 5f 4d 49 53 53 49 4e 47 5f 43 4f 4c 4c 53  OR_MISSING_COLLS
23f10 45 51 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  EQ );.      if( 
23f20 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72 79 3d 3d  pIdx->bNoQuery==
23f30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
23f40 44 65 61 63 74 69 76 61 74 65 20 74 68 65 20 69  Deactivate the i
23f50 6e 64 65 78 20 62 65 63 61 75 73 65 20 69 74 20  ndex because it 
23f60 63 6f 6e 74 61 69 6e 73 20 61 6e 20 75 6e 6b 6e  contains an unkn
23f70 6f 77 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20  own collating.  
23f80 20 20 20 20 20 20 2a 2a 20 73 65 71 75 65 6e 63        ** sequenc
23f90 65 2e 20 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  e.  The only way
23fa0 20 74 6f 20 72 65 61 63 74 69 76 65 20 74 68 65   to reactive the
23fb0 20 69 6e 64 65 78 20 69 73 20 74 6f 20 72 65 6c   index is to rel
23fc0 6f 61 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  oad the.        
23fd0 2a 2a 20 73 63 68 65 6d 61 2e 20 20 41 64 64 69  ** schema.  Addi
23fe0 6e 67 20 74 68 65 20 6d 69 73 73 69 6e 67 20 63  ng the missing c
23ff0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
24000 65 20 6c 61 74 65 72 20 64 6f 65 73 20 6e 6f 74  e later does not
24010 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61 63  .        ** reac
24020 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 2e 20  tive the index. 
24030 20 54 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   The application
24040 20 68 61 64 20 74 68 65 20 63 68 61 6e 63 65 20   had the chance 
24050 74 6f 20 72 65 67 69 73 74 65 72 0a 20 20 20 20  to register.    
24060 20 20 20 20 2a 2a 20 74 68 65 20 6d 69 73 73 69      ** the missi
24070 6e 67 20 69 6e 64 65 78 20 75 73 69 6e 67 20 74  ng index using t
24080 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 65 65  he collation-nee
24090 64 65 64 20 63 61 6c 6c 62 61 63 6b 2e 20 20 46  ded callback.  F
240a0 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69  or.        ** si
240b0 6d 70 6c 69 63 69 74 79 2c 20 53 51 4c 69 74 65  mplicity, SQLite
240c0 20 77 69 6c 6c 20 6e 6f 74 20 67 69 76 65 20 74   will not give t
240d0 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 61  he application a
240e0 20 73 65 63 6f 6e 64 20 63 68 61 6e 63 65 2e 0a   second chance..
240f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
24100 20 20 20 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72     pIdx->bNoQuer
24110 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  y = 1;.        p
24120 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
24130 54 45 5f 45 52 52 4f 52 5f 52 45 54 52 59 3b 0a  TE_ERROR_RETRY;.
24140 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
24150 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
24160 66 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 70  f(pKey);.      p
24170 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Key = 0;.    }. 
24180 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79   }.  return pKey
24190 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
241a0 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20  ITE_OMIT_CTE./* 
241b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
241c0 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65   is invoked once
241d0 20 70 65 72 20 43 54 45 20 62 79 20 74 68 65 20   per CTE by the 
241e0 70 61 72 73 65 72 20 77 68 69 6c 65 20 70 61 72  parser while par
241f0 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49 54 48 20  sing a .** WITH 
24200 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68  clause. .*/.With
24210 20 2a 73 71 6c 69 74 65 33 57 69 74 68 41 64 64   *sqlite3WithAdd
24220 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
24230 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
24240 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
24250 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c  /.  With *pWith,
24260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
24270 78 69 73 74 69 6e 67 20 57 49 54 48 20 63 6c 61  xisting WITH cla
24280 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
24290 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
242a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
242b0 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d  e of the common-
242c0 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
242d0 69 73 74 20 2a 70 41 72 67 6c 69 73 74 2c 20 20  ist *pArglist,  
242e0 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63     /* Optional c
242f0 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20  olumn name list 
24300 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
24310 0a 20 20 53 65 6c 65 63 74 20 2a 70 51 75 65 72  .  Select *pQuer
24320 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75  y          /* Qu
24330 65 72 79 20 75 73 65 64 20 74 6f 20 69 6e 69 74  ery used to init
24340 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c 65  ialize the table
24350 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
24360 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
24370 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e 65 77 3b  b;.  With *pNew;
24380 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
24390 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
243a0 20 74 68 65 20 43 54 45 20 6e 61 6d 65 20 69 73   the CTE name is
243b0 20 75 6e 69 71 75 65 20 77 69 74 68 69 6e 20 74   unique within t
243c0 68 69 73 20 57 49 54 48 20 63 6c 61 75 73 65 2e  his WITH clause.
243d0 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74   If.  ** not, st
243e0 6f 72 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ore an error in 
243f0 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74  the Parse struct
24400 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20  ure. */.  zName 
24410 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
24420 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
24430 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
24440 20 7a 4e 61 6d 65 20 26 26 20 70 57 69 74 68 20   zName && pWith 
24450 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
24460 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69    for(i=0; i<pWi
24470 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  th->nCte; i++){.
24480 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
24490 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  3StrICmp(zName, 
244a0 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pWith->a[i].zNam
244b0 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
244c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
244d0 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63  (pParse, "duplic
244e0 61 74 65 20 57 49 54 48 20 74 61 62 6c 65 20 6e  ate WITH table n
244f0 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29  ame: %s", zName)
24500 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24510 20 20 7d 0a 0a 20 20 69 66 28 20 70 57 69 74 68    }..  if( pWith
24520 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   ){.    int nByt
24530 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 57 69 74  e = sizeof(*pWit
24540 68 29 20 2b 20 28 73 69 7a 65 6f 66 28 70 57 69  h) + (sizeof(pWi
24550 74 68 2d 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74  th->a[1]) * pWit
24560 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e  h->nCte);.    pN
24570 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
24580 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69 74 68 2c  alloc(db, pWith,
24590 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
245a0 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  {.    pNew = sql
245b0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
245c0 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69  (db, sizeof(*pWi
245d0 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  th));.  }.  asse
245e0 72 74 28 20 28 70 4e 65 77 21 3d 30 20 26 26 20  rt( (pNew!=0 && 
245f0 7a 4e 61 6d 65 21 3d 30 29 20 7c 7c 20 64 62 2d  zName!=0) || db-
24600 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
24610 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
24620 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
24630 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
24640 65 6c 65 74 65 28 64 62 2c 20 70 41 72 67 6c 69  elete(db, pArgli
24650 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
24660 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
24670 20 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71   pQuery);.    sq
24680 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
24690 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
246a0 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73   = pWith;.  }els
246b0 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70  e{.    pNew->a[p
246c0 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65  New->nCte].pSele
246d0 63 74 20 3d 20 70 51 75 65 72 79 3b 0a 20 20 20  ct = pQuery;.   
246e0 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
246f0 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72  Cte].pCols = pAr
24700 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d  glist;.    pNew-
24710 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a  >a[pNew->nCte].z
24720 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
24730 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
24740 6e 43 74 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20  nCte].zCteErr = 
24750 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74  0;.    pNew->nCt
24760 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  e++;.  }..  retu
24770 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
24780 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65  * Free the conte
24790 6e 74 73 20 6f 66 20 74 68 65 20 57 69 74 68 20  nts of the With 
247a0 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
247b0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
247c0 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
247d0 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74 65 28  lite3WithDelete(
247e0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74  sqlite3 *db, Wit
247f0 68 20 2a 70 57 69 74 68 29 7b 0a 20 20 69 66 28  h *pWith){.  if(
24800 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e   pWith ){.    in
24810 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
24820 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b  ; i<pWith->nCte;
24830 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
24840 75 63 74 20 43 74 65 20 2a 70 43 74 65 20 3d 20  uct Cte *pCte = 
24850 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20  &pWith->a[i];.  
24860 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
24870 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  istDelete(db, pC
24880 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20  te->pCols);.    
24890 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
248a0 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e  elete(db, pCte->
248b0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
248c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
248d0 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCte->zName);.
248e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
248f0 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 69 74  3DbFree(db, pWit
24900 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  h);.  }.}.#endif
24910 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
24920 49 54 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f  ITE_OMIT_CTE) */
24930 0a                                               .