/ Hex Artifact Content
Login

Artifact b85d9265dee3d6f8ec7ed3e39636f8bf6efd55c02717f07373e117b7d0c10b84:


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 2f 2a 20  ailed ){.    /* 
1c60: 41 20 6d 69 6e 69 6d 75 6d 20 6f 66 20 6f 6e 65  A minimum of one
1c70: 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 69   cursor is requi
1c80: 72 65 64 20 69 66 20 61 75 74 6f 69 6e 63 72 65  red if autoincre
1c90: 6d 65 6e 74 20 69 73 20 75 73 65 64 0a 20 20 20  ment is used.   
1ca0: 20 2a 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b   *  See ticket [
1cb0: 61 36 39 36 33 37 39 63 31 66 30 38 38 36 36 5d  a696379c1f08866]
1cc0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1cd0: 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 3d 3d 30  pParse->pAinc==0
1ce0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 54 61 62   || pParse->nTab
1cf0: 3e 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  >0 );.    sqlite
1d00: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76  3VdbeMakeReady(v
1d10: 2c 20 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70  , pParse);.    p
1d20: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1d30: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
1d40: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  {.    pParse->rc
1d50: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1d60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75  .  }.}../*.** Ru
1d70: 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 6e 64  n the parser and
1d80: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
1d90: 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20 6f  recursively in o
1da0: 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65  rder to generate
1db0: 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68 65  .** code for the
1dc0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 67   SQL statement g
1dd0: 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e  iven onto the en
1de0: 64 20 6f 66 20 74 68 65 20 70 50 61 72 73 65 20  d of the pParse 
1df0: 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72 65  context.** curre
1e00: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
1e10: 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74  ruction.  When t
1e20: 68 65 20 70 61 72 73 65 72 20 69 73 20 72 75 6e  he parser is run
1e30: 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20   recursively.** 
1e40: 74 68 69 73 20 77 61 79 2c 20 74 68 65 20 66 69  this way, the fi
1e50: 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e  nal OP_Halt is n
1e60: 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20  ot appended and 
1e70: 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a 61  other initializa
1e80: 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61  tion.** and fina
1e90: 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 61  lization steps a
1ea0: 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61 75  re omitted becau
1eb0: 73 65 20 74 68 6f 73 65 20 61 72 65 20 68 61 6e  se those are han
1ec0: 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20  dling by the.** 
1ed0: 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65 72  outermost parser
1ee0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72  ..**.** Not ever
1ef0: 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61 62  ything is nestab
1f00: 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c 69  le.  This facili
1f10: 74 79 20 69 73 20 64 65 73 69 67 6e 65 64 20 74  ty is designed t
1f20: 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45  o permit.** INSE
1f30: 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20  RT, UPDATE, and 
1f40: 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
1f50: 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54 45  s against SQLITE
1f60: 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a  _MASTER.  Use.**
1f70: 20 63 61 72 65 20 69 66 20 79 6f 75 20 64 65 63   care if you dec
1f80: 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75 73  ide to try to us
1f90: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  e this routine f
1fa0: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
1fb0: 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  rposes..*/.void 
1fc0: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
1fd0: 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
1fe0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
1ff0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
2000: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61  a_list ap;.  cha
2010: 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20  r *zSql;.  char 
2020: 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
2030: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
2040: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 63 68 61 72  arse->db;.  char
2050: 20 73 61 76 65 42 75 66 5b 50 41 52 53 45 5f 54   saveBuf[PARSE_T
2060: 41 49 4c 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20  AIL_SZ];..  if( 
2070: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
2080: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
2090: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c   pParse->nested<
20a0: 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e  10 );  /* Nestin
20b0: 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  g should only be
20c0: 20 6f 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74   of limited dept
20d0: 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28  h */.  va_start(
20e0: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
20f0: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d  zSql = sqlite3VM
2100: 50 72 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72 6d  Printf(db, zForm
2110: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
2120: 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71  d(ap);.  if( zSq
2130: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  l==0 ){.    /* T
2140: 68 69 73 20 63 61 6e 20 72 65 73 75 6c 74 20 65  his can result e
2150: 69 74 68 65 72 20 66 72 6f 6d 20 61 6e 20 4f 4f  ither from an OO
2160: 4d 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  M or because the
2170: 20 66 6f 72 6d 61 74 74 65 64 20 73 74 72 69 6e   formatted strin
2180: 67 0a 20 20 20 20 2a 2a 20 65 78 63 65 65 64 73  g.    ** exceeds
2190: 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45   SQLITE_LIMIT_LE
21a0: 4e 47 54 48 2e 20 20 49 6e 20 74 68 65 20 6c 61  NGTH.  In the la
21b0: 74 74 65 72 20 63 61 73 65 2c 20 77 65 20 6e 65  tter case, we ne
21c0: 65 64 20 74 6f 20 73 65 74 0a 20 20 20 20 2a 2a  ed to set.    **
21d0: 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
21e0: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
21f0: 46 61 69 6c 65 64 20 29 20 70 50 61 72 73 65 2d  Failed ) pParse-
2200: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 54 4f 4f  >rc = SQLITE_TOO
2210: 42 49 47 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  BIG;.    return;
2220: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
2230: 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70  ested++;.  memcp
2240: 79 28 73 61 76 65 42 75 66 2c 20 50 41 52 53 45  y(saveBuf, PARSE
2250: 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50  _TAIL(pParse), P
2260: 41 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20  ARSE_TAIL_SZ);. 
2270: 20 6d 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41   memset(PARSE_TA
2280: 49 4c 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50  IL(pParse), 0, P
2290: 41 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20  ARSE_TAIL_SZ);. 
22a0: 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65   sqlite3RunParse
22b0: 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20  r(pParse, zSql, 
22c0: 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c  &zErrMsg);.  sql
22d0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
22e0: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
22f0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71  e3DbFree(db, zSq
2300: 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41 52  l);.  memcpy(PAR
2310: 53 45 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c  SE_TAIL(pParse),
2320: 20 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f   saveBuf, PARSE_
2330: 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61 72  TAIL_SZ);.  pPar
2340: 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a  se->nested--;.}.
2350: 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52  .#if SQLITE_USER
2360: 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
2370: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
2380: 45 20 69 66 20 7a 54 61 62 6c 65 20 69 73 20 74  E if zTable is t
2390: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73  he name of the s
23a0: 79 73 74 65 6d 20 74 61 62 6c 65 20 74 68 61 74  ystem table that
23b0: 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6c   stores the.** l
23c0: 69 73 74 20 6f 66 20 75 73 65 72 73 20 61 6e 64  ist of users and
23d0: 20 74 68 65 69 72 20 61 63 63 65 73 73 20 63 72   their access cr
23e0: 65 64 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e  edentials..*/.in
23f0: 74 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74  t sqlite3UserAut
2400: 68 54 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61  hTable(const cha
2410: 72 20 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72 65  r *zTable){.  re
2420: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 72  turn sqlite3_str
2430: 69 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71  icmp(zTable, "sq
2440: 6c 69 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b 0a  lite_user")==0;.
2450: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
2460: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
2470: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
2480: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20  hat describes a 
2490: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
24a0: 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76  ase.** table giv
24b0: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
24c0: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
24d0: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
24e0: 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ame of the.** da
24f0: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
2500: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
2510: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
2520: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
2530: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
2540: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
2550: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
2560: 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68  the table and th
2570: 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68  e.** first match
2580: 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74  ing table is ret
2590: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
25a0: 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61  king for duplica
25b0: 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65  te table.** name
25c0: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
25d0: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
25e0: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
25f0: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
2600: 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61  .** auxiliary da
2610: 74 61 62 61 73 65 73 20 61 64 64 65 64 20 75 73  tabases added us
2620: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
2630: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65  ommand..**.** Se
2640: 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f  e also sqlite3Lo
2650: 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a  cateTable()..*/.
2660: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69  Table *sqlite3Fi
2670: 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  ndTable(sqlite3 
2680: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
2690: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
26a0: 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a  ar *zDatabase){.
26b0: 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a    Table *p = 0;.
26c0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41    int i;..  /* A
26d0: 6c 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20 72  ll mutexes are r
26e0: 65 71 75 69 72 65 64 20 66 6f 72 20 73 63 68 65  equired for sche
26f0: 6d 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65  ma access.  Make
2700: 20 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68   sure we hold th
2710: 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  em. */.  assert(
2720: 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c   zDatabase!=0 ||
2730: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2740: 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29  dsAllMutexes(db)
2750: 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55   );.#if SQLITE_U
2760: 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
2770: 4f 4e 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65  ON.  /* Only the
2780: 20 61 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61   admin user is a
2790: 6c 6c 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74  llowed to know t
27a0: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75  hat the sqlite_u
27b0: 73 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65  ser table.  ** e
27c0: 78 69 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64  xists */.  if( d
27d0: 62 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65  b->auth.authLeve
27e0: 6c 3c 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26  l<UAUTH_Admin &&
27f0: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
2800: 54 61 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20  Table(zName)!=0 
2810: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
2820: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68  .  }.#endif.  wh
2830: 69 6c 65 28 31 29 7b 0a 20 20 20 20 66 6f 72 28  ile(1){.    for(
2840: 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69  i=OMIT_TEMPDB; i
2850: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
2860: 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69        int j = (i
2870: 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20  <2) ? i^1 : i;  
2880: 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20   /* Search TEMP 
2890: 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20  before MAIN */. 
28a0: 20 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61       if( zDataba
28b0: 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
28c0: 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73  StrICmp(zDatabas
28d0: 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44  e, db->aDb[j].zD
28e0: 62 53 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  bSName)==0 ){.  
28f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
2900: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
2910: 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29  Held(db, j, 0) )
2920: 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 73 71  ;.        p = sq
2930: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
2940: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d  b->aDb[j].pSchem
2950: 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d  a->tblHash, zNam
2960: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2970: 70 20 29 20 72 65 74 75 72 6e 20 70 3b 0a 20 20  p ) return p;.  
2980: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2990: 2f 2a 20 4e 6f 74 20 66 6f 75 6e 64 2e 20 20 49  /* Not found.  I
29a0: 66 20 74 68 65 20 6e 61 6d 65 20 77 65 20 77 65  f the name we we
29b0: 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 77  re looking for w
29c0: 61 73 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 6d  as temp.sqlite_m
29d0: 61 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65  aster.    ** the
29e0: 6e 20 63 68 61 6e 67 65 20 74 68 65 20 6e 61 6d  n change the nam
29f0: 65 20 74 6f 20 73 71 6c 69 74 65 5f 74 65 6d 70  e to sqlite_temp
2a00: 5f 6d 61 73 74 65 72 20 61 6e 64 20 74 72 79 20  _master and try 
2a10: 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66  again. */.    if
2a20: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
2a30: 28 7a 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e  (zName, MASTER_N
2a40: 41 4d 45 29 21 3d 30 20 29 20 62 72 65 61 6b 3b  AME)!=0 ) break;
2a50: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2a60: 5f 73 74 72 69 63 6d 70 28 7a 44 61 74 61 62 61  _stricmp(zDataba
2a70: 73 65 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a  se, db->aDb[1].z
2a80: 44 62 53 4e 61 6d 65 29 21 3d 30 20 29 20 62 72  DbSName)!=0 ) br
2a90: 65 61 6b 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  eak;.    zName =
2aa0: 20 54 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d   TEMP_MASTER_NAM
2ab0: 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
2ac0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  0;.}../*.** Loca
2ad0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
2ae0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2af0: 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74  describes a part
2b00: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a  icular database.
2b10: 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  ** table given t
2b20: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
2b30: 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f  table and (optio
2b40: 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20  nally) the name 
2b50: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
2b60: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
2b70: 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
2b80: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
2b90: 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20  nd.  Also leave 
2ba0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73  an.** error mess
2bb0: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
2bc0: 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
2bd0: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
2be0: 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
2bf0: 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  e and sqlite3Fin
2c00: 64 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74  dTable() is that
2c10: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
2c20: 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72   leaves an error
2c30: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2c40: 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72  se->zErrMsg wher
2c50: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64  e.** sqlite3Find
2c60: 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74  Table() does not
2c70: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
2c80: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a  te3LocateTable(.
2c90: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2ca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74           /* cont
2cb0: 65 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ext in which to 
2cc0: 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f  report errors */
2cd0: 0a 20 20 75 33 32 20 66 6c 61 67 73 2c 20 20 20  .  u32 flags,   
2ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f 43            /* LOC
2cf0: 41 54 45 5f 56 49 45 57 20 6f 72 20 4c 4f 43 41  ATE_VIEW or LOCA
2d00: 54 45 5f 4e 4f 45 52 52 20 2a 2f 0a 20 20 63 6f  TE_NOERR */.  co
2d10: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2d20: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2d30: 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65  the table we are
2d40: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a   looking for */.
2d50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2d60: 62 61 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65  base     /* Name
2d70: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2d80: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
2d90: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
2da0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
2db0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
2dc0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
2dd0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
2de0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2df0: 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
2e00: 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
2e10: 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
2e20: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
2e30: 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d  L. */.  if( (db-
2e40: 3e 6d 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c  >mDbFlags & DBFL
2e50: 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b  AG_SchemaKnownOk
2e60: 29 3d 3d 30 20 0a 20 20 20 26 26 20 53 51 4c 49  )==0 .   && SQLI
2e70: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
2e80: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
2e90: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2ea0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73   0;.  }..  p = s
2eb0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2ec0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73  db, zName, zDbas
2ed0: 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  e);.  if( p==0 )
2ee0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
2ef0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2f00: 4c 45 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61  LE.    /* If zNa
2f10: 6d 65 20 69 73 20 74 68 65 20 6e 6f 74 20 74 68  me is the not th
2f20: 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c  e name of a tabl
2f30: 65 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20  e in the schema 
2f40: 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a 20 20  created using.  
2f50: 20 20 2a 2a 20 43 52 45 41 54 45 2c 20 74 68 65    ** CREATE, the
2f60: 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  n check to see i
2f70: 66 20 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65  f it is the name
2f80: 20 6f 66 20 61 6e 20 76 69 72 74 75 61 6c 20 74   of an virtual t
2f90: 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  able that.    **
2fa0: 20 63 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79   can be an epony
2fb0: 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61 62  mous virtual tab
2fc0: 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  le. */.    if( p
2fd0: 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 56 74  Parse->disableVt
2fe0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d  ab==0 ){.      M
2ff0: 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d  odule *pMod = (M
3000: 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 33 48 61  odule*)sqlite3Ha
3010: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64  shFind(&db->aMod
3020: 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ule, zName);.   
3030: 20 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20 26     if( pMod==0 &
3040: 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  & sqlite3_strnic
3050: 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d  mp(zName, "pragm
3060: 61 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20  a_", 7)==0 ){.  
3070: 20 20 20 20 20 20 70 4d 6f 64 20 3d 20 73 71 6c        pMod = sql
3080: 69 74 65 33 50 72 61 67 6d 61 56 74 61 62 52 65  ite3PragmaVtabRe
3090: 67 69 73 74 65 72 28 64 62 2c 20 7a 4e 61 6d 65  gister(db, zName
30a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
30b0: 20 69 66 28 20 70 4d 6f 64 20 26 26 20 73 71 6c   if( pMod && sql
30c0: 69 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75  ite3VtabEponymou
30d0: 73 54 61 62 6c 65 49 6e 69 74 28 70 50 61 72 73  sTableInit(pPars
30e0: 65 2c 20 70 4d 6f 64 29 20 29 7b 0a 20 20 20 20  e, pMod) ){.    
30f0: 20 20 20 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d      return pMod-
3100: 3e 70 45 70 6f 54 61 62 3b 0a 20 20 20 20 20 20  >pEpoTab;.      
3110: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
3120: 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4c     if( flags & L
3130: 4f 43 41 54 45 5f 4e 4f 45 52 52 20 29 20 72 65  OCATE_NOERR ) re
3140: 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 50 61 72  turn 0;.    pPar
3150: 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
3160: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
3170: 20 49 73 56 69 72 74 75 61 6c 28 70 29 20 26 26   IsVirtual(p) &&
3180: 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
3190: 56 74 61 62 20 29 7b 0a 20 20 20 20 70 20 3d 20  Vtab ){.    p = 
31a0: 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 3d  0;.  }..  if( p=
31b0: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
31c0: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 66 6c 61  char *zMsg = fla
31d0: 67 73 20 26 20 4c 4f 43 41 54 45 5f 56 49 45 57  gs & LOCATE_VIEW
31e0: 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77   ? "no such view
31f0: 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62  " : "no such tab
3200: 6c 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  le";.    if( zDb
3210: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ase ){.      sql
3220: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3230: 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22  rse, "%s: %s.%s"
3240: 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20  , zMsg, zDbase, 
3250: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
3260: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
3270: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3280: 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c   "%s: %s", zMsg,
3290: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   zName);.    }. 
32a0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   }..  return p;.
32b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
32c0: 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69  the table identi
32d0: 66 69 65 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a  fied by *p..**.*
32e0: 2a 20 54 68 69 73 20 69 73 20 61 20 77 72 61 70  * This is a wrap
32f0: 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
3300: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e  e3LocateTable().
3310: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
3320: 62 65 74 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74  between.** sqlit
3330: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 20  e3LocateTable() 
3340: 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
3350: 6e 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  n is that this f
3360: 75 6e 63 74 69 6f 6e 20 72 65 73 74 72 69 63 74  unction restrict
3370: 73 0a 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20  s.** the search 
3380: 74 6f 20 73 63 68 65 6d 61 20 28 70 2d 3e 70 53  to schema (p->pS
3390: 63 68 65 6d 61 29 20 69 66 20 69 74 20 69 73 20  chema) if it is 
33a0: 6e 6f 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63  not NULL. p->pSc
33b0: 68 65 6d 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e  hema may be.** n
33c0: 6f 6e 2d 4e 55 4c 4c 20 69 66 20 69 74 20 69 73  on-NULL if it is
33d0: 20 70 61 72 74 20 6f 66 20 61 20 76 69 65 77 20   part of a view 
33e0: 6f 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  or trigger progr
33f0: 61 6d 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53  am definition. S
3400: 65 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 78  ee.** sqlite3Fix
3410: 53 72 63 4c 69 73 74 28 29 20 66 6f 72 20 64 65  SrcList() for de
3420: 74 61 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20  tails..*/.Table 
3430: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
3440: 62 6c 65 49 74 65 6d 28 0a 20 20 50 61 72 73 65  bleItem(.  Parse
3450: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 75 33 32   *pParse, .  u32
3460: 20 66 6c 61 67 73 2c 0a 20 20 73 74 72 75 63 74   flags,.  struct
3470: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
3480: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
3490: 20 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28   *zDb;.  assert(
34a0: 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c   p->pSchema==0 |
34b0: 7c 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d  | p->zDatabase==
34c0: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53  0 );.  if( p->pS
34d0: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74  chema ){.    int
34e0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
34f0: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
3500: 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65  se->db, p->pSche
3510: 6d 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70  ma);.    zDb = p
3520: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
3530: 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
3540: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d  }else{.    zDb =
3550: 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20   p->zDatabase;. 
3560: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
3570: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
3580: 50 61 72 73 65 2c 20 66 6c 61 67 73 2c 20 70 2d  Parse, flags, p-
3590: 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a  >zName, zDb);.}.
35a0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
35b0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
35c0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
35d0: 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69  ibes .** a parti
35e0: 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65  cular index give
35f0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
3600: 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20  at index.** and 
3610: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
3620: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f  database that co
3630: 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78  ntains the index
3640: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ..** Return NULL
3650: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
3660: 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73  *.** If zDatabas
3670: 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61  e is 0, all data
3680: 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68  bases are search
3690: 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61  ed for the.** ta
36a0: 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73  ble and the firs
36b0: 74 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78  t matching index
36c0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28   is returned.  (
36d0: 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66  No checking.** f
36e0: 6f 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64  or duplicate ind
36f0: 65 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65  ex names is done
3700: 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f  .)  The search o
3710: 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20  rder is.** TEMP 
3720: 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e  first, then MAIN
3730: 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c  , then any auxil
3740: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61  iary databases a
3750: 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68  dded.** using th
3760: 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64  e ATTACH command
3770: 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  ..*/.Index *sqli
3780: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c  te3FindIndex(sql
3790: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
37a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
37b0: 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
37c0: 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20   Index *p = 0;. 
37d0: 20 69 6e 74 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c   int i;.  /* All
37e0: 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71   mutexes are req
37f0: 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61  uired for schema
3800: 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73   access.  Make s
3810: 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d  ure we hold them
3820: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  . */.  assert( z
3830: 44 62 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  Db!=0 || sqlite3
3840: 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
3850: 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20 66 6f  exes(db) );.  fo
3860: 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b  r(i=OMIT_TEMPDB;
3870: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
3880: 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69  {.    int j = (i
3890: 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20  <2) ? i^1 : i;  
38a0: 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62  /* Search TEMP b
38b0: 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20  efore MAIN */.  
38c0: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
38d0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70  a = db->aDb[j].p
38e0: 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65  Schema;.    asse
38f0: 72 74 28 20 70 53 63 68 65 6d 61 20 29 3b 0a 20  rt( pSchema );. 
3900: 20 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71     if( zDb && sq
3910: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62  lite3StrICmp(zDb
3920: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62  , db->aDb[j].zDb
3930: 53 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  SName) ) continu
3940: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  e;.    assert( s
3950: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
3960: 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20  xHeld(db, j, 0) 
3970: 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  );.    p = sqlit
3980: 65 33 48 61 73 68 46 69 6e 64 28 26 70 53 63 68  e3HashFind(&pSch
3990: 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e  ema->idxHash, zN
39a0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20  ame);.    if( p 
39b0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
39c0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
39d0: 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65  * Reclaim the me
39e0: 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20  mory used by an 
39f0: 69 6e 64 65 78 0a 2a 2f 0a 76 6f 69 64 20 73 71  index.*/.void sq
3a00: 6c 69 74 65 33 46 72 65 65 49 6e 64 65 78 28 73  lite3FreeIndex(s
3a10: 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65  qlite3 *db, Inde
3a20: 78 20 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53  x *p){.#ifndef S
3a30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59  QLITE_OMIT_ANALY
3a40: 5a 45 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  ZE.  sqlite3Dele
3a50: 74 65 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 64  teIndexSamples(d
3a60: 62 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  b, p);.#endif.  
3a70: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3a80: 65 28 64 62 2c 20 70 2d 3e 70 50 61 72 74 49 64  e(db, p->pPartId
3a90: 78 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74  xWhere);.  sqlit
3aa0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
3ab0: 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 45 78 70 72  (db, p->aColExpr
3ac0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
3ad0: 65 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66  ee(db, p->zColAf
3ae0: 66 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 73 52  f);.  if( p->isR
3af0: 65 73 69 7a 65 64 20 29 20 73 71 6c 69 74 65 33  esized ) sqlite3
3b00: 44 62 46 72 65 65 28 64 62 2c 20 28 76 6f 69 64  DbFree(db, (void
3b10: 20 2a 29 70 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 23   *)p->azColl);.#
3b20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
3b30: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
3b40: 54 34 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  T4.  sqlite3_fre
3b50: 65 28 70 2d 3e 61 69 52 6f 77 45 73 74 29 3b 0a  e(p->aiRowEst);.
3b60: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
3b70: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
3b80: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
3b90: 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64  index called zId
3ba0: 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20 66  xName which is f
3bb0: 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61  ound in the data
3bc0: 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c  base iDb,.** unl
3bd0: 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20 66  ike that index f
3be0: 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68  rom its Table th
3bf0: 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  en remove the in
3c00: 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  dex from.** the 
3c10: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
3c20: 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65   and free all me
3c30: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
3c40: 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
3c50: 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f  th the index..*/
3c60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c  .void sqlite3Unl
3c70: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
3c80: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  x(sqlite3 *db, i
3c90: 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68  nt iDb, const ch
3ca0: 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20  ar *zIdxName){. 
3cb0: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
3cc0: 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a    Hash *pHash;..
3cd0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3ce0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
3cf0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
3d00: 20 20 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61    pHash = &db->a
3d10: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
3d20: 3e 69 64 78 48 61 73 68 3b 0a 20 20 70 49 6e 64  >idxHash;.  pInd
3d30: 65 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ex = sqlite3Hash
3d40: 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49  Insert(pHash, zI
3d50: 64 78 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66  dxName, 0);.  if
3d60: 28 20 41 4c 57 41 59 53 28 70 49 6e 64 65 78 29  ( ALWAYS(pIndex)
3d70: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64   ){.    if( pInd
3d80: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
3d90: 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20  ex==pIndex ){.  
3da0: 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62      pIndex->pTab
3db0: 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  le->pIndex = pIn
3dc0: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
3dd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
3de0: 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 2f 2a 20  ex *p;.      /* 
3df0: 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 6f 66  Justification of
3e00: 20 41 4c 57 41 59 53 28 29 3b 20 20 54 68 65 20   ALWAYS();  The 
3e10: 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20 6f 6e  index must be on
3e20: 20 74 68 65 20 6c 69 73 74 20 6f 66 0a 20 20 20   the list of.   
3e30: 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 2a     ** indices. *
3e40: 2f 0a 20 20 20 20 20 20 70 20 3d 20 70 49 6e 64  /.      p = pInd
3e50: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
3e60: 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ex;.      while(
3e70: 20 41 4c 57 41 59 53 28 70 29 20 26 26 20 70 2d   ALWAYS(p) && p-
3e80: 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 20 29  >pNext!=pIndex )
3e90: 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20  { p = p->pNext; 
3ea0: 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  }.      if( ALWA
3eb0: 59 53 28 70 20 26 26 20 70 2d 3e 70 4e 65 78 74  YS(p && p->pNext
3ec0: 3d 3d 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  ==pIndex) ){.   
3ed0: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
3ee0: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
3ef0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
3f00: 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65   sqlite3FreeInde
3f10: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
3f20: 20 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67   }.  db->mDbFlag
3f30: 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65  s |= DBFLAG_Sche
3f40: 6d 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a  maChange;.}../*.
3f50: 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20  ** Look through 
3f60: 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e  the list of open
3f70: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
3f80: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64  in db->aDb[] and
3f90: 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20   if.** any have 
3fa0: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d  been closed, rem
3fb0: 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68  ove them from th
3fc0: 65 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63  e list.  Realloc
3fd0: 61 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61  ate the.** db->a
3fe0: 44 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74  Db[] structure t
3ff0: 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65  o a smaller size
4000: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  , if possible..*
4010: 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68  *.** Entry 0 (th
4020: 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73  e "main" databas
4030: 65 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28  e) and entry 1 (
4040: 74 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62  the "temp" datab
4050: 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65  ase).** are neve
4060: 72 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  r candidates for
4070: 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64   being collapsed
4080: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4090: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
40a0: 65 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  eArray(sqlite3 *
40b0: 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  db){.  int i, j;
40c0: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
40d0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
40e0: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
40f0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
4100: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
4110: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
4120: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4130: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 3b 0a  pDb->zDbSName);.
4140: 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e        pDb->zDbSN
4150: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ame = 0;.      c
4160: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
4170: 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20     if( j<i ){.  
4180: 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d      db->aDb[j] =
4190: 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20   db->aDb[i];.   
41a0: 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a   }.    j++;.  }.
41b0: 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20    db->nDb = j;. 
41c0: 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20   if( db->nDb<=2 
41d0: 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e  && db->aDb!=db->
41e0: 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20  aDbStatic ){.   
41f0: 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53   memcpy(db->aDbS
4200: 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20  tatic, db->aDb, 
4210: 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62  2*sizeof(db->aDb
4220: 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  [0]));.    sqlit
4230: 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d  e3DbFree(db, db-
4240: 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61  >aDb);.    db->a
4250: 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74  Db = db->aDbStat
4260: 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ic;.  }.}../*.**
4270: 20 52 65 73 65 74 20 74 68 65 20 73 63 68 65 6d   Reset the schem
4280: 61 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  a for the databa
4290: 73 65 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e  se at index iDb.
42a0: 20 20 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65    Also reset the
42b0: 0a 2a 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e  .** TEMP schema.
42c0: 20 20 54 68 65 20 72 65 73 65 74 20 69 73 20 64    The reset is d
42d0: 65 66 65 72 72 65 64 20 69 66 20 64 62 2d 3e 6e  eferred if db->n
42e0: 53 63 68 65 6d 61 4c 6f 63 6b 20 69 73 20 6e 6f  SchemaLock is no
42f0: 74 20 7a 65 72 6f 2e 0a 2a 2a 20 44 65 66 65 72  t zero..** Defer
4300: 72 65 64 20 72 65 73 65 74 73 20 6d 61 79 20 62  red resets may b
4310: 65 20 72 75 6e 20 62 79 20 63 61 6c 6c 69 6e 67  e run by calling
4320: 20 77 69 74 68 20 69 44 62 3c 30 2e 0a 2a 2f 0a   with iDb<0..*/.
4330: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
4340: 74 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74  tOneSchema(sqlit
4350: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29  e3 *db, int iDb)
4360: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
4370: 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
4380: 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62 3e 3d   );..  if( iDb>=
4390: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
43a0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
43b0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
43c0: 20 30 29 20 29 3b 0a 20 20 20 20 44 62 53 65 74   0) );.    DbSet
43d0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62  Property(db, iDb
43e0: 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64  , DB_ResetWanted
43f0: 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70  );.    DbSetProp
4400: 65 72 74 79 28 64 62 2c 20 31 2c 20 44 42 5f 52  erty(db, 1, DB_R
4410: 65 73 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 20  esetWanted);.   
4420: 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d   db->mDbFlags &=
4430: 20 7e 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b   ~DBFLAG_SchemaK
4440: 6e 6f 77 6e 4f 6b 3b 0a 20 20 7d 0a 0a 20 20 69  nownOk;.  }..  i
4450: 66 28 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f  f( db->nSchemaLo
4460: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  ck==0 ){.    for
4470: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
4480: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
4490: 20 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64   DbHasProperty(d
44a0: 62 2c 20 69 2c 20 44 42 5f 52 65 73 65 74 57 61  b, i, DB_ResetWa
44b0: 6e 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  nted) ){.       
44c0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c   sqlite3SchemaCl
44d0: 65 61 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  ear(db->aDb[i].p
44e0: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 7d  Schema);.      }
44f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
4500: 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63  .** Erase all sc
4510: 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hema information
4520: 20 66 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68   from all attach
4530: 65 64 20 64 61 74 61 62 61 73 65 73 20 28 69 6e  ed databases (in
4540: 63 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e  cluding.** "main
4550: 22 20 61 6e 64 20 22 74 65 6d 70 22 29 20 66 6f  " and "temp") fo
4560: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
4570: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
4580: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
4590: 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66  esetAllSchemasOf
45a0: 43 6f 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74  Connection(sqlit
45b0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
45c0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
45d0: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
45e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
45f0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62  Db; i++){.    Db
4600: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
4610: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
4620: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
4630: 20 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68 65     if( db->nSche
4640: 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  maLock==0 ){.   
4650: 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65       sqlite3Sche
4660: 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63  maClear(pDb->pSc
4670: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  hema);.      }el
4680: 73 65 7b 0a 20 20 20 20 20 20 20 20 44 62 53 65  se{.        DbSe
4690: 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c  tProperty(db, i,
46a0: 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29   DB_ResetWanted)
46b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
46c0: 20 20 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61    }.  db->mDbFla
46d0: 67 73 20 26 3d 20 7e 28 44 42 46 4c 41 47 5f 53  gs &= ~(DBFLAG_S
46e0: 63 68 65 6d 61 43 68 61 6e 67 65 7c 44 42 46 4c  chemaChange|DBFL
46f0: 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b  AG_SchemaKnownOk
4700: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  );.  sqlite3Vtab
4710: 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a  UnlockList(db);.
4720: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
4730: 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 69 66  aveAll(db);.  if
4740: 28 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63  ( db->nSchemaLoc
4750: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  k==0 ){.    sqli
4760: 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62  te3CollapseDatab
4770: 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20  aseArray(db);.  
4780: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
4790: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
47a0: 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20  d when a commit 
47b0: 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
47c0: 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
47d0: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c  ernalChanges(sql
47e0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d  ite3 *db){.  db-
47f0: 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e 44 42  >mDbFlags &= ~DB
4800: 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67  FLAG_SchemaChang
4810: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  e;.}../*.** Dele
4820: 74 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  te memory alloca
4830: 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ted for the colu
4840: 6d 6e 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61  mn names of a ta
4850: 62 6c 65 20 6f 72 20 76 69 65 77 20 28 74 68 65  ble or view (the
4860: 0a 2a 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d  .** Table.aCol[]
4870: 20 61 72 72 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64   array)..*/.void
4880: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f   sqlite3DeleteCo
4890: 6c 75 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65  lumnNames(sqlite
48a0: 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54  3 *db, Table *pT
48b0: 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  able){.  int i;.
48c0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
48d0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
48e0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43  !=0 );.  if( (pC
48f0: 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f  ol = pTable->aCo
4900: 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  l)!=0 ){.    for
4910: 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  (i=0; i<pTable->
4920: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
4930: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
4940: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
4950: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
4960: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
4970: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c  e(db, pCol->pDfl
4980: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
4990: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
49a0: 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  ->zColl);.    }.
49b0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
49c0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43  e(db, pTable->aC
49d0: 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ol);.  }.}../*.*
49e0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
49f0: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
4a00: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
4a10: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
4a20: 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   Table.  No chan
4a30: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
4a40: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
4a50: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
4a60: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
4a70: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
4a80: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
4a90: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
4aa0: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
4ab0: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
4ac0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
4ad0: 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74  But it does dest
4ae0: 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74  roy.** memory st
4af0: 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20  ructures of the 
4b00: 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65  indices and fore
4b10: 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61  ign keys associa
4b20: 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65  ted with .** the
4b30: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
4b40: 65 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 69  e db parameter i
4b50: 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20  s optional.  It 
4b60: 69 73 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  is needed if the
4b70: 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a   Table object .*
4b80: 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61  * contains looka
4b90: 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54  side memory.  (T
4ba0: 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20  able objects in 
4bb0: 74 68 65 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f  the schema do no
4bc0: 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69  t use.** lookasi
4bd0: 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73  de memory, but s
4be0: 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 54 61  ome ephemeral Ta
4bf0: 62 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29  ble objects do.)
4c00: 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20 70    Or the.** db p
4c10: 61 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20  arameter can be 
4c20: 75 73 65 64 20 77 69 74 68 20 64 62 2d 3e 70 6e  used with db->pn
4c30: 42 79 74 65 73 46 72 65 65 64 20 74 6f 20 6d 65  BytesFreed to me
4c40: 61 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79  asure the memory
4c50: 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20  .** used by the 
4c60: 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f  Table object..*/
4c70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c  .static void SQL
4c80: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 64 65 6c  ITE_NOINLINE del
4c90: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
4ca0: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
4cb0: 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ble){.  Index *p
4cc0: 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 0a  Index, *pNext;..
4cd0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
4ce0: 42 55 47 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  BUG.  /* Record 
4cf0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
4d00: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73  tstanding lookas
4d10: 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ide allocations 
4d20: 69 6e 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73  in schema Tables
4d30: 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 64  .  ** prior to d
4d40: 6f 69 6e 67 20 61 6e 79 20 66 72 65 65 28 29 20  oing any free() 
4d50: 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 53 69 6e  operations.  Sin
4d60: 63 65 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73  ce schema Tables
4d70: 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20 20 2a 2a   do not use.  **
4d80: 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74 68 69 73   lookaside, this
4d90: 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20 6e   number should n
4da0: 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20  ot change. */.  
4db0: 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d  int nLookaside =
4dc0: 20 30 3b 0a 20 20 69 66 28 20 64 62 20 26 26 20   0;.  if( db && 
4dd0: 28 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67  (pTable->tabFlag
4de0: 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
4df0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4c 6f 6f  )==0 ){.    nLoo
4e00: 6b 61 73 69 64 65 20 3d 20 73 71 6c 69 74 65 33  kaside = sqlite3
4e10: 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64 28 64 62  LookasideUsed(db
4e20: 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
4e30: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  ..  /* Delete al
4e40: 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  l indices associ
4e50: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74  ated with this t
4e60: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
4e70: 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e  Index = pTable->
4e80: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
4e90: 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20  pIndex=pNext){. 
4ea0: 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65     pNext = pInde
4eb0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73  x->pNext;.    as
4ec0: 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53  sert( pIndex->pS
4ed0: 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70  chema==pTable->p
4ee0: 53 63 68 65 6d 61 0a 20 20 20 20 20 20 20 20 20  Schema.         
4ef0: 7c 7c 20 28 49 73 56 69 72 74 75 61 6c 28 70 54  || (IsVirtual(pT
4f00: 61 62 6c 65 29 20 26 26 20 70 49 6e 64 65 78 2d  able) && pIndex-
4f10: 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45  >idxType!=SQLITE
4f20: 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 29  _IDXTYPE_APPDEF)
4f30: 20 29 3b 0a 20 20 20 20 69 66 28 20 28 64 62 3d   );.    if( (db=
4f40: 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65  =0 || db->pnByte
4f50: 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20 21 49  sFreed==0) && !I
4f60: 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29  sVirtual(pTable)
4f70: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
4f80: 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d 3e  zName = pIndex->
4f90: 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20 54 45  zName; .      TE
4fa0: 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20 2a  STONLY ( Index *
4fb0: 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74 65 33  pOld = ) sqlite3
4fc0: 48 61 73 68 49 6e 73 65 72 74 28 0a 20 20 20 20  HashInsert(.    
4fd0: 20 20 20 20 20 26 70 49 6e 64 65 78 2d 3e 70 53       &pIndex->pS
4fe0: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
4ff0: 7a 4e 61 6d 65 2c 20 30 0a 20 20 20 20 20 20 29  zName, 0.      )
5000: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
5010: 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  db==0 || sqlite3
5020: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
5030: 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70  db, 0, pIndex->p
5040: 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20  Schema) );.     
5050: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70   assert( pOld==p
5060: 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30  Index || pOld==0
5070: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
5080: 6c 69 74 65 33 46 72 65 65 49 6e 64 65 78 28 64  lite3FreeIndex(d
5090: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
50a0: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
50b0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74   foreign keys at
50c0: 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74  tached to this t
50d0: 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  able. */.  sqlit
50e0: 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70  e3FkDelete(db, p
50f0: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65  Table);..  /* De
5100: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
5110: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
5120: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
5130: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
5140: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
5150: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5160: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
5170: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
5180: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43  e(db, pTable->zC
5190: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
51a0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
51b0: 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
51c0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
51d0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
51e0: 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b  pTable->pCheck);
51f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5200: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
5210: 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43  E.  sqlite3VtabC
5220: 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29  lear(db, pTable)
5230: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
5240: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
5250: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  ble);..  /* Veri
5260: 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61  fy that no looka
5270: 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20  side memory was 
5280: 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74  used by schema t
5290: 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  ables */.  asser
52a0: 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30  t( nLookaside==0
52b0: 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d   || nLookaside==
52c0: 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65  sqlite3Lookaside
52d0: 55 73 65 64 28 64 62 2c 30 29 20 29 3b 0a 7d 0a  Used(db,0) );.}.
52e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
52f0: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
5300: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
5310: 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  le){.  /* Do not
5320: 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c   delete the tabl
5330: 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65  e until the refe
5340: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
5350: 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69  hes zero. */.  i
5360: 66 28 20 21 70 54 61 62 6c 65 20 29 20 72 65 74  f( !pTable ) ret
5370: 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62  urn;.  if( ((!db
5380: 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46   || db->pnBytesF
5390: 72 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70  reed==0) && (--p
53a0: 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66 29 3e  Table->nTabRef)>
53b0: 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
53c0: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
53d0: 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Table);.}.../*.*
53e0: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
53f0: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
5400: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
5410: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
5420: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
5430: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
5440: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
5450: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
5460: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
5470: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
5480: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
5490: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
54a0: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
54b0: 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44  ble *p;.  Db *pD
54c0: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  b;..  assert( db
54d0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
54e0: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
54f0: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
5500: 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a  rt( zTabName );.
5510: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5520: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
5530: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
5540: 20 20 74 65 73 74 63 61 73 65 28 20 7a 54 61 62    testcase( zTab
5550: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f  Name[0]==0 );  /
5560: 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61  * Zero-length ta
5570: 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c  ble names are al
5580: 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d  lowed */.  pDb =
5590: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
55a0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
55b0: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
55c0: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
55d0: 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  zTabName, 0);.  
55e0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
55f0: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d  le(db, p);.  db-
5600: 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46  >mDbFlags |= DBF
5610: 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
5620: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
5630: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
5640: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
5650: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
5660: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
5670: 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  oken.  Space to 
5680: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
5690: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f  d string.** is o
56a0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
56b0: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
56c0: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
56d0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
56e0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
56f0: 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61  Any quotation ma
5700: 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22  rks (ex:  "name"
5710: 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d  , 'name', [name]
5720: 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61  , or `name`) tha
5730: 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68  t.** surround th
5740: 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f  e body of the to
5750: 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e  ken are removed.
5760: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
5770: 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69  e often just poi
5780: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
5790: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
57a0: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
57b0: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
57c0: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
57d0: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
57e0: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
57f0: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
5800: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
5810: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
5820: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
5830: 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a  mToken(sqlite3 *
5840: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
5850: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
5860: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  ;.  if( pName ){
5870: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
5880: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
5890: 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e  , (char*)pName->
58a0: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
58b0: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
58c0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  (zName);.  }else
58d0: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
58e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
58f0: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ame;.}../*.** Op
5900: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  en the sqlite_ma
5910: 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65  ster table store
5920: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75  d in database nu
5930: 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20  mber iDb for.** 
5940: 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62  writing. The tab
5950: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  le is opened usi
5960: 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  ng cursor 0..*/.
5970: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e  void sqlite3Open
5980: 4d 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73  MasterTable(Pars
5990: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *p, int iDb){.
59a0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
59b0: 74 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20  te3GetVdbe(p);. 
59c0: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
59d0: 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52  k(p, iDb, MASTER
59e0: 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53 54 45 52  _ROOT, 1, MASTER
59f0: 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c 69 74 65  _NAME);.  sqlite
5a00: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
5a10: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
5a20: 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  0, MASTER_ROOT, 
5a30: 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70  iDb, 5);.  if( p
5a40: 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ->nTab==0 ){.   
5a50: 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20   p->nTab = 1;.  
5a60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  }.}../*.** Param
5a70: 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74  eter zName point
5a80: 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69  s to a nul-termi
5a90: 6e 61 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e  nated buffer con
5aa0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
5ab0: 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73  .** of a databas
5ac0: 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  e ("main", "temp
5ad0: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
5ae0: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
5af0: 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
5b00: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 69  on returns the i
5b10: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65  ndex of the name
5b20: 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62  d database in db
5b30: 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d  ->aDb[], or.** -
5b40: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
5b50: 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  b cannot be foun
5b60: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5b70: 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69  3FindDbName(sqli
5b80: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
5b90: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
5ba0: 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20  nt i = -1;      
5bb0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
5bc0: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a  umber */.  if( z
5bd0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a  Name ){.    Db *
5be0: 70 44 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28  pDb;.    for(i=(
5bf0: 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d  db->nDb-1), pDb=
5c00: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d  &db->aDb[i]; i>=
5c10: 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a  0; i--, pDb--){.
5c20: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
5c30: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 44 62  ite3_stricmp(pDb
5c40: 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4e 61 6d  ->zDbSName, zNam
5c50: 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  e) ) break;.    
5c60: 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69 73 20 61    /* "main" is a
5c70: 6c 77 61 79 73 20 61 6e 20 61 63 63 65 70 74 61  lways an accepta
5c80: 62 6c 65 20 61 6c 69 61 73 20 66 6f 72 20 74 68  ble alias for th
5c90: 65 20 70 72 69 6d 61 72 79 20 64 61 74 61 62 61  e primary databa
5ca0: 73 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  se.      ** even
5cb0: 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20   if it has been 
5cc0: 72 65 6e 61 6d 65 64 20 75 73 69 6e 67 20 53 51  renamed using SQ
5cd0: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41  LITE_DBCONFIG_MA
5ce0: 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a 20 20 20  INDBNAME. */.   
5cf0: 20 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20 30     if( i==0 && 0
5d00: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
5d10: 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65 29  p("main", zName)
5d20: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
5d30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
5d40: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
5d50: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
5d60: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
5d70: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
5d80: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
5d90: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
5da0: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
5db0: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
5dc0: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
5dd0: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
5de0: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
5df0: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
5e00: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
5e10: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
5e20: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  xist..*/.int sql
5e30: 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74  ite3FindDb(sqlit
5e40: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
5e50: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Name){.  int i; 
5e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5e80: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
5e90: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
5ea0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
5eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
5ec0: 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68  me we are search
5ed0: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61  ing for */.  zNa
5ee0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
5ef0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
5f00: 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69  ame);.  i = sqli
5f10: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
5f20: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
5f30: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
5f40: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ame);.  return i
5f50: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c  ;.}../* The tabl
5f60: 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69  e or view or tri
5f70: 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73  gger name is pas
5f80: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
5f90: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a  ine via tokens.*
5fa0: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
5fb0: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
5fc0: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
5fd0: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
5fe0: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43  example:.**.** C
5ff0: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
6000: 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a  yyy (...);.** .*
6010: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
6020: 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e   set to "xxx" an
6030: 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20  d pName2 "yyy". 
6040: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
6050: 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d if.** the tabl
6060: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
6070: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
6080: 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  .e.:.**.** CREAT
6090: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
60a0: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  ;.**.** Then pNa
60b0: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
60c0: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
60d0: 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  s ""..**.** This
60e0: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
60f0: 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e  e *ppUnqual poin
6100: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
6110: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
6120: 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20  1 or.** pName2) 
6130: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
6140: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
6150: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64  e name.  The ind
6160: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ex of the.** dat
6170: 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72  abase "xxx" is r
6180: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
6190: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
61a0: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
61b0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
61c0: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
61d0: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
61e0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
61f0: 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me1,      /* The
6200: 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61   "xxx" in the na
6210: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20  me "xxx.yyy" or 
6220: 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  "xxx" */.  Token
6230: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f   *pName2,      /
6240: 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74  * The "yyy" in t
6250: 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79  he name "xxx.yyy
6260: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70  " */.  Token **p
6270: 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72  Unqual     /* Wr
6280: 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66  ite the unqualif
6290: 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ied object name 
62a0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
62b0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
62c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
62d0: 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  base holding the
62e0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
62f0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
6300: 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  e->db;..  assert
6310: 28 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b 0a 20  ( pName2!=0 );. 
6320: 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30   if( pName2->n>0
6330: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
6340: 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20  init.busy ) {.  
6350: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6360: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72  Msg(pParse, "cor
6370: 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b  rupt database");
6380: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
6390: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e  ;.    }.    *pUn
63a0: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20  qual = pName2;. 
63b0: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
63c0: 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65  FindDb(db, pName
63d0: 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  1);.    if( iDb<
63e0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
63f0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6400: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  e, "unknown data
6410: 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31  base %T", pName1
6420: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
6430: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  -1;.    }.  }els
6440: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
6450: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c  b->init.iDb==0 |
6460: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  | db->init.busy 
6470: 7c 7c 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  || IN_RENAME_OBJ
6480: 45 43 54 0a 20 20 20 20 20 20 20 20 20 20 20 20  ECT.            
6490: 20 7c 7c 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67   || (db->mDbFlag
64a0: 73 20 26 20 44 42 46 4c 41 47 5f 56 61 63 75 75  s & DBFLAG_Vacuu
64b0: 6d 29 21 3d 30 29 3b 0a 20 20 20 20 69 44 62 20  m)!=0);.    iDb 
64c0: 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a  = db->init.iDb;.
64d0: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
64e0: 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74  Name1;.  }.  ret
64f0: 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn iDb;.}../*.*
6500: 2a 20 54 72 75 65 20 69 66 20 50 52 41 47 4d 41  * True if PRAGMA
6510: 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61   writable_schema
6520: 20 69 73 20 4f 4e 0a 2a 2f 0a 69 6e 74 20 73 71   is ON.*/.int sq
6530: 6c 69 74 65 33 57 72 69 74 61 62 6c 65 53 63 68  lite3WritableSch
6540: 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ema(sqlite3 *db)
6550: 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 64  {.  testcase( (d
6560: 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45  b->flags&(SQLITE
6570: 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c  _WriteSchema|SQL
6580: 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d  ITE_Defensive))=
6590: 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
65a0: 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51  ( (db->flags&(SQ
65b0: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
65c0: 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76  |SQLITE_Defensiv
65d0: 65 29 29 3d 3d 0a 20 20 20 20 20 20 20 20 20 20  e))==.          
65e0: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 72 69 74       SQLITE_Writ
65f0: 65 53 63 68 65 6d 61 20 29 3b 0a 20 20 74 65 73  eSchema );.  tes
6600: 74 63 61 73 65 28 20 28 64 62 2d 3e 66 6c 61 67  tcase( (db->flag
6610: 73 26 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53  s&(SQLITE_WriteS
6620: 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66  chema|SQLITE_Def
6630: 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20 20 20 20  ensive))==.     
6640: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
6650: 5f 44 65 66 65 6e 73 69 76 65 20 29 3b 0a 20 20  _Defensive );.  
6660: 74 65 73 74 63 61 73 65 28 20 28 64 62 2d 3e 66  testcase( (db->f
6670: 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57 72 69  lags&(SQLITE_Wri
6680: 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f  teSchema|SQLITE_
6690: 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20  Defensive))==.  
66a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51               (SQ
66b0: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
66c0: 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76  |SQLITE_Defensiv
66d0: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  e) );.  return (
66e0: 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54  db->flags&(SQLIT
66f0: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51  E_WriteSchema|SQ
6700: 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29  LITE_Defensive))
6710: 3d 3d 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63  ==SQLITE_WriteSc
6720: 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  hema;.}../*.** T
6730: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
6740: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20  sed to check if 
6750: 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67  the UTF-8 string
6760: 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61   zName is a lega
6770: 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64  l.** unqualified
6780: 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20   name for a new 
6790: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74  schema object (t
67a0: 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65  able, index, vie
67b0: 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29  w or.** trigger)
67c0: 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20  . All names are 
67d0: 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f  legal except tho
67e0: 73 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  se that begin wi
67f0: 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a  th the string.**
6800: 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75   "sqlite_" (in u
6810: 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d  pper, lower or m
6820: 69 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73  ixed case). This
6830: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
6840: 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20  namespace.** is 
6850: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
6860: 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e  ernal use..*/.in
6870: 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  t sqlite3CheckOb
6880: 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a  jectName(Parse *
6890: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
68a0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
68b0: 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69  ( !pParse->db->i
68c0: 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72  nit.busy && pPar
68d0: 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20  se->nested==0 . 
68e0: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
68f0: 74 65 33 57 72 69 74 61 62 6c 65 53 63 68 65 6d  te3WritableSchem
6900: 61 28 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  a(pParse->db)==0
6910: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d  .          && 0=
6920: 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  =sqlite3StrNICmp
6930: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
6940: 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c  ", 7) ){.    sql
6950: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6960: 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d  rse, "object nam
6970: 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  e reserved for i
6980: 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22  nternal use: %s"
6990: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  , zName);.    re
69a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
69b0: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
69c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
69d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50  .** Return the P
69e0: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
69f0: 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49   of a table.*/.I
6a00: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 50 72 69  ndex *sqlite3Pri
6a10: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 54 61 62  maryKeyIndex(Tab
6a20: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64  le *pTab){.  Ind
6a30: 65 78 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  ex *p;.  for(p=p
6a40: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  Tab->pIndex; p &
6a50: 26 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49  & !IsPrimaryKeyI
6a60: 6e 64 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e  ndex(p); p=p->pN
6a70: 65 78 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20  ext){}.  return 
6a80: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
6a90: 72 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  rn the column of
6aa0: 20 69 6e 64 65 78 20 70 49 64 78 20 74 68 61 74   index pIdx that
6ab0: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
6ac0: 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  table.** column 
6ad0: 69 43 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31  iCol.  Return -1
6ae0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
6af0: 2f 0a 69 31 36 20 73 71 6c 69 74 65 33 43 6f 6c  /.i16 sqlite3Col
6b00: 75 6d 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65 78  umnOfIndex(Index
6b10: 20 2a 70 49 64 78 2c 20 69 31 36 20 69 43 6f 6c   *pIdx, i16 iCol
6b20: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
6b30: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
6b40: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
6b50: 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78    if( iCol==pIdx
6b60: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20  ->aiColumn[i] ) 
6b70: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
6b80: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
6b90: 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72  .** Begin constr
6ba0: 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  ucting a new tab
6bb0: 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
6bc0: 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  n in memory.  Th
6bd0: 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  is is.** the fir
6be0: 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63  st of several ac
6bf0: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68  tion routines th
6c00: 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e  at get called in
6c10: 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20   response.** to 
6c20: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
6c30: 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61  tatement.  In pa
6c40: 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72  rticular, this r
6c50: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
6c60: 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67  .** after seeing
6c70: 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22   tokens "CREATE"
6c80: 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64   and "TABLE" and
6c90: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
6ca0: 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66   The isTemp.** f
6cb0: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
6cc0: 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  he table should 
6cd0: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
6ce0: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
6cf0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74  ase.** file inst
6d00: 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61  ead of in the ma
6d10: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
6d20: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
6d30: 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20  lly the case.** 
6d40: 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20  when the "TEMP" 
6d50: 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b  or "TEMPORARY" k
6d60: 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e  eyword occurs in
6d70: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41   between.** CREA
6d80: 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a  TE and TABLE..**
6d90: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c  .** The new tabl
6da0: 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74  e record is init
6db0: 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20  ialized and put 
6dc0: 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  in pParse->pNewT
6dd0: 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65  able..** As more
6de0: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
6df0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
6e00: 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69  s parsed, additi
6e10: 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72  onal action.** r
6e20: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20  outines will be 
6e30: 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f  called to add mo
6e40: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
6e50: 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a  o this record..*
6e60: 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
6e70: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
6e80: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
6e90: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
6ea0: 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  ) routine.** is 
6eb0: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65  called to comple
6ec0: 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  te the construct
6ed0: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ion of the new t
6ee0: 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a  able record..*/.
6ef0: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61 72  void sqlite3Star
6f00: 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  tTable(.  Parse 
6f10: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
6f20: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
6f30: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
6f40: 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
6f50: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
6f60: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
6f70: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
6f80: 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e  ame2,   /* Secon
6f90: 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  d part of the na
6fa0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
6fb0: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  or view */.  int
6fc0: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a   isTemp,      /*
6fd0: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
6fe0: 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f   a TEMP table */
6ff0: 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20  .  int isView,  
7000: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
7010: 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f  his is a VIEW */
7020: 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c  .  int isVirtual
7030: 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  ,   /* True if t
7040: 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41 4c  his is a VIRTUAL
7050: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
7060: 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20  noErr        /* 
7070: 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61  Do nothing if ta
7080: 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ble already exis
7090: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
70a0: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72   *pTable;.  char
70b0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20   *zName = 0; /* 
70c0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
70d0: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  new table */.  s
70e0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
70f0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
7100: 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  *v;.  int iDb;  
7110: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
7120: 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65  se number to cre
7130: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e  ate the table in
7140: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
7150: 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c  me;    /* Unqual
7160: 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
7170: 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74  e table to creat
7180: 65 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e  e */..  if( db->
7190: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 64 62 2d  init.busy && db-
71a0: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31  >init.newTnum==1
71b0: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63 69   ){.    /* Speci
71c0: 61 6c 20 63 61 73 65 3a 20 20 50 61 72 73 69 6e  al case:  Parsin
71d0: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
71e0: 74 65 72 20 6f 72 20 73 71 6c 69 74 65 5f 74 65  ter or sqlite_te
71f0: 6d 70 5f 6d 61 73 74 65 72 20 73 63 68 65 6d 61  mp_master schema
7200: 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 64 62   */.    iDb = db
7210: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
7220: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
7230: 62 53 74 72 44 75 70 28 64 62 2c 20 53 43 48 45  bStrDup(db, SCHE
7240: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a  MA_TABLE(iDb));.
7250: 20 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d      pName = pNam
7260: 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e1;.  }else{.   
7270: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
7280: 61 73 65 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d  ase */.    iDb =
7290: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
72a0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
72b0: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
72c0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
72d0: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  <0 ) return;.   
72e0: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
72f0: 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 70  B && isTemp && p
7300: 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44  Name2->n>0 && iD
7310: 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  b!=1 ){.      /*
7320: 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74   If creating a t
7330: 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e  emp table, the n
7340: 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71  ame may not be q
7350: 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73 73  ualified. Unless
7360: 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64   .      ** the d
7370: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
7380: 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20  "temp" anyway.  
7390: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
73a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
73b0: 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c   "temporary tabl
73c0: 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75  e name must be u
73d0: 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20  nqualified");.  
73e0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
73f0: 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  }.    if( !OMIT_
7400: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
7410: 20 29 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20   ) iDb = 1;.    
7420: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
7430: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
7440: 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   pName);.    if(
7450: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
7460: 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T ){.      sqlit
7470: 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70  e3RenameTokenMap
7480: 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29  (pParse, (void*)
7490: 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20  zName, pName);. 
74a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73     }.  }.  pPars
74b0: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20  e->sNameToken = 
74c0: 2a 70 4e 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e  *pName;.  if( zN
74d0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
74e0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
74f0: 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  !=sqlite3CheckOb
7500: 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  jectName(pParse,
7510: 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67   zName) ){.    g
7520: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7530: 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28  error;.  }.  if(
7540: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31   db->init.iDb==1
7550: 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23   ) isTemp = 1;.#
7560: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7570: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
7580: 0a 20 20 61 73 73 65 72 74 28 20 69 73 54 65 6d  .  assert( isTem
7590: 70 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d  p==0 || isTemp==
75a0: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  1 );.  assert( i
75b0: 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69  sView==0 || isVi
75c0: 65 77 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20  ew==1 );.  {.   
75d0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
75e0: 20 61 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20   aCode[] = {.   
75f0: 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54      SQLITE_CREAT
7600: 45 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20  E_TABLE,.       
7610: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
7620: 4d 50 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20  MP_TABLE,.      
7630: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
7640: 49 45 57 2c 0a 20 20 20 20 20 20 20 53 51 4c 49  IEW,.       SQLI
7650: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
7660: 49 45 57 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63  IEW.    };.    c
7670: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
7680: 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
7690: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
76a0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
76b0: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
76c0: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
76d0: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
76e0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
76f0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7700: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
7710: 69 73 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c  isVirtual && sql
7720: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
7730: 61 72 73 65 2c 20 28 69 6e 74 29 61 43 6f 64 65  arse, (int)aCode
7740: 5b 69 73 54 65 6d 70 2b 32 2a 69 73 56 69 65 77  [isTemp+2*isView
7750: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
7760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7770: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c            zName,
7780: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
7790: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
77a0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
77b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
77c0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
77d0: 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f  ew table name do
77e0: 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77  es not collide w
77f0: 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  ith an existing.
7800: 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
7810: 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  ble name in the 
7820: 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20  same database.  
7830: 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d  Issue an error m
7840: 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69  essage if.  ** i
7850: 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65  t does. The exce
7860: 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20  ption is if the 
7870: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
7880: 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65  parsed was passe
7890: 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c  d.  ** to an sql
78a0: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
78b0: 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61  b() call. In tha
78c0: 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20  t case only the 
78d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a  column names.  *
78e0: 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c  * and types will
78f0: 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65   be used, so the
7900: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
7910: 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70   test for namesp
7920: 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69  ace.  ** collisi
7930: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
7940: 21 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53  !IN_SPECIAL_PARS
7950: 45 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  E ){.    char *z
7960: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
7970: 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
7980: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
7990: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
79a0: 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
79b0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
79c0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
79d0: 20 20 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c      pTable = sql
79e0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
79f0: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20  , zName, zDb);. 
7a00: 20 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b     if( pTable ){
7a10: 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72  .      if( !noEr
7a20: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
7a30: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7a40: 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61  rse, "table %T a
7a50: 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
7a60: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  pName);.      }e
7a70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
7a80: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
7a90: 75 73 79 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  usy || CORRUPT_D
7aa0: 42 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  B );.        sql
7ab0: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
7ac0: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
7ad0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7ae0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
7af0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
7b00: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
7b10: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
7b20: 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20  e, zDb)!=0 ){.  
7b30: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7b40: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
7b50: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
7b60: 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22   index named %s"
7b70: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
7b80: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
7b90: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
7ba0: 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71  }..  pTable = sq
7bb0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
7bc0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
7bd0: 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62  le));.  if( pTab
7be0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  le==0 ){.    ass
7bf0: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
7c00: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 50 61  ailed );.    pPa
7c10: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
7c20: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
7c30: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
7c40: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
7c50: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
7c60: 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  .  pTable->zName
7c70: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62   = zName;.  pTab
7c80: 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  le->iPKey = -1;.
7c90: 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
7ca0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
7cb0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62  .pSchema;.  pTab
7cc0: 6c 65 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b  le->nTabRef = 1;
7cd0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
7ce0: 45 46 41 55 4c 54 5f 52 4f 57 45 53 54 0a 20 20  EFAULT_ROWEST.  
7cf0: 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45  pTable->nRowLogE
7d00: 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  st = sqlite3LogE
7d10: 73 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  st(SQLITE_DEFAUL
7d20: 54 5f 52 4f 57 45 53 54 29 3b 0a 23 65 6c 73 65  T_ROWEST);.#else
7d30: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c  .  pTable->nRowL
7d40: 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
7d50: 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
7d60: 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
7d70: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
7d80: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65  ert( pParse->pNe
7d90: 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70  wTable==0 );.  p
7da0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
7db0: 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a   = pTable;..  /*
7dc0: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
7dd0: 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71  magic sqlite_seq
7de0: 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64  uence table used
7df0: 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   by autoincremen
7e00: 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63  t,.  ** then rec
7e10: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
7e20: 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74   this table in t
7e30: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
7e40: 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
7e50: 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63  so that INSERT c
7e60: 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c  an find the tabl
7e70: 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23  e easily..  */.#
7e80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7e90: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
7ea0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
7eb0: 6e 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70  nested && strcmp
7ec0: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
7ed0: 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b  sequence")==0 ){
7ee0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
7ef0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
7f00: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
7f10: 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70  );.    pTable->p
7f20: 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20  Schema->pSeqTab 
7f30: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  = pTable;.  }.#e
7f40: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  ndif..  /* Begin
7f50: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
7f60: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
7f70: 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20  nsert the table 
7f80: 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a  record into.  **
7f90: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
7fa0: 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20  ER table.  Note 
7fb0: 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68  in particular th
7fc0: 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68  at we must go ah
7fd0: 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c  ead.  ** and all
7fe0: 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64  ocate the record
7ff0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
8000: 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e  table entry now.
8010: 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a    Before any.  *
8020: 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  * PRIMARY KEY or
8030: 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73   UNIQUE keywords
8040: 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68   are parsed.  Th
8050: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c  ose keywords wil
8060: 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64  l cause.  ** ind
8070: 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74  ices to be creat
8080: 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  ed and the table
8090: 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d   record must com
80a0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20  e before the .  
80b0: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e  ** indices.  Hen
80c0: 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ce, the record n
80d0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
80e0: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ble must be allo
80f0: 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a  cated.  ** now..
8100: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
8110: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20  init.busy && (v 
8120: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
8130: 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a  (pParse))!=0 ){.
8140: 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20      int addr1;. 
8150: 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61     int fileForma
8160: 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c  t;.    int reg1,
8170: 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20   reg2, reg3;.   
8180: 20 2f 2a 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73   /* nullRow[] is
8190: 20 61 6e 20 4f 50 5f 52 65 63 6f 72 64 20 65 6e   an OP_Record en
81a0: 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 6f 77 20  coding of a row 
81b0: 63 6f 6e 74 61 69 6e 69 6e 67 20 35 20 4e 55 4c  containing 5 NUL
81c0: 4c 73 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63  Ls */.    static
81d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c   const char null
81e0: 52 6f 77 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c 20  Row[] = { 6, 0, 
81f0: 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
8200: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
8210: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
8220: 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23  rse, 1, iDb);..#
8230: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8240: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
8250: 20 20 20 20 69 66 28 20 69 73 56 69 72 74 75 61      if( isVirtua
8260: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
8270: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
8280: 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20  OP_VBegin);.    
8290: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
82a0: 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   If the file for
82b0: 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67  mat and encoding
82c0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
82d0: 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73   have not been s
82e0: 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  et, .    ** set 
82f0: 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f  them now..    */
8300: 0a 20 20 20 20 72 65 67 31 20 3d 20 70 50 61 72  .    reg1 = pPar
8310: 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b  se->regRowid = +
8320: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
8330: 20 20 20 72 65 67 32 20 3d 20 70 50 61 72 73 65     reg2 = pParse
8340: 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50  ->regRoot = ++pP
8350: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
8360: 72 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d  reg3 = ++pParse-
8370: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
8380: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8390: 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69  OP_ReadCookie, i
83a0: 44 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f  Db, reg3, BTREE_
83b0: 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20  FILE_FORMAT);.  
83c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
83d0: 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a  sBtree(v, iDb);.
83e0: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
83f0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
8400: 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 20 56   OP_If, reg3); V
8410: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
8420: 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d      fileFormat =
8430: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
8440: 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
8450: 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20  mt)!=0 ?.       
8460: 20 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53             1 : S
8470: 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46  QLITE_MAX_FILE_F
8480: 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74  ORMAT;.    sqlit
8490: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
84a0: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
84b0: 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  b, BTREE_FILE_FO
84c0: 52 4d 41 54 2c 20 66 69 6c 65 46 6f 72 6d 61 74  RMAT, fileFormat
84d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
84e0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
84f0: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
8500: 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49  TREE_TEXT_ENCODI
8510: 4e 47 2c 20 45 4e 43 28 64 62 29 29 3b 0a 20 20  NG, ENC(db));.  
8520: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
8530: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
8540: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75  ..    /* This ju
8550: 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61  st creates a pla
8560: 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64  ce-holder record
8570: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
8580: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20  aster table..   
8590: 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63   ** The record c
85a0: 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20  reated does not 
85b0: 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67  contain anything
85c0: 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62   yet.  It will b
85d0: 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a  e replaced.    *
85e0: 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e  * by the real en
85f0: 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65  try in code gene
8600: 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33  rated at sqlite3
8610: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20  EndTable()..    
8620: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  **.    ** The ro
8630: 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  wid for the new 
8640: 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e  entry is left in
8650: 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65   register pParse
8660: 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20  ->regRowid..    
8670: 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  ** The root page
8680: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
8690: 65 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74  ew table is left
86a0: 20 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e   in reg pParse->
86b0: 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20  regRoot..    ** 
86c0: 54 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f  The rowid and ro
86d0: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76  ot page number v
86e0: 61 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65 64  alues are needed
86f0: 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61   by the code tha
8700: 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  t.    ** sqlite3
8710: 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65  EndTable will ge
8720: 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23  nerate..    */.#
8730: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
8740: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
8750: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8760: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
8770: 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73 56 69  LE).    if( isVi
8780: 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20  ew || isVirtual 
8790: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
87a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
87b0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
87c0: 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  2);.    }else.#e
87d0: 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
87e0: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54   pParse->addrCrT
87f0: 61 62 20 3d 0a 20 20 20 20 20 20 20 20 20 73 71  ab =.         sq
8800: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8810: 76 2c 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65  v, OP_CreateBtre
8820: 65 2c 20 69 44 62 2c 20 72 65 67 32 2c 20 42 54  e, iDb, reg2, BT
8830: 52 45 45 5f 49 4e 54 4b 45 59 29 3b 0a 20 20 20  REE_INTKEY);.   
8840: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70   }.    sqlite3Op
8850: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50  enMasterTable(pP
8860: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
8870: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8880: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
8890: 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  , 0, reg1);.    
88a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
88b0: 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c  4(v, OP_Blob, 6,
88c0: 20 72 65 67 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f   reg3, 0, nullRo
88d0: 77 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  w, P4_STATIC);. 
88e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
88f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
8900: 74 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31  t, 0, reg3, reg1
8910: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8920: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
8930: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
8940: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8950: 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29  Op0(v, OP_Close)
8960: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d  ;.  }..  /* Norm
8970: 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72  al (non-error) r
8980: 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75  eturn. */.  retu
8990: 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  rn;..  /* If an 
89a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65  error occurs, we
89b0: 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65   jump here */.be
89c0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a  gin_table_error:
89d0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
89e0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72  (db, zName);.  r
89f0: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74  eturn;.}../* Set
8a00: 20 70 72 6f 70 65 72 74 69 65 73 20 6f 66 20 61   properties of a
8a10: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 62 61   table column ba
8a20: 73 65 64 20 6f 6e 20 74 68 65 20 28 6d 61 67 69  sed on the (magi
8a30: 63 61 6c 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20  cal).** name of 
8a40: 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23  the column..*/.#
8a50: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
8a60: 5f 48 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a  _HIDDEN_COLUMNS.
8a70: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 75  void sqlite3Colu
8a80: 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d  mnPropertiesFrom
8a90: 4e 61 6d 65 28 54 61 62 6c 65 20 2a 70 54 61 62  Name(Table *pTab
8aa0: 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b  , Column *pCol){
8ab0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
8ac0: 74 72 6e 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e  trnicmp(pCol->zN
8ad0: 61 6d 65 2c 20 22 5f 5f 68 69 64 64 65 6e 5f 5f  ame, "__hidden__
8ae0: 22 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 10)==0 ){.   
8af0: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
8b00: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45  |= COLFLAG_HIDDE
8b10: 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  N;.  }else if( p
8b20: 54 61 62 20 26 26 20 70 43 6f 6c 21 3d 70 54 61  Tab && pCol!=pTa
8b30: 62 2d 3e 61 43 6f 6c 20 26 26 20 28 70 43 6f 6c  b->aCol && (pCol
8b40: 5b 2d 31 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20  [-1].colFlags & 
8b50: 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 29 20  COLFLAG_HIDDEN) 
8b60: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  ){.    pTab->tab
8b70: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48  Flags |= TF_OOOH
8b80: 69 64 64 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  idden;.  }.}.#en
8b90: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  dif.../*.** Add 
8ba0: 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20  a new column to 
8bb0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
8bc0: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
8bd0: 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ucted..**.** The
8be0: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
8bf0: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  is routine once 
8c00: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
8c10: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69  declaration.** i
8c20: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
8c30: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c   statement.  sql
8c40: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29  ite3StartTable()
8c50: 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20   gets called.** 
8c60: 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69  first to get thi
8c70: 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e  ngs going.  Then
8c80: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
8c90: 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68   called for each
8ca0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76  .** column..*/.v
8cb0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
8cc0: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
8cd0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
8ce0: 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b  , Token *pType){
8cf0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
8d00: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nt i;.  char *z;
8d10: 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  .  char *zType;.
8d20: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
8d30: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8d40: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
8d50: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
8d60: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
8d70: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  eturn;.  if( p->
8d80: 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69  nCol+1>db->aLimi
8d90: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
8da0: 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
8db0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8dc0: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
8dd0: 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20  columns on %s", 
8de0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  p->zName);.    r
8df0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20 3d  eturn;.  }.  z =
8e00: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
8e10: 52 61 77 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e  Raw(db, pName->n
8e20: 20 2b 20 70 54 79 70 65 2d 3e 6e 20 2b 20 32 29   + pType->n + 2)
8e30: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
8e40: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 49 4e 5f  eturn;.  if( IN_
8e50: 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 20  RENAME_OBJECT ) 
8e60: 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
8e70: 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76  enMap(pParse, (v
8e80: 6f 69 64 2a 29 7a 2c 20 70 4e 61 6d 65 29 3b 0a  oid*)z, pName);.
8e90: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d    memcpy(z, pNam
8ea0: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
8eb0: 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20 3d  .  z[pName->n] =
8ec0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71   0;.  sqlite3Deq
8ed0: 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69  uote(z);.  for(i
8ee0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
8ef0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
8f00: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 2c 20  ite3_stricmp(z, 
8f10: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
8f20: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
8f30: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8f40: 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65  arse, "duplicate
8f50: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73   column name: %s
8f60: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", z);.      sql
8f70: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
8f80: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
8f90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
8fa0: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
8fb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
8fc0: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
8fd0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
8fe0: 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c  lloc(db,p->aCol,
8ff0: 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65  (p->nCol+8)*size
9000: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
9010: 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30  .    if( aNew==0
9020: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9030: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
9040: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
9050: 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20    }.    p->aCol 
9060: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43  = aNew;.  }.  pC
9070: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
9080: 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCol];.  memset
9090: 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCol, 0, sizeof
90a0: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
90b0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
90c0: 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  ;.  sqlite3Colum
90d0: 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e  nPropertiesFromN
90e0: 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a 20 0a  ame(p, pCol);. .
90f0: 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d    if( pType->n==
9100: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
9110: 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20  here is no type 
9120: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d  specified, colum
9130: 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61  ns have the defa
9140: 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 20  ult affinity.   
9150: 20 2a 2a 20 27 42 4c 4f 42 27 20 77 69 74 68 20   ** 'BLOB' with 
9160: 61 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f  a default size o
9170: 66 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  f 4 bytes. */.  
9180: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
9190: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
91a0: 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a  OB;.    pCol->sz
91b0: 45 73 74 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  Est = 1;.#ifdef 
91c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
91d0: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
91e0: 20 20 20 20 69 66 28 20 34 3e 3d 73 71 6c 69 74      if( 4>=sqlit
91f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
9200: 7a 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20  zSorterRef ){.  
9210: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
9220: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53 4f  gs |= COLFLAG_SO
9230: 52 54 45 52 52 45 46 3b 0a 20 20 20 20 7d 0a 23  RTERREF;.    }.#
9240: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
9250: 20 20 20 7a 54 79 70 65 20 3d 20 7a 20 2b 20 73     zType = z + s
9260: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
9270: 29 20 2b 20 31 3b 0a 20 20 20 20 6d 65 6d 63 70  ) + 1;.    memcp
9280: 79 28 7a 54 79 70 65 2c 20 70 54 79 70 65 2d 3e  y(zType, pType->
9290: 7a 2c 20 70 54 79 70 65 2d 3e 6e 29 3b 0a 20 20  z, pType->n);.  
92a0: 20 20 7a 54 79 70 65 5b 70 54 79 70 65 2d 3e 6e    zType[pType->n
92b0: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
92c0: 65 33 44 65 71 75 6f 74 65 28 7a 54 79 70 65 29  e3Dequote(zType)
92d0: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  ;.    pCol->affi
92e0: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66  nity = sqlite3Af
92f0: 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65  finityType(zType
9300: 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 70 43 6f  , pCol);.    pCo
9310: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
9320: 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a  OLFLAG_HASTYPE;.
9330: 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b    }.  p->nCol++;
9340: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74  .  pParse->const
9350: 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b  raintName.n = 0;
9360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
9370: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
9380: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
9390: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
93a0: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
93b0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
93c0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e  statement.  A "N
93d0: 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
93e0: 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  int has.** been 
93f0: 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  seen on a column
9400: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
9410: 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c  sets the notNull
9420: 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20   flag on.** the 
9430: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
9440: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
9450: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
9460: 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50  ite3AddNotNull(P
9470: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
9480: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
9490: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
94a0: 20 2a 70 43 6f 6c 3b 0a 20 20 70 20 3d 20 70 50   *pCol;.  p = pP
94b0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
94c0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e  .  if( p==0 || N
94d0: 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20  EVER(p->nCol<1) 
94e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
94f0: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
9500: 43 6f 6c 2d 31 5d 3b 0a 20 20 70 43 6f 6c 2d 3e  Col-1];.  pCol->
9510: 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e  notNull = (u8)on
9520: 45 72 72 6f 72 3b 0a 20 20 70 2d 3e 74 61 62 46  Error;.  p->tabF
9530: 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 4e 6f  lags |= TF_HasNo
9540: 74 4e 75 6c 6c 3b 0a 0a 20 20 2f 2a 20 53 65 74  tNull;..  /* Set
9550: 20 74 68 65 20 75 6e 69 71 4e 6f 74 4e 75 6c 6c   the uniqNotNull
9560: 20 66 6c 61 67 20 6f 6e 20 61 6e 79 20 55 4e 49   flag on any UNI
9570: 51 55 45 20 6f 72 20 50 4b 20 69 6e 64 65 78 65  QUE or PK indexe
9580: 73 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65  s already create
9590: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 63  d.  ** on this c
95a0: 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  olumn.  */.  if(
95b0: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
95c0: 26 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45  & COLFLAG_UNIQUE
95d0: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
95e0: 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
95f0: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
9600: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
9610: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
9620: 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  rt( pIdx->nKeyCo
9630: 6c 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e  l==1 && pIdx->on
9640: 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
9650: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
9660: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 70  ->aiColumn[0]==p
9670: 2d 3e 6e 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20  ->nCol-1 ){.    
9680: 20 20 20 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f      pIdx->uniqNo
9690: 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20  tNull = 1;.     
96a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
96b0: 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63  /*.** Scan the c
96c0: 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20  olumn type name 
96d0: 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54  zType (length nT
96e0: 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ype) and return 
96f0: 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  the.** associate
9700: 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e  d affinity type.
9710: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9720: 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d  ine does a case-
9730: 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72  independent sear
9740: 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20  ch of zType for 
9750: 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e  the .** substrin
9760: 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  gs in the follow
9770: 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e  ing table. If on
9780: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
9790: 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c  ngs is.** found,
97a0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
97b0: 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72  ng affinity is r
97c0: 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70  eturned. If zTyp
97d0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f  e contains.** mo
97e0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74  re than one of t
97f0: 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65  he substrings, e
9800: 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68  ntries toward th
9810: 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65  e top of .** the
9820: 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f   table take prio
9830: 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c  rity. For exampl
9840: 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27  e, if zType is '
9850: 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51  BLOBINT', .** SQ
9860: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
9870: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
9880: 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20  .** Substring   
9890: 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20    | Affinity.** 
98a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98c0: 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20  .** 'INT'       
98d0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49    | SQLITE_AFF_I
98e0: 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27  NTEGER.** 'CHAR'
98f0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
9900: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c  _AFF_TEXT.** 'CL
9910: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
9920: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
9930: 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20  'TEXT'        | 
9940: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
9950: 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20  ** 'BLOB'       
9960: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   | SQLITE_AFF_BL
9970: 4f 42 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20  OB.** 'REAL'    
9980: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
9990: 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20  _REAL.** 'FLOA' 
99a0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
99b0: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55  AFF_REAL.** 'DOU
99c0: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
99d0: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a  TE_AFF_REAL.**.*
99e0: 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
99f0: 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74   substrings in t
9a00: 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61  he above table a
9a10: 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c  re found,.** SQL
9a20: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9a30: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
9a40: 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69  char sqlite3Affi
9a50: 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63  nityType(const c
9a60: 68 61 72 20 2a 7a 49 6e 2c 20 43 6f 6c 75 6d 6e  har *zIn, Column
9a70: 20 2a 70 43 6f 6c 29 7b 0a 20 20 75 33 32 20 68   *pCol){.  u32 h
9a80: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66   = 0;.  char aff
9a90: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55   = SQLITE_AFF_NU
9aa0: 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63  MERIC;.  const c
9ab0: 68 61 72 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a  har *zChar = 0;.
9ac0: 0a 20 20 61 73 73 65 72 74 28 20 7a 49 6e 21 3d  .  assert( zIn!=
9ad0: 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49  0 );.  while( zI
9ae0: 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20  n[0] ){.    h = 
9af0: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
9b00: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a  UpperToLower[(*z
9b10: 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a  In)&0xff];.    z
9b20: 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d  In++;.    if( h=
9b30: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27  =(('c'<<24)+('h'
9b40: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
9b50: 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  r') ){          
9b60: 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20     /* CHAR */.  
9b70: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9b80: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 20  _AFF_TEXT;.     
9b90: 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20   zChar = zIn;.  
9ba0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
9bb0: 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('c'<<24)+('l'<<
9bc0: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
9bd0: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c  ) ){       /* CL
9be0: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  OB */.      aff 
9bf0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
9c00: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
9c10: 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28   h==(('t'<<24)+(
9c20: 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38  'e'<<16)+('x'<<8
9c30: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20  )+'t') ){       
9c40: 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20  /* TEXT */.     
9c50: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9c60: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
9c70: 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c  e if( h==(('b'<<
9c80: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
9c90: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  o'<<8)+'b')     
9ca0: 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a       /* BLOB */.
9cb0: 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d          && (aff=
9cc0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
9cd0: 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  RIC || aff==SQLI
9ce0: 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a  TE_AFF_REAL) ){.
9cf0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9d00: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
9d10: 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27     if( zIn[0]=='
9d20: 28 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e  (' ) zChar = zIn
9d30: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
9d40: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
9d50: 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69  OINT.    }else i
9d60: 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29  f( h==(('r'<<24)
9d70: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c  +('e'<<16)+('a'<
9d80: 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20  <8)+'l')        
9d90: 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20    /* REAL */.   
9da0: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
9db0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9dc0: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
9dd0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
9de0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9df0: 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('f'<<24)+('l'
9e00: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
9e10: 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a')          /* 
9e20: 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20  FLOA */.        
9e30: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
9e40: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
9e50: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9e60: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
9e70: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64  else if( h==(('d
9e80: 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29  '<<24)+('o'<<16)
9e90: 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20  +('u'<<8)+'b')  
9ea0: 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20          /* DOUB 
9eb0: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
9ec0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
9ed0: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
9ee0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9ef0: 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  REAL;.#endif.   
9f00: 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78   }else if( (h&0x
9f10: 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27  00FFFFFF)==(('i'
9f20: 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27  <<16)+('n'<<8)+'
9f30: 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54  t') ){    /* INT
9f40: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
9f50: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
9f60: 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ER;.      break;
9f70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9f80: 20 49 66 20 70 43 6f 6c 20 69 73 20 6e 6f 74 20   If pCol is not 
9f90: 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65  NULL, store an e
9fa0: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66  stimate of the f
9fb0: 69 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a  ield size.  The.
9fc0: 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73    ** estimate is
9fd0: 20 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20   scaled so that 
9fe0: 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69  the size of an i
9ff0: 6e 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f  nteger is 1.  */
a000: 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20  .  if( pCol ){. 
a010: 20 20 20 69 6e 74 20 76 20 3d 20 30 3b 20 20 20     int v = 0;   
a020: 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20  /* default size 
a030: 69 73 20 61 70 70 72 6f 78 20 34 20 62 79 74 65  is approx 4 byte
a040: 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66  s */.    if( aff
a050: 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  <SQLITE_AFF_NUME
a060: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28  RIC ){.      if(
a070: 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20   zChar ){.      
a080: 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30    while( zChar[0
a090: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ] ){.          i
a0a0: 66 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  f( sqlite3Isdigi
a0b0: 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20  t(zChar[0]) ){. 
a0c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c             /* BL
a0d0: 4f 42 28 6b 29 2c 20 56 41 52 43 48 41 52 28 6b  OB(k), VARCHAR(k
a0e0: 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d  ), CHAR(k) -> r=
a0f0: 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20  (k/4+1) */.     
a100: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65         sqlite3Ge
a110: 74 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76  tInt32(zChar, &v
a120: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
a130: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
a140: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68 61  }.          zCha
a150: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  r++;.        }. 
a160: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a170: 20 20 20 20 76 20 3d 20 31 36 3b 20 20 20 2f 2a      v = 16;   /*
a180: 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f   BLOB, TEXT, CLO
a190: 42 20 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f  B -> r=5  (appro
a1a0: 78 20 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20  x 20 bytes)*/.  
a1b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64      }.    }.#ifd
a1c0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
a1d0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
a1e0: 45 53 0a 20 20 20 20 69 66 28 20 76 3e 3d 73 71  ES.    if( v>=sq
a1f0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
a200: 67 2e 73 7a 53 6f 72 74 65 72 52 65 66 20 29 7b  g.szSorterRef ){
a210: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c  .      pCol->col
a220: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
a230: 5f 53 4f 52 54 45 52 52 45 46 3b 0a 20 20 20 20  _SORTERREF;.    
a240: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 76 20 3d  }.#endif.    v =
a250: 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 69 66   v/4 + 1;.    if
a260: 28 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32 35  ( v>255 ) v = 25
a270: 35 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45  5;.    pCol->szE
a280: 73 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65  st = v;.  }.  re
a290: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
a2a0: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
a2b0: 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  n is the default
a2c0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d   value for the m
a2d0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
a2e0: 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20  ed column.** of 
a2f0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
a300: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
a310: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65  uction..**.** De
a320: 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72  fault value expr
a330: 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20  essions must be 
a340: 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65  constant.  Raise
a350: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66   an exception if
a360: 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20   this.** is not 
a370: 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  the case..**.** 
a380: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a390: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
a3a0: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
a3b0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
a3c0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
a3d0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
a3e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a3f0: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
a400: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a410: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
a420: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
a430: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
a440: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a450: 54 68 65 20 70 61 72 73 65 64 20 65 78 70 72 65  The parsed expre
a460: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 64 65 66  ssion of the def
a470: 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20  ault value */.  
a480: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61  const char *zSta
a490: 72 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 61 72  rt,      /* Star
a4a0: 74 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  t of the default
a4b0: 20 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 20   value text */. 
a4c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e   const char *zEn
a4d0: 64 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  d         /* Fir
a4e0: 73 74 20 63 68 61 72 61 63 74 65 72 20 70 61 73  st character pas
a4f0: 74 20 65 6e 64 20 6f 66 20 64 65 66 61 75 74 20  t end of defaut 
a500: 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 29 7b  value text */.){
a510: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43  .  Table *p;.  C
a520: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73  olumn *pCol;.  s
a530: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
a540: 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70  rse->db;.  p = p
a550: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
a560: 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a  ;.  if( p!=0 ){.
a570: 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e      pCol = &(p->
a580: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29  aCol[p->nCol-1])
a590: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
a5a0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
a5b0: 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70 72  OrFunction(pExpr
a5c0: 2c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29  , db->init.busy)
a5d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a5e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a5f0: 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65  , "default value
a600: 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20   of column [%s] 
a610: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22  is not constant"
a620: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  ,.          pCol
a630: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ->zName);.    }e
a640: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
a650: 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69 73  copy of pExpr is
a660: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
a670: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61   the original, a
a680: 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73  s pExpr contains
a690: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73  .      ** tokens
a6a0: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76   that point to v
a6b0: 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 0a  olatile memory..
a6c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45        */.      E
a6d0: 78 70 72 20 78 3b 0a 20 20 20 20 20 20 73 71 6c  xpr x;.      sql
a6e0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
a6f0: 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b  b, pCol->pDflt);
a700: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 78  .      memset(&x
a710: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b  , 0, sizeof(x));
a720: 0a 20 20 20 20 20 20 78 2e 6f 70 20 3d 20 54 4b  .      x.op = TK
a730: 5f 53 50 41 4e 3b 0a 20 20 20 20 20 20 78 2e 75  _SPAN;.      x.u
a740: 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65  .zToken = sqlite
a750: 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a  3DbSpanDup(db, z
a760: 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20  Start, zEnd);.  
a770: 20 20 20 20 78 2e 70 4c 65 66 74 20 3d 20 70 45      x.pLeft = pE
a780: 78 70 72 3b 0a 20 20 20 20 20 20 78 2e 66 6c 61  xpr;.      x.fla
a790: 67 73 20 3d 20 45 50 5f 53 6b 69 70 3b 0a 20 20  gs = EP_Skip;.  
a7a0: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
a7b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a7c0: 28 64 62 2c 20 26 78 2c 20 45 58 50 52 44 55 50  (db, &x, EXPRDUP
a7d0: 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20  _REDUCE);.      
a7e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a7f0: 2c 20 78 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  , x.u.zToken);. 
a800: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 49     }.  }.  if( I
a810: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
a820: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
a830: 6e 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 70 50  nameExprUnmap(pP
a840: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
a850: 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
a860: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
a870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77  ;.}../*.** Backw
a880: 61 72 64 73 20 43 6f 6d 70 61 74 69 62 69 6c 69  ards Compatibili
a890: 74 79 20 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20  ty Hack:.** .** 
a8a0: 48 69 73 74 6f 72 69 63 61 6c 20 76 65 72 73 69  Historical versi
a8b0: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 63  ons of SQLite ac
a8c0: 63 65 70 74 65 64 20 73 74 72 69 6e 67 73 20 61  cepted strings a
a8d0: 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  s column names i
a8e0: 6e 0a 2a 2a 20 69 6e 64 65 78 65 73 20 61 6e 64  n.** indexes and
a8f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
a900: 73 74 72 61 69 6e 74 73 20 61 6e 64 20 69 6e 20  straints and in 
a910: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
a920: 74 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  ts.  Example:.**
a930: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
a940: 41 42 4c 45 20 78 79 7a 28 61 2c 62 2c 63 2c 64  ABLE xyz(a,b,c,d
a950: 2c 65 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 27  ,e,PRIMARY KEY('
a960: 61 27 29 2c 55 4e 49 51 55 45 28 27 62 27 2c 27  a'),UNIQUE('b','
a970: 63 27 20 43 4f 4c 4c 41 54 45 20 74 72 69 6d 29  c' COLLATE trim)
a980: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 49  .**     CREATE I
a990: 4e 44 45 58 20 61 62 63 20 4f 4e 20 78 79 7a 28  NDEX abc ON xyz(
a9a0: 27 63 27 2c 27 64 27 20 44 45 53 43 2c 27 65 27  'c','d' DESC,'e'
a9b0: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
a9c0: 44 45 53 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69  DESC);.**.** Thi
a9d0: 73 20 69 73 20 67 6f 6f 66 79 2e 20 20 42 75 74  s is goofy.  But
a9e0: 20 74 6f 20 70 72 65 73 65 72 76 65 20 62 61 63   to preserve bac
a9f0: 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
aa00: 6c 69 74 79 20 77 65 20 63 6f 6e 74 69 6e 75 65  lity we continue
aa10: 20 74 6f 0a 2a 2a 20 61 63 63 65 70 74 20 69 74   to.** accept it
aa20: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
aa30: 64 6f 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  does the necessa
aa40: 72 79 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 20 20  ry conversion.  
aa50: 49 74 20 63 6f 6e 76 65 72 74 73 0a 2a 2a 20 74  It converts.** t
aa60: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 67 69  he expression gi
aa70: 76 65 6e 20 69 6e 20 69 74 73 20 61 72 67 75 6d  ven in its argum
aa80: 65 6e 74 20 66 72 6f 6d 20 61 20 54 4b 5f 53 54  ent from a TK_ST
aa90: 52 49 4e 47 20 69 6e 74 6f 20 61 20 54 4b 5f 49  RING into a TK_I
aaa0: 44 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72  D.** if the expr
aab0: 65 73 73 69 6f 6e 20 69 73 20 6a 75 73 74 20 61  ession is just a
aac0: 20 54 4b 5f 53 54 52 49 4e 47 20 77 69 74 68 20   TK_STRING with 
aad0: 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c  an optional COLL
aae0: 41 54 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 49  ATE clause..** I
aaf0: 66 20 74 68 65 20 65 70 78 72 65 73 73 69 6f 6e  f the epxression
ab00: 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   is anything oth
ab10: 65 72 20 74 68 61 6e 20 54 4b 5f 53 54 52 49 4e  er than TK_STRIN
ab20: 47 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  G, the expressio
ab30: 6e 20 69 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  n is.** unchange
ab40: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
ab50: 64 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54  d sqlite3StringT
ab60: 6f 49 64 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  oId(Expr *p){.  
ab70: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54  if( p->op==TK_ST
ab80: 52 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 6f  RING ){.    p->o
ab90: 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c  p = TK_ID;.  }el
aba0: 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  se if( p->op==TK
abb0: 5f 43 4f 4c 4c 41 54 45 20 26 26 20 70 2d 3e 70  _COLLATE && p->p
abc0: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  Left->op==TK_STR
abd0: 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c  ING ){.    p->pL
abe0: 65 66 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b  eft->op = TK_ID;
abf0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
ac00: 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d  signate the PRIM
ac10: 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20  ARY KEY for the 
ac20: 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73  table.  pList is
ac30: 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73   a list of names
ac40: 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   .** of columns 
ac50: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72  that form the pr
ac60: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70  imary key.  If p
ac70: 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  List is NULL, th
ac80: 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  en the.** most r
ac90: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
aca0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
acb0: 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  e is the primary
acc0: 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61   key..**.** A ta
acd0: 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20  ble can have at 
ace0: 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79  most one primary
acf0: 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61   key.  If the ta
ad00: 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a  ble already has.
ad10: 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  ** a primary key
ad20: 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68   (and this is th
ad30: 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79  e second primary
ad40: 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74   key) then creat
ad50: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  e an.** error..*
ad60: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d  *.** If the PRIM
ad70: 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20  ARY KEY is on a 
ad80: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68  single column wh
ad90: 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20  ose datatype is 
ada0: 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e  INTEGER,.** then
adb0: 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20   we will try to 
adc0: 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  use that column 
add0: 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53  as the rowid.  S
ade0: 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b  et the Table.iPK
adf0: 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ey.** field of t
ae00: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
ae10: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  onstruction to b
ae20: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  e the index of t
ae30: 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
ae40: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
ae50: 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69  .  Table.iPKey i
ae60: 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74  s set to -1 if t
ae70: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e  here is.** no IN
ae80: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
ae90: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
aea0: 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  key is not an IN
aeb0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
aec0: 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  Y, then create a
aed0: 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78   unique.** index
aee0: 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e   for the key.  N
aef0: 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  o index is creat
af00: 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50  ed for INTEGER P
af10: 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a  RIMARY KEYs..*/.
af20: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50  void sqlite3AddP
af30: 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72  rimaryKey(.  Par
af40: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
af50: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
af60: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
af70: 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  *pList,  /* List
af80: 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20   of field names 
af90: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
afa0: 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
afb0: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
afc0: 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65  do with a unique
afd0: 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  ness conflict */
afe0: 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20  .  int autoInc, 
aff0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
b000: 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e  the AUTOINCREMEN
b010: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
b020: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  sent */.  int so
b030: 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53  rtOrder     /* S
b040: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20  QLITE_SO_ASC or 
b050: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a  SQLITE_SO_DESC *
b060: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
b070: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
b080: 77 54 61 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d 6e  wTable;.  Column
b090: 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pCol = 0;.  in
b0a0: 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a  t iCol = -1, i;.
b0b0: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69    int nTerm;.  i
b0c0: 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74  f( pTab==0 ) got
b0d0: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
b0e0: 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  it;.  if( pTab->
b0f0: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61  tabFlags & TF_Ha
b100: 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20  sPrimaryKey ){. 
b110: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
b120: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
b130: 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20    "table \"%s\" 
b140: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
b150: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
b160: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
b170: 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b    goto primary_k
b180: 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70  ey_exit;.  }.  p
b190: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
b1a0: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
b1b0: 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  y;.  if( pList==
b1c0: 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  0 ){.    iCol = 
b1d0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a  pTab->nCol - 1;.
b1e0: 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62      pCol = &pTab
b1f0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  ->aCol[iCol];.  
b200: 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
b210: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d   |= COLFLAG_PRIM
b220: 4b 45 59 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d  KEY;.    nTerm =
b230: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
b240: 20 6e 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e   nTerm = pList->
b250: 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
b260: 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b  =0; i<nTerm; i++
b270: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
b280: 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  CExpr = sqlite3E
b290: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
b2a0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
b2b0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
b2c0: 20 70 43 45 78 70 72 21 3d 30 20 29 3b 0a 20 20   pCExpr!=0 );.  
b2d0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e      sqlite3Strin
b2e0: 67 54 6f 49 64 28 70 43 45 78 70 72 29 3b 0a 20  gToId(pCExpr);. 
b2f0: 20 20 20 20 20 69 66 28 20 70 43 45 78 70 72 2d       if( pCExpr-
b300: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
b310: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
b320: 20 2a 7a 43 4e 61 6d 65 20 3d 20 70 43 45 78 70   *zCName = pCExp
b330: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
b340: 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
b350: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
b360: 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
b370: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
b380: 53 74 72 49 43 6d 70 28 7a 43 4e 61 6d 65 2c 20  StrICmp(zCName, 
b390: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
b3a0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
b3b0: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
b3c0: 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
b3d0: 6c 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l];.            
b3e0: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
b3f0: 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  = COLFLAG_PRIMKE
b400: 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  Y;.            b
b410: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
b420: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
b430: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
b440: 69 66 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20  if( nTerm==1.   
b450: 26 26 20 70 43 6f 6c 0a 20 20 20 26 26 20 73 71  && pCol.   && sq
b460: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 73 71 6c  lite3StrICmp(sql
b470: 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70  ite3ColumnType(p
b480: 43 6f 6c 2c 22 22 29 2c 20 22 49 4e 54 45 47 45  Col,""), "INTEGE
b490: 52 22 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72  R")==0.   && sor
b4a0: 74 4f 72 64 65 72 21 3d 53 51 4c 49 54 45 5f 53  tOrder!=SQLITE_S
b4b0: 4f 5f 44 45 53 43 0a 20 20 29 7b 0a 20 20 20 20  O_DESC.  ){.    
b4c0: 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
b4d0: 4a 45 43 54 20 26 26 20 70 4c 69 73 74 20 29 7b  JECT && pList ){
b4e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
b4f0: 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70  nameTokenRemap(p
b500: 50 61 72 73 65 2c 20 26 70 54 61 62 2d 3e 69 50  Parse, &pTab->iP
b510: 4b 65 79 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  Key, pList->a[0]
b520: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
b530: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
b540: 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d   iCol;.    pTab-
b550: 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f  >keyConf = (u8)o
b560: 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65  nError;.    asse
b570: 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c  rt( autoInc==0 |
b580: 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a  | autoInc==1 );.
b590: 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
b5a0: 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46  gs |= autoInc*TF
b5b0: 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a  _Autoincrement;.
b5c0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 20      if( pList ) 
b5d0: 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f  pParse->iPkSortO
b5e0: 72 64 65 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  rder = pList->a[
b5f0: 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  0].sortOrder;.  
b600: 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e  }else if( autoIn
b610: 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  c ){.#ifndef SQL
b620: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
b630: 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74  REMENT.    sqlit
b640: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b650: 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e  e, "AUTOINCREMEN
b660: 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65  T is only allowe
b670: 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20  d on an ".      
b680: 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52   "INTEGER PRIMAR
b690: 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a  Y KEY");.#endif.
b6a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
b6b0: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
b6c0: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
b6d0: 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c   pList, onError,
b6e0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
b6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
b700: 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20  , sortOrder, 0, 
b710: 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50  SQLITE_IDXTYPE_P
b720: 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20 20  RIMARYKEY);.    
b730: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pList = 0;.  }..
b740: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
b750: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
b760: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
b770: 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  ->db, pList);.  
b780: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
b790: 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b   Add a new CHECK
b7a0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74   constraint to t
b7b0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
b7c0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
b7d0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
b7e0: 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f  qlite3AddCheckCo
b7f0: 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
b800: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
b810: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
b820: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65   */.  Expr *pChe
b830: 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63  ckExpr  /* The c
b840: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20  heck expression 
b850: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
b860: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
b870: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
b880: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
b890: 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
b8a0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
b8b0: 20 69 66 28 20 70 54 61 62 20 26 26 20 21 49 4e   if( pTab && !IN
b8c0: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 0a 20 20  _DECLARE_VTAB.  
b8d0: 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65   && !sqlite3Btre
b8e0: 65 49 73 52 65 61 64 6f 6e 6c 79 28 64 62 2d 3e  eIsReadonly(db->
b8f0: 61 44 62 5b 64 62 2d 3e 69 6e 69 74 2e 69 44 62  aDb[db->init.iDb
b900: 5d 2e 70 42 74 29 0a 20 20 29 7b 0a 20 20 20 20  ].pBt).  ){.    
b910: 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73  pTab->pCheck = s
b920: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
b930: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 54 61  pend(pParse, pTa
b940: 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63  b->pCheck, pChec
b950: 6b 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  kExpr);.    if( 
b960: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
b970: 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20  ntName.n ){.    
b980: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
b990: 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
b9a0: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26   pTab->pCheck, &
b9b0: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
b9c0: 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20  ntName, 1);.    
b9d0: 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
b9e0: 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
b9f0: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
ba00: 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b 45 78 70  e->db, pCheckExp
ba10: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
ba20: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
ba30: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  on function of t
ba40: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
ba50: 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f   parsed table co
ba60: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43  lumn.** to the C
ba70: 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f  ollSeq given..*/
ba80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
ba90: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
baa0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
bab0: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62   *pToken){.  Tab
bac0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
bad0: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20    char *zColl;  
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
baf0: 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20  equoted name of 
bb00: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
bb10: 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ce */.  sqlite3 
bb20: 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  *db;..  if( (p =
bb30: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
bb40: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
bb50: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
bb60: 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
bb70: 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73  >db;.  zColl = s
bb80: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
bb90: 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
bba0: 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20  .  if( !zColl ) 
bbb0: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73  return;..  if( s
bbc0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
bbd0: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
bbe0: 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  l) ){.    Index 
bbf0: 2a 70 49 64 78 3b 0a 20 20 20 20 73 71 6c 69 74  *pIdx;.    sqlit
bc00: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
bc10: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a  aCol[i].zColl);.
bc20: 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a      p->aCol[i].z
bc30: 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20  Coll = zColl;.  
bc40: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
bc50: 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65  olumn is declare
bc60: 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49  d as "<name> PRI
bc70: 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45  MARY KEY COLLATE
bc80: 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a   <type>",.    **
bc90: 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d   then an index m
bca0: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65  ay have been cre
bcb0: 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c  ated on this col
bcc0: 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20  umn before the. 
bcd0: 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20     ** collation 
bce0: 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20  type was added. 
bcf0: 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20  Correct this if 
bd00: 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  it is the case..
bd10: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
bd20: 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70  Idx=p->pIndex; p
bd30: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
bd40: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
bd50: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79  sert( pIdx->nKey
bd60: 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Col==1 );.      
bd70: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
bd80: 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20  mn[0]==i ){.    
bd90: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
bda0: 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d  [0] = p->aCol[i]
bdb0: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  .zColl;.      }.
bdc0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
bdd0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
bde0: 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, zColl);.  }
bdf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
be00: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
be10: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
be20: 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62  quence for datab
be30: 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a  ase native text.
be40: 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e  ** encoding iden
be50: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 74  tified by the st
be60: 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67  ring zName, leng
be70: 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  th nName..**.** 
be80: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
be90: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
bea0: 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  nce is not avail
beb0: 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61  able, or not ava
bec0: 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65  ilable.** in the
bed0: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
bee0: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63   encoding, the c
bef0: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
bf00: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a   is invoked to.*
bf10: 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49 66  * request it. If
bf20: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
bf30: 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20  actory does not 
bf40: 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73 65  supply such a se
bf50: 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74  quence,.** and t
bf60: 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20 61  he sequence is a
bf70: 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74  vailable in anot
bf80: 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  her text encodin
bf90: 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a  g, then that is.
bfa0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  ** returned inst
bfb0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ead..**.** If no
bfc0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
bfd0: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
bfe0: 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61  tions sequence a
bff0: 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  re available, or
c000: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f  .** another erro
c010: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
c020: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
c030: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
c040: 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
c050: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pParse..**.** Th
c060: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
c070: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
c080: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
c090: 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69  q().  This routi
c0a0: 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68  ne.** invokes th
c0b0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
c0c0: 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ory if the named
c0d0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f   collation canno
c0e0: 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e  t be found.** an
c0f0: 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65  d generates an e
c100: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a  rror message..**
c110: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
c120: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
c130: 28 29 2c 20 73 71 6c 69 74 65 33 47 65 74 43 6f  (), sqlite3GetCo
c140: 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53  llSeq().*/.CollS
c150: 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  eq *sqlite3Locat
c160: 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  eCollSeq(Parse *
c170: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
c180: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71  ar *zName){.  sq
c190: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c1a0: 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63  se->db;.  u8 enc
c1b0: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38   = ENC(db);.  u8
c1c0: 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e   initbusy = db->
c1d0: 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c  init.busy;.  Col
c1e0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20  lSeq *pColl;..  
c1f0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
c200: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65  indCollSeq(db, e
c210: 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62  nc, zName, initb
c220: 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69  usy);.  if( !ini
c230: 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c  tbusy && (!pColl
c240: 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70   || !pColl->xCmp
c250: 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  ) ){.    pColl =
c260: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
c270: 65 71 28 70 50 61 72 73 65 2c 20 65 6e 63 2c 20  eq(pParse, enc, 
c280: 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20  pColl, zName);. 
c290: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f   }..  return pCo
c2a0: 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  ll;.}.../*.** Ge
c2b0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
c2c0: 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20   will increment 
c2d0: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
c2e0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68  e..**.** The sch
c2f0: 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73  ema cookie is us
c300: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
c310: 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20  when the schema 
c320: 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  for the.** datab
c330: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66  ase changes.  Af
c340: 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20  ter each schema 
c350: 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b  change, the cook
c360: 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e  ie value.** chan
c370: 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f  ges.  When a pro
c380: 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73  cess first reads
c390: 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72   the schema it r
c3a0: 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f  ecords the.** co
c3b0: 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65  okie.  Thereafte
c3c0: 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67  r, whenever it g
c3d0: 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  oes to access th
c3e0: 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69  e database,.** i
c3f0: 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f  t checks the coo
c400: 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  kie to make sure
c410: 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20   the schema has 
c420: 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73  not changed.** s
c430: 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74  ince it was last
c440: 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
c450: 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f  s plan is not co
c460: 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d  mpletely bullet-
c470: 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f  proof.  It is po
c480: 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68  ssible for.** th
c490: 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e  e schema to chan
c4a0: 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ge multiple time
c4b0: 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f  s and for the co
c4c0: 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65  okie to be.** se
c4d0: 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20  t back to prior 
c4e0: 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65  value.  But sche
c4f0: 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69  ma changes are i
c500: 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64  nfrequent.** and
c510: 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
c520: 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20   of hitting the 
c530: 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75  same cookie valu
c540: 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63  e is only.** 1 c
c550: 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20  hance in 2^32.  
c560: 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e  So we're safe en
c570: 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c  ough..**.** IMPL
c580: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
c590: 2d 33 34 32 33 30 2d 35 36 30 34 39 20 53 51 4c  -34230-56049 SQL
c5a0: 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ite automaticall
c5b0: 79 20 69 6e 63 72 65 6d 65 6e 74 73 0a 2a 2a 20  y increments.** 
c5c0: 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69  the schema-versi
c5d0: 6f 6e 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  on whenever the 
c5e0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 2e 0a  schema changes..
c5f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
c600: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72 73  hangeCookie(Pars
c610: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
c620: 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db){.  sqlite3 *
c630: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
c640: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
c650: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
c660: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
c670: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
c680: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 73 71   iDb, 0) );.  sq
c690: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
c6a0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
c6b0: 20 69 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45   iDb, BTREE_SCHE
c6c0: 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 0a 20 20 20  MA_VERSION, .   
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6e0: 28 69 6e 74 29 28 31 2b 28 75 6e 73 69 67 6e 65  (int)(1+(unsigne
c6f0: 64 29 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  d)db->aDb[iDb].p
c700: 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
c710: 6f 6f 6b 69 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ookie));.}../*.*
c720: 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75  * Measure the nu
c730: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
c740: 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74  rs needed to out
c750: 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  put the given.**
c760: 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68   identifier.  Th
c770: 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
c780: 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71  d includes any q
c790: 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75  uotes used.** bu
c7a0: 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75  t does not inclu
c7b0: 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d  de the null term
c7c0: 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  inator..**.** Th
c7d0: 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f  e estimate is co
c7e0: 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49 74 20  nservative.  It 
c7f0: 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20  might be larger 
c800: 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20  that what is.** 
c810: 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a  really needed..*
c820: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65  /.static int ide
c830: 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63  ntLength(const c
c840: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e  har *z){.  int n
c850: 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b  ;.  for(n=0; *z;
c860: 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20   n++, z++){.    
c870: 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e  if( *z=='"' ){ n
c880: 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75  ++; }.  }.  retu
c890: 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a  rn n + 2;.}../*.
c8a0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72  ** The first par
c8b0: 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
c8c0: 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70 75 74  ter to an output
c8d0: 20 62 75 66 66 65 72 2e 20 54 68 65 20 73 65 63   buffer. The sec
c8e0: 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ond .** paramete
c8f0: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
c900: 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61  o an integer tha
c910: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f  t contains the o
c920: 66 66 73 65 74 20 61 74 0a 2a 2a 20 77 68 69 63  ffset at.** whic
c930: 68 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20  h to write into 
c940: 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
c950: 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
c960: 20 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e   copies the.** n
c970: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
c980: 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f 20  ring pointed to 
c990: 62 79 20 74 68 65 20 74 68 69 72 64 20 70 61 72  by the third par
c9a0: 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65 64 49  ameter, zSignedI
c9b0: 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20  dent,.** to the 
c9c0: 73 70 65 63 69 66 69 65 64 20 6f 66 66 73 65 74  specified offset
c9d0: 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 61   in the buffer a
c9e0: 6e 64 20 75 70 64 61 74 65 73 20 2a 70 49 64 78  nd updates *pIdx
c9f0: 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20   to refer.** to 
ca00: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 61  the first byte a
ca10: 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 62 79  fter the last by
ca20: 74 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72  te written befor
ca30: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20  e returning..** 
ca40: 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69 6e  .** If the strin
ca50: 67 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 20 63  g zSignedIdent c
ca60: 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
ca70: 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69   of alpha-numeri
ca80: 63 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2c  c.** characters,
ca90: 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
caa0: 77 69 74 68 20 61 20 64 69 67 69 74 20 61 6e 64  with a digit and
cab0: 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b   is not an SQL k
cac0: 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20  eyword,.** then 
cad0: 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  it is copied to 
cae0: 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
caf0: 72 20 65 78 61 63 74 6c 79 20 61 73 20 69 74 20  r exactly as it 
cb00: 69 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  is. Otherwise,.*
cb10: 2a 20 69 74 20 69 73 20 71 75 6f 74 65 64 20 75  * it is quoted u
cb20: 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74  sing double-quot
cb30: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
cb40: 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72  id identPut(char
cb50: 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20   *z, int *pIdx, 
cb60: 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65  char *zSignedIde
cb70: 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  nt){.  unsigned 
cb80: 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28  char *zIdent = (
cb90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
cba0: 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69  SignedIdent;.  i
cbb0: 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f  nt i, j, needQuo
cbc0: 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b  te;.  i = *pIdx;
cbd0: 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ..  for(j=0; zId
cbe0: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
cbf0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73    if( !sqlite3Is
cc00: 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29  alnum(zIdent[j])
cc10: 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27   && zIdent[j]!='
cc20: 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  _' ) break;.  }.
cc30: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 73 71    needQuote = sq
cc40: 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 49 64  lite3Isdigit(zId
cc50: 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20  ent[0]).        
cc60: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65      || sqlite3Ke
cc70: 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74  ywordCode(zIdent
cc80: 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20 20 20 20  , j)!=TK_ID.    
cc90: 20 20 20 20 20 20 20 20 7c 7c 20 7a 49 64 65 6e          || zIden
cca0: 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20 20 20 20  t[j]!=0.        
ccb0: 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20 20      || j==0;..  
ccc0: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
ccd0: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
cce0: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
ccf0: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b  j]; j++){.    z[
cd00: 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d  i++] = zIdent[j]
cd10: 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74  ;.    if( zIdent
cd20: 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b  [j]=='"' ) z[i++
cd30: 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69  ] = '"';.  }.  i
cd40: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
cd50: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a  [i++] = '"';.  z
cd60: 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78  [i] = 0;.  *pIdx
cd70: 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = i;.}../*.** G
cd80: 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45  enerate a CREATE
cd90: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
cda0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
cdb0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61   the given.** ta
cdc0: 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20  ble.  Memory to 
cdd0: 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66  hold the text of
cde0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
cdf0: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
ce00: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
ce10: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
ce20: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
ce30: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
ce40: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65  static char *cre
ce50: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c  ateTableStmt(sql
ce60: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
ce70: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  *p){.  int i, k,
ce80: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d   n;.  char *zStm
ce90: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c  t;.  char *zSep,
cea0: 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a   *zSep2, *zEnd;.
ceb0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
cec0: 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70    n = 0;.  for(p
ced0: 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69  Col = p->aCol, i
cee0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
cef0: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
cf00: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
cf10: 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b  h(pCol->zName) +
cf20: 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69   5;.  }.  n += i
cf30: 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e  dentLength(p->zN
cf40: 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30  ame);.  if( n<50
cf50: 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20   ){ .    zSep = 
cf60: 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20  "";.    zSep2 = 
cf70: 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20  ",";.    zEnd = 
cf80: 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ")";.  }else{.  
cf90: 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b    zSep = "\n  ";
cfa0: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c  .    zSep2 = ",\
cfb0: 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d  n  ";.    zEnd =
cfc0: 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20   "\n)";.  }.  n 
cfd0: 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f  += 35 + 6*p->nCo
cfe0: 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c  l;.  zStmt = sql
cff0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
d000: 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74  0, n);.  if( zSt
d010: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  mt==0 ){.    sql
d020: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
d030: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
d040: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
d050: 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c  printf(n, zStmt,
d060: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22   "CREATE TABLE "
d070: 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65 33  );.  k = sqlite3
d080: 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b  Strlen30(zStmt);
d090: 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d  .  identPut(zStm
d0a0: 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29  t, &k, p->zName)
d0b0: 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d  ;.  zStmt[k++] =
d0c0: 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   '(';.  for(pCol
d0d0: 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69  =p->aCol, i=0; i
d0e0: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
d0f0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74  Col++){.    stat
d100: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  ic const char * 
d110: 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d  const azType[] =
d120: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51   {.        /* SQ
d130: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 20 20  LITE_AFF_BLOB   
d140: 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20 20 20 20   */ "",.        
d150: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  /* SQLITE_AFF_TE
d160: 58 54 20 20 20 20 2a 2f 20 22 20 54 45 58 54 22  XT    */ " TEXT"
d170: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
d180: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
d190: 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20  */ " NUM",.     
d1a0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
d1b0: 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49 4e  _INTEGER */ " IN
d1c0: 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  T",.        /* S
d1d0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20  QLITE_AFF_REAL  
d1e0: 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20 20    */ " REAL".   
d1f0: 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b   };.    int len;
d200: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
d210: 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c  *zType;..    sql
d220: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
d230: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53  k, &zStmt[k], zS
d240: 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71  ep);.    k += sq
d250: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a  lite3Strlen30(&z
d260: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
d270: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
d280: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
d290: 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  &k, pCol->zName)
d2a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
d2b0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c  ol->affinity-SQL
d2c0: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3e 3d 20  ITE_AFF_BLOB >= 
d2d0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
d2e0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
d2f0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
d300: 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a 54 79  < ArraySize(azTy
d310: 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63  pe) );.    testc
d320: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
d330: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
d340: 42 4c 4f 42 20 29 3b 0a 20 20 20 20 74 65 73 74  BLOB );.    test
d350: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
d360: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
d370: 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65 73  _TEXT );.    tes
d380: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
d390: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
d3a0: 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20  F_NUMERIC );.   
d3b0: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
d3c0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
d3d0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
d3e0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
d3f0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
d400: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29  QLITE_AFF_REAL )
d410: 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70 65  ;.    .    zType
d420: 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e   = azType[pCol->
d430: 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49 54  affinity - SQLIT
d440: 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b 0a 20 20 20  E_AFF_BLOB];.   
d450: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   len = sqlite3St
d460: 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20  rlen30(zType);. 
d470: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
d480: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
d490: 45 5f 41 46 46 5f 42 4c 4f 42 20 0a 20 20 20 20  E_AFF_BLOB .    
d4a0: 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d          || pCol-
d4b0: 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74  >affinity==sqlit
d4c0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
d4d0: 54 79 70 65 2c 20 30 29 20 29 3b 0a 20 20 20 20  Type, 0) );.    
d4e0: 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  memcpy(&zStmt[k]
d4f0: 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20  , zType, len);. 
d500: 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20     k += len;.   
d510: 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b   assert( k<=n );
d520: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
d530: 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53  nprintf(n-k, &zS
d540: 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45  tmt[k], "%s", zE
d550: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
d560: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  tmt;.}../*.** Re
d570: 73 69 7a 65 20 61 6e 20 49 6e 64 65 78 20 6f 62  size an Index ob
d580: 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20 4e 20 63  ject to hold N c
d590: 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e 20 20 52  olumns total.  R
d5a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
d5b0: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  ** on success an
d5c0: 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  d SQLITE_NOMEM o
d5d0: 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a  n an OOM error..
d5e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
d5f0: 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  sizeIndexObject(
d600: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64  sqlite3 *db, Ind
d610: 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 4e 29  ex *pIdx, int N)
d620: 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61  {.  char *zExtra
d630: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
d640: 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
d650: 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72 6e 20 53  mn>=N ) return S
d660: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
d670: 72 74 28 20 70 49 64 78 2d 3e 69 73 52 65 73 69  rt( pIdx->isResi
d680: 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 42 79 74  zed==0 );.  nByt
d690: 65 20 3d 20 28 73 69 7a 65 6f 66 28 63 68 61 72  e = (sizeof(char
d6a0: 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69 31 36 29  *) + sizeof(i16)
d6b0: 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45 78 74 72   + 1)*N;.  zExtr
d6c0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
d6d0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
d6e0: 65 29 3b 0a 20 20 69 66 28 20 7a 45 78 74 72 61  e);.  if( zExtra
d6f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
d700: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
d710: 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c    memcpy(zExtra,
d720: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73   pIdx->azColl, s
d730: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 49 64  izeof(char*)*pId
d740: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70  x->nColumn);.  p
d750: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63  Idx->azColl = (c
d760: 6f 6e 73 74 20 63 68 61 72 2a 2a 29 7a 45 78 74  onst char**)zExt
d770: 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20  ra;.  zExtra += 
d780: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 4e 3b  sizeof(char*)*N;
d790: 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61  .  memcpy(zExtra
d7a0: 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  , pIdx->aiColumn
d7b0: 2c 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 70 49  , sizeof(i16)*pI
d7c0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  dx->nColumn);.  
d7d0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  pIdx->aiColumn =
d7e0: 20 28 69 31 36 2a 29 7a 45 78 74 72 61 3b 0a 20   (i16*)zExtra;. 
d7f0: 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f   zExtra += sizeo
d800: 66 28 69 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63  f(i16)*N;.  memc
d810: 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d  py(zExtra, pIdx-
d820: 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 70 49 64  >aSortOrder, pId
d830: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70  x->nColumn);.  p
d840: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  Idx->aSortOrder 
d850: 3d 20 28 75 38 2a 29 7a 45 78 74 72 61 3b 0a 20  = (u8*)zExtra;. 
d860: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d   pIdx->nColumn =
d870: 20 4e 3b 0a 20 20 70 49 64 78 2d 3e 69 73 52 65   N;.  pIdx->isRe
d880: 73 69 7a 65 64 20 3d 20 31 3b 0a 20 20 72 65 74  sized = 1;.  ret
d890: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d8a0: 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  ../*.** Estimate
d8b0: 20 74 68 65 20 74 6f 74 61 6c 20 72 6f 77 20 77   the total row w
d8c0: 69 64 74 68 20 66 6f 72 20 61 20 74 61 62 6c 65  idth for a table
d8d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d8e0: 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69   estimateTableWi
d8f0: 64 74 68 28 54 61 62 6c 65 20 2a 70 54 61 62 29  dth(Table *pTab)
d900: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 54 61  {.  unsigned wTa
d910: 62 6c 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74  ble = 0;.  const
d920: 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c   Column *pTabCol
d930: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
d940: 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70  (i=pTab->nCol, p
d950: 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  TabCol=pTab->aCo
d960: 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 61  l; i>0; i--, pTa
d970: 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77 54 61  bCol++){.    wTa
d980: 62 6c 65 20 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e  ble += pTabCol->
d990: 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28  szEst;.  }.  if(
d9a0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 29   pTab->iPKey<0 )
d9b0: 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 20 70 54 61   wTable++;.  pTa
d9c0: 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71  b->szTabRow = sq
d9d0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 54 61 62  lite3LogEst(wTab
d9e0: 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  le*4);.}../*.** 
d9f0: 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76 65  Estimate the ave
da00: 72 61 67 65 20 73 69 7a 65 20 6f 66 20 61 20 72  rage size of a r
da10: 6f 77 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e  ow for an index.
da20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
da30: 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64  estimateIndexWid
da40: 74 68 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  th(Index *pIdx){
da50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 49 6e 64  .  unsigned wInd
da60: 65 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  ex = 0;.  int i;
da70: 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20  .  const Column 
da80: 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 70 54  *aCol = pIdx->pT
da90: 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f  able->aCol;.  fo
daa0: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
dab0: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
dac0: 20 20 69 31 36 20 78 20 3d 20 70 49 64 78 2d 3e    i16 x = pIdx->
dad0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
dae0: 20 61 73 73 65 72 74 28 20 78 3c 70 49 64 78 2d   assert( x<pIdx-
daf0: 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b  >pTable->nCol );
db00: 0a 20 20 20 20 77 49 6e 64 65 78 20 2b 3d 20 78  .    wIndex += x
db10: 3c 30 20 3f 20 31 20 3a 20 61 43 6f 6c 5b 70 49  <0 ? 1 : aCol[pI
db20: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d  dx->aiColumn[i]]
db30: 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 70 49  .szEst;.  }.  pI
db40: 64 78 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20 73  dx->szIdxRow = s
db50: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 49 6e  qlite3LogEst(wIn
db60: 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65  dex*4);.}../* Re
db70: 74 75 72 6e 20 74 72 75 65 20 69 66 20 76 61 6c  turn true if val
db80: 75 65 20 78 20 69 73 20 66 6f 75 6e 64 20 61 6e  ue x is found an
db90: 79 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e  y of the first n
dba0: 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f 66 20 61  Col entries of a
dbb0: 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63  iCol[].*/.static
dbc0: 20 69 6e 74 20 68 61 73 43 6f 6c 75 6d 6e 28 63   int hasColumn(c
dbd0: 6f 6e 73 74 20 69 31 36 20 2a 61 69 43 6f 6c 2c  onst i16 *aiCol,
dbe0: 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74 20 78   int nCol, int x
dbf0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 43 6f 6c  ){.  while( nCol
dc00: 2d 2d 20 3e 20 30 20 29 20 69 66 28 20 78 3d 3d  -- > 0 ) if( x==
dc10: 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 20 72 65 74  *(aiCol++) ) ret
dc20: 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
dc30: 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 63 6f 6d 70 75  0;.}../* Recompu
dc40: 74 65 20 74 68 65 20 63 6f 6c 4e 6f 74 49 64 78  te the colNotIdx
dc50: 65 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ed field of the 
dc60: 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 63 6f 6c  Index..**.** col
dc70: 4e 6f 74 49 64 78 65 64 20 69 73 20 61 20 62 69  NotIdxed is a bi
dc80: 74 6d 61 73 6b 20 74 68 61 74 20 68 61 73 20 61  tmask that has a
dc90: 20 30 20 62 69 74 20 72 65 70 72 65 73 65 6e 74   0 bit represent
dca0: 69 6e 67 20 65 61 63 68 20 69 6e 64 65 78 65 64  ing each indexed
dcb0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  .** columns that
dcc0: 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65 20   are within the 
dcd0: 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73  first 63 columns
dce0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20   of the table.  
dcf0: 54 68 65 0a 2a 2a 20 68 69 67 68 2d 6f 72 64 65  The.** high-orde
dd00: 72 20 62 69 74 20 6f 66 20 63 6f 6c 4e 6f 74 49  r bit of colNotI
dd10: 64 78 65 64 20 69 73 20 61 6c 77 61 79 73 20 31  dxed is always 1
dd20: 2e 20 20 41 6c 6c 20 75 6e 69 6e 64 65 78 65 64  .  All unindexed
dd30: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74   columns.** of t
dd40: 68 65 20 74 61 62 6c 65 20 68 61 76 65 20 61 20  he table have a 
dd50: 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  1..**.** The col
dd60: 4e 6f 74 49 64 78 65 64 20 6d 61 73 6b 20 69 73  NotIdxed mask is
dd70: 20 41 4e 44 2d 65 64 20 77 69 74 68 20 74 68 65   AND-ed with the
dd80: 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c   SrcList.a[].col
dd90: 55 73 65 64 20 6d 61 73 6b 0a 2a 2a 20 74 6f 20  Used mask.** to 
dda0: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
ddb0: 20 69 6e 64 65 78 20 69 73 20 63 6f 76 65 72 69   index is coveri
ddc0: 6e 67 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ng index..*/.sta
ddd0: 74 69 63 20 76 6f 69 64 20 72 65 63 6f 6d 70 75  tic void recompu
dde0: 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65  teColumnsNotInde
ddf0: 78 65 64 28 49 6e 64 65 78 20 2a 70 49 64 78 29  xed(Index *pIdx)
de00: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20  {.  Bitmask m = 
de10: 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f  0;.  int j;.  fo
de20: 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  r(j=pIdx->nColum
de30: 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b  n-1; j>=0; j--){
de40: 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64  .    int x = pId
de50: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
de60: 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a      if( x>=0 ){.
de70: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
de80: 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  x==BMS-1 );.    
de90: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42    testcase( x==B
dea0: 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66  MS-2 );.      if
deb0: 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d  ( x<BMS-1 ) m |=
dec0: 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20   MASKBIT(x);.   
ded0: 20 7d 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 63   }.  }.  pIdx->c
dee0: 6f 6c 4e 6f 74 49 64 78 65 64 20 3d 20 7e 6d 3b  olNotIdxed = ~m;
def0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78  .  assert( (pIdx
df00: 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 3e 3e 36  ->colNotIdxed>>6
df10: 33 29 3d 3d 31 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  3)==1 );.}../*.*
df20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
df30: 75 6e 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  uns at the end o
df40: 66 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  f parsing a CREA
df50: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
df60: 6e 74 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 61  nt that.** has a
df70: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 63   WITHOUT ROWID c
df80: 6c 61 75 73 65 2e 20 20 54 68 65 20 6a 6f 62 20  lause.  The job 
df90: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
dfa0: 69 73 20 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f  is to convert bo
dfb0: 74 68 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73  th.** internal s
dfc0: 63 68 65 6d 61 20 64 61 74 61 20 73 74 72 75 63  chema data struc
dfd0: 74 75 72 65 73 20 61 6e 64 20 74 68 65 20 67 65  tures and the ge
dfe0: 6e 65 72 61 74 65 64 20 56 44 42 45 20 63 6f 64  nerated VDBE cod
dff0: 65 20 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a  e so that they.*
e000: 2a 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74  * are appropriat
e010: 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20  e for a WITHOUT 
e020: 52 4f 57 49 44 20 74 61 62 6c 65 20 69 6e 73 74  ROWID table inst
e030: 65 61 64 20 6f 66 20 61 20 72 6f 77 69 64 20 74  ead of a rowid t
e040: 61 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73  able..** Changes
e050: 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20   include:.**.** 
e060: 20 20 20 20 28 31 29 20 20 53 65 74 20 61 6c 6c      (1)  Set all
e070: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
e080: 50 52 49 4d 41 52 59 20 4b 45 59 20 73 63 68 65  PRIMARY KEY sche
e090: 6d 61 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20  ma object to be 
e0a0: 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20  NOT NULL..**    
e0b0: 20 28 32 29 20 20 43 6f 6e 76 65 72 74 20 50 33   (2)  Convert P3
e0c0: 20 70 61 72 61 6d 65 74 65 72 20 6f 66 20 74 68   parameter of th
e0d0: 65 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65  e OP_CreateBtree
e0e0: 20 66 72 6f 6d 20 42 54 52 45 45 5f 49 4e 54 4b   from BTREE_INTK
e0f0: 45 59 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  EY .**          
e100: 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b  into BTREE_BLOBK
e110: 45 59 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20 20  EY..**     (3)  
e120: 42 79 70 61 73 73 20 74 68 65 20 63 72 65 61 74  Bypass the creat
e130: 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ion of the sqlit
e140: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65  e_master table e
e150: 6e 74 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  ntry.**         
e160: 20 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59   for the PRIMARY
e170: 20 4b 45 59 20 61 73 20 74 68 65 20 70 72 69 6d   KEY as the prim
e180: 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 69 73  ary key index is
e190: 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20   now.**         
e1a0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
e1b0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
e1c0: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6f 66 20   table entry of 
e1d0: 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66  the table itself
e1e0: 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53 65  ..**     (4)  Se
e1f0: 74 20 74 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d  t the Index.tnum
e200: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
e210: 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  KEY Index object
e220: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
e230: 20 20 20 20 73 63 68 65 6d 61 20 74 6f 20 74 68      schema to th
e240: 65 20 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20  e rootpage from 
e250: 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a  the main table..
e260: 2a 2a 20 20 20 20 20 28 35 29 20 20 41 64 64 20  **     (5)  Add 
e270: 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  all table column
e280: 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59  s to the PRIMARY
e290: 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63   KEY Index objec
e2a0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f  t.**          so
e2b0: 20 74 68 61 74 20 74 68 65 20 50 52 49 4d 41 52   that the PRIMAR
e2c0: 59 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72  Y KEY is a cover
e2d0: 69 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20  ing index.  The 
e2e0: 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20  surplus.**      
e2f0: 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20      columns are 
e300: 70 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e  part of KeyInfo.
e310: 6e 41 6c 6c 46 69 65 6c 64 20 61 6e 64 20 61 72  nAllField and ar
e320: 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a  e not used for.*
e330: 2a 20 20 20 20 20 20 20 20 20 20 73 6f 72 74 69  *          sorti
e340: 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20  ng or lookup or 
e350: 75 6e 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b  uniqueness check
e360: 73 2e 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52  s..**     (6)  R
e370: 65 70 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64  eplace the rowid
e380: 20 74 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74   tail on all aut
e390: 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72  omatically gener
e3a0: 61 74 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20  ated UNIQUE.**  
e3b0: 20 20 20 20 20 20 20 20 69 6e 64 69 63 65 73 20          indices 
e3c0: 77 69 74 68 20 74 68 65 20 50 52 49 4d 41 52 59  with the PRIMARY
e3d0: 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a   KEY columns..**
e3e0: 0a 2a 2a 20 46 6f 72 20 76 69 72 74 75 61 6c 20  .** For virtual 
e3f0: 74 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 28 31 29  tables, only (1)
e400: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a   is performed..*
e410: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
e420: 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f  nvertToWithoutRo
e430: 77 69 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a  widTable(Parse *
e440: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
e450: 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  Tab){.  Index *p
e460: 49 64 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50  Idx;.  Index *pP
e470: 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20  k;.  int nPk;.  
e480: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
e490: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
e4a0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
e4b0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
e4c0: 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 65 76 65 72  ..  /* Mark ever
e4d0: 79 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  y PRIMARY KEY co
e4e0: 6c 75 6d 6e 20 61 73 20 4e 4f 54 20 4e 55 4c 4c  lumn as NOT NULL
e4f0: 20 28 65 78 63 65 70 74 20 66 6f 72 20 69 6d 70   (except for imp
e500: 6f 73 74 65 72 20 74 61 62 6c 65 73 29 0a 20 20  oster tables).  
e510: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
e520: 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65  it.imposterTable
e530: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
e540: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
e550: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
e560: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f  pTab->aCol[i].co
e570: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
e580: 5f 50 52 49 4d 4b 45 59 29 21 3d 30 20 29 7b 0a  _PRIMKEY)!=0 ){.
e590: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
e5a0: 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20  ol[i].notNull = 
e5b0: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  OE_Abort;.      
e5c0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
e5d0: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 50 33  * Convert the P3
e5e0: 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20   operand of the 
e5f0: 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 20 6f  OP_CreateBtree o
e600: 70 63 6f 64 65 20 66 72 6f 6d 20 42 54 52 45 45  pcode from BTREE
e610: 5f 49 4e 54 4b 45 59 0a 20 20 2a 2a 20 69 6e 74  _INTKEY.  ** int
e620: 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 2e  o BTREE_BLOBKEY.
e630: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
e640: 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20 29 7b  se->addrCrTab ){
e650: 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 20 29  .    assert( v )
e660: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e670: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 70 50 61  eChangeP3(v, pPa
e680: 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 2c 20  rse->addrCrTab, 
e690: 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a  BTREE_BLOBKEY);.
e6a0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
e6b0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
e6c0: 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69 66 20   index.  Or, if 
e6d0: 74 68 69 73 20 74 61 62 6c 65 20 77 61 73 20 6f  this table was o
e6e0: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61  riginally.  ** a
e6f0: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
e700: 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 63 72 65  Y KEY table, cre
e710: 61 74 65 20 61 20 6e 65 77 20 50 52 49 4d 41 52  ate a new PRIMAR
e720: 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a 20 20  Y KEY index. .  
e730: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69  */.  if( pTab->i
e740: 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 45  PKey>=0 ){.    E
e750: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  xprList *pList;.
e760: 20 20 20 20 54 6f 6b 65 6e 20 69 70 6b 54 6f 6b      Token ipkTok
e770: 65 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  en;.    sqlite3T
e780: 6f 6b 65 6e 49 6e 69 74 28 26 69 70 6b 54 6f 6b  okenInit(&ipkTok
e790: 65 6e 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  en, pTab->aCol[p
e7a0: 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d  Tab->iPKey].zNam
e7b0: 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  e);.    pList = 
e7c0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
e7d0: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
e7e0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
e7f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
e800: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20  lloc(db, TK_ID, 
e810: 26 69 70 6b 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a  &ipkToken, 0));.
e820: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
e830: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
e840: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  List->a[0].sortO
e850: 72 64 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 69  rder = pParse->i
e860: 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  PkSortOrder;.   
e870: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
e880: 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61 62  >pNewTable==pTab
e890: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   );.    sqlite3C
e8a0: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
e8b0: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73  e, 0, 0, 0, pLis
e8c0: 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66  t, pTab->keyConf
e8d0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
e8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8f0: 20 20 20 20 20 53 51 4c 49 54 45 5f 49 44 58 54       SQLITE_IDXT
e900: 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b  YPE_PRIMARYKEY);
e910: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
e920: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
e930: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
e940: 72 6e 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71  rn;.    pPk = sq
e950: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
e960: 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
e970: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
e980: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
e990: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
e9a0: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
e9b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
e9c0: 50 6b 21 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a  Pk!=0 );..    /*
e9d0: 0a 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 61  .    ** Remove a
e9e0: 6c 6c 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c  ll redundant col
e9f0: 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 50 52  umns from the PR
ea00: 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 20  IMARY KEY.  For 
ea10: 65 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67 65 0a  example, change.
ea20: 20 20 20 20 2a 2a 20 22 50 52 49 4d 41 52 59 20      ** "PRIMARY 
ea30: 4b 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c 62 2c  KEY(a,b,a,b,c,b,
ea40: 63 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73 74 20  c,d)" into just 
ea50: 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62  "PRIMARY KEY(a,b
ea60: 2c 63 2c 64 29 22 2e 20 20 4c 61 74 65 72 0a 20  ,c,d)".  Later. 
ea70: 20 20 20 2a 2a 20 63 6f 64 65 20 61 73 73 75 6d     ** code assum
ea80: 65 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  es the PRIMARY K
ea90: 45 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72  EY contains no r
eaa0: 65 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e 73 2e  epeated columns.
eab0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
eac0: 69 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e 4b  i=j=1; i<pPk->nK
ead0: 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  eyCol; i++){.   
eae0: 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e     if( hasColumn
eaf0: 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  (pPk->aiColumn, 
eb00: 6a 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  j, pPk->aiColumn
eb10: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
eb20: 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 0a  pPk->nColumn--;.
eb30: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
eb40: 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75       pPk->aiColu
eb50: 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e 61  mn[j++] = pPk->a
eb60: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
eb70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
eb80: 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b 0a  k->nKeyCol = j;.
eb90: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
eba0: 6b 21 3d 30 20 29 3b 0a 20 20 70 50 6b 2d 3e 69  k!=0 );.  pPk->i
ebb0: 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20  sCovering = 1;. 
ebc0: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69   if( !db->init.i
ebd0: 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29 20 70  mposterTable ) p
ebe0: 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  Pk->uniqNotNull 
ebf0: 3d 20 31 3b 0a 20 20 6e 50 6b 20 3d 20 70 50 6b  = 1;.  nPk = pPk
ec00: 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f 2a  ->nKeyCol;..  /*
ec10: 20 42 79 70 61 73 73 20 74 68 65 20 63 72 65 61   Bypass the crea
ec20: 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 52 49 4d  tion of the PRIM
ec30: 41 52 59 20 4b 45 59 20 62 74 72 65 65 20 61 6e  ARY KEY btree an
ec40: 64 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  d the sqlite_mas
ec50: 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 65  ter.  ** table e
ec60: 6e 74 72 79 2e 20 54 68 69 73 20 69 73 20 6f 6e  ntry. This is on
ec70: 6c 79 20 72 65 71 75 69 72 65 64 20 69 66 20 63  ly required if c
ec80: 75 72 72 65 6e 74 6c 79 20 67 65 6e 65 72 61 74  urrently generat
ec90: 69 6e 67 20 56 44 42 45 0a 20 20 2a 2a 20 63 6f  ing VDBE.  ** co
eca0: 64 65 20 66 6f 72 20 61 20 43 52 45 41 54 45 20  de for a CREATE 
ecb0: 54 41 42 4c 45 20 28 6e 6f 74 20 77 68 65 6e 20  TABLE (not when 
ecc0: 70 61 72 73 69 6e 67 20 6f 6e 65 20 61 73 20 70  parsing one as p
ecd0: 61 72 74 20 6f 66 20 72 65 61 64 69 6e 67 0a 20  art of reading. 
ece0: 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 73   ** a database s
ecf0: 63 68 65 6d 61 29 2e 20 20 2a 2f 0a 20 20 69 66  chema).  */.  if
ed00: 28 20 76 20 26 26 20 70 50 6b 2d 3e 74 6e 75 6d  ( v && pPk->tnum
ed10: 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
ed20: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
ed30: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
ed40: 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64  3VdbeChangeOpcod
ed50: 65 28 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d 2c 20  e(v, pPk->tnum, 
ed60: 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d 0a 0a 20  OP_Goto);.  }.. 
ed70: 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   /* The root pag
ed80: 65 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  e of the PRIMARY
ed90: 20 4b 45 59 20 69 73 20 74 68 65 20 74 61 62 6c   KEY is the tabl
eda0: 65 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20  e root page */. 
edb0: 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54 61   pPk->tnum = pTa
edc0: 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55  b->tnum;..  /* U
edd0: 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  pdate the in-mem
ede0: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
edf0: 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45  on of all UNIQUE
ee00: 20 69 6e 64 69 63 65 73 20 62 79 20 63 6f 6e 76   indices by conv
ee10: 65 72 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  erting.  ** the 
ee20: 66 69 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75  final rowid colu
ee30: 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d  mn into one or m
ee40: 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ore columns of t
ee50: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  he PRIMARY KEY..
ee60: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d    */.  for(pIdx=
ee70: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
ee80: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
ee90: 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e  Next){.    int n
eea0: 3b 0a 20 20 20 20 69 66 28 20 49 73 50 72 69 6d  ;.    if( IsPrim
eeb0: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
eec0: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
eed0: 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e    for(i=n=0; i<n
eee0: 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Pk; i++){.      
eef0: 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70  if( !hasColumn(p
ef00: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70  Idx->aiColumn, p
ef10: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50  Idx->nKeyCol, pP
ef20: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20  k->aiColumn[i]) 
ef30: 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ) n++;.    }.   
ef40: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
ef50: 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78     /* This index
ef60: 20 69 73 20 61 20 73 75 70 65 72 73 65 74 20 6f   is a superset o
ef70: 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  f the primary ke
ef80: 79 20 2a 2f 0a 20 20 20 20 20 20 70 49 64 78 2d  y */.      pIdx-
ef90: 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d  >nColumn = pIdx-
efa0: 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
efb0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
efc0: 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e      if( resizeIn
efd0: 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 49  dexObject(db, pI
efe0: 64 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  dx, pIdx->nKeyCo
eff0: 6c 2b 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  l+n) ) return;. 
f000: 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49     for(i=0, j=pI
f010: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e  dx->nKeyCol; i<n
f020: 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Pk; i++){.      
f030: 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70  if( !hasColumn(p
f040: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70  Idx->aiColumn, p
f050: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50  Idx->nKeyCol, pP
f060: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20  k->aiColumn[i]) 
f070: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  ){.        pIdx-
f080: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70  >aiColumn[j] = p
f090: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  Pk->aiColumn[i];
f0a0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
f0b0: 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e  zColl[j] = pPk->
f0c0: 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  azColl[i];.     
f0d0: 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     j++;.      }.
f0e0: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
f0f0: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  ( pIdx->nColumn>
f100: 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e  =pIdx->nKeyCol+n
f110: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f120: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a  pIdx->nColumn>=j
f130: 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64   );.  }..  /* Ad
f140: 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75  d all table colu
f150: 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41  mns to the PRIMA
f160: 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a  RY KEY index.  *
f170: 2f 0a 20 20 69 66 28 20 6e 50 6b 3c 70 54 61 62  /.  if( nPk<pTab
f180: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66  ->nCol ){.    if
f190: 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a  ( resizeIndexObj
f1a0: 65 63 74 28 64 62 2c 20 70 50 6b 2c 20 70 54 61  ect(db, pPk, pTa
f1b0: 62 2d 3e 6e 43 6f 6c 29 20 29 20 72 65 74 75 72  b->nCol) ) retur
f1c0: 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  n;.    for(i=0, 
f1d0: 6a 3d 6e 50 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e  j=nPk; i<pTab->n
f1e0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
f1f0: 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28   if( !hasColumn(
f200: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a  pPk->aiColumn, j
f210: 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , i) ){.        
f220: 61 73 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e  assert( j<pPk->n
f230: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20  Column );.      
f240: 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b    pPk->aiColumn[
f250: 6a 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  j] = i;.        
f260: 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d  pPk->azColl[j] =
f270: 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
f280: 59 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a  Y;.        j++;.
f290: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f2a0: 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e    assert( pPk->n
f2b0: 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20  Column==j );.   
f2c0: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
f2d0: 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c 73  Col==j );.  }els
f2e0: 65 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c  e{.    pPk->nCol
f2f0: 75 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  umn = pTab->nCol
f300: 3b 0a 20 20 7d 0a 20 20 72 65 63 6f 6d 70 75 74  ;.  }.  recomput
f310: 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65 78  eColumnsNotIndex
f320: 65 64 28 70 50 6b 29 3b 0a 7d 0a 0a 23 69 66 6e  ed(pPk);.}..#ifn
f330: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f340: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
f350: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
f360: 66 20 7a 4e 61 6d 65 20 69 73 20 61 20 73 68 61  f zName is a sha
f370: 64 6f 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  dow table name i
f380: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61  n the current da
f390: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
f3a0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 7a 4e 61 6d  tion..**.** zNam
f3b0: 65 20 69 73 20 74 65 6d 70 6f 72 61 72 69 6c 79  e is temporarily
f3c0: 20 6d 6f 64 69 66 69 65 64 20 77 68 69 6c 65 20   modified while 
f3d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
f3e0: 72 75 6e 6e 69 6e 67 2c 20 62 75 74 20 69 73 0a  running, but is.
f3f0: 2a 2a 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  ** restored to i
f400: 74 73 20 6f 72 69 67 69 6e 61 6c 20 76 61 6c 75  ts original valu
f410: 65 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20  e prior to this 
f420: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 69 6e  routine returnin
f430: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
f440: 20 69 73 53 68 61 64 6f 77 54 61 62 6c 65 4e 61   isShadowTableNa
f450: 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  me(sqlite3 *db, 
f460: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
f470: 63 68 61 72 20 2a 7a 54 61 69 6c 3b 20 20 20 20  char *zTail;    
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f490: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
f4a0: 6c 61 73 74 20 22 5f 22 20 69 6e 20 7a 4e 61 6d  last "_" in zNam
f4b0: 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
f4c0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
f4d0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 68       /* Table th
f4e0: 61 74 20 7a 4e 61 6d 65 20 69 73 20 61 20 73 68  at zName is a sh
f4f0: 61 64 6f 77 20 6f 66 20 2a 2f 0a 20 20 4d 6f 64  adow of */.  Mod
f500: 75 6c 65 20 2a 70 4d 6f 64 3b 20 20 20 20 20 20  ule *pMod;      
f510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f             /* Mo
f520: 64 75 6c 65 20 66 6f 72 20 74 68 65 20 76 69 72  dule for the vir
f530: 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 0a 20  tual table */.. 
f540: 20 7a 54 61 69 6c 20 3d 20 73 74 72 72 63 68 72   zTail = strrchr
f550: 28 7a 4e 61 6d 65 2c 20 27 5f 27 29 3b 0a 20 20  (zName, '_');.  
f560: 69 66 28 20 7a 54 61 69 6c 3d 3d 30 20 29 20 72  if( zTail==0 ) r
f570: 65 74 75 72 6e 20 30 3b 0a 20 20 2a 7a 54 61 69  eturn 0;.  *zTai
f580: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 20 3d 20  l = 0;.  pTab = 
f590: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
f5a0: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  (db, zName, 0);.
f5b0: 20 20 2a 7a 54 61 69 6c 20 3d 20 27 5f 27 3b 0a    *zTail = '_';.
f5c0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
f5d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
f5e0: 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
f5f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
f600: 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29 73  Mod = (Module*)s
f610: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
f620: 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 70 54 61  db->aModule, pTa
f630: 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30  b->azModuleArg[0
f640: 5d 29 3b 0a 20 20 69 66 28 20 70 4d 6f 64 3d 3d  ]);.  if( pMod==
f650: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
f660: 69 66 28 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c  if( pMod->pModul
f670: 65 2d 3e 69 56 65 72 73 69 6f 6e 3c 33 20 29 20  e->iVersion<3 ) 
f680: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
f690: 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78  pMod->pModule->x
f6a0: 53 68 61 64 6f 77 4e 61 6d 65 3d 3d 30 20 29 20  ShadowName==0 ) 
f6b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
f6c0: 72 6e 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c 65  rn pMod->pModule
f6d0: 2d 3e 78 53 68 61 64 6f 77 4e 61 6d 65 28 7a 54  ->xShadowName(zT
f6e0: 61 69 6c 2b 31 29 3b 0a 7d 0a 23 65 6c 73 65 0a  ail+1);.}.#else.
f6f0: 23 20 64 65 66 69 6e 65 20 69 73 53 68 61 64 6f  # define isShado
f700: 77 54 61 62 6c 65 4e 61 6d 65 28 78 2c 79 29 20  wTableName(x,y) 
f710: 30 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64  0.#endif /* ifnd
f720: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
f730: 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
f740: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
f750: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
f760: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
f770: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
f780: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
f790: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
f7a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
f7b0: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
f7c0: 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
f7d0: 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
f7e0: 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
f7f0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
f800: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
f810: 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
f820: 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
f830: 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
f840: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
f850: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
f860: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
f870: 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73   on disk, unless
f880: 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65  .** this is a te
f890: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
f8a0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
f8b0: 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69  1.  When db->ini
f8c0: 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20  t.busy==1.** it 
f8d0: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
f8e0: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
f8f0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
f900: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
f910: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
f920: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
f930: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
f940: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
f950: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
f960: 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74  nged, so the ent
f970: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
f980: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
f990: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
f9a0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
f9b0: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
f9c0: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
f9d0: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
f9e0: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
f9f0: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
fa00: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
fa10: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
fa20: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
fa30: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
fa40: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
fa50: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
fa60: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
fa70: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
fa80: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
fa90: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
faa0: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
fab0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
fac0: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
fad0: 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  d sqlite3EndTabl
fae0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
faf0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
fb00: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
fb10: 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c  .  Token *pCons,
fb20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
fb30: 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65  e ',' token afte
fb40: 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  r the last colum
fb50: 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b  n defn. */.  Tok
fb60: 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  en *pEnd,       
fb70: 20 20 20 20 20 2f 2a 20 54 68 65 20 27 29 27 20       /* The ')' 
fb80: 62 65 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69  before options i
fb90: 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
fba0: 4c 45 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70  LE */.  u8 tabOp
fbb0: 74 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ts,             
fbc0: 2f 2a 20 45 78 74 72 61 20 74 61 62 6c 65 20 6f  /* Extra table o
fbd0: 70 74 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20  ptions. Usually 
fbe0: 30 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  0. */.  Select *
fbf0: 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20  pSelect         
fc00: 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61  /* Select from a
fc10: 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20   "CREATE ... AS 
fc20: 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20  SELECT" */.){.  
fc30: 54 61 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20  Table *p;       
fc40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
fc50: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
fc60: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
fc70: 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65  arse->db; /* The
fc80: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
fc90: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44  tion */.  int iD
fca0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
fcb0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
fcc0: 69 6e 20 77 68 69 63 68 20 74 68 65 20 74 61 62  in which the tab
fcd0: 6c 65 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e  le lives */.  In
fce0: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
fcf0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d          /* An im
fd00: 70 6c 69 65 64 20 69 6e 64 65 78 20 6f 66 20 74  plied index of t
fd10: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69  he table */..  i
fd20: 66 28 20 70 45 6e 64 3d 3d 30 20 26 26 20 70 53  f( pEnd==0 && pS
fd30: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
fd40: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
fd50: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
fd60: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 70 20 3d  cFailed );.  p =
fd70: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
fd80: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  le;.  if( p==0 )
fd90: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
fda0: 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 69 73  pSelect==0 && is
fdb0: 53 68 61 64 6f 77 54 61 62 6c 65 4e 61 6d 65 28  ShadowTableName(
fdc0: 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 20 29 7b  db, p->zName) ){
fdd0: 0a 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67 73  .    p->tabFlags
fde0: 20 7c 3d 20 54 46 5f 53 68 61 64 6f 77 3b 0a 20   |= TF_Shadow;. 
fdf0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
fe00: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
fe10: 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61   1 it means we a
fe20: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53  re reading the S
fe30: 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20  QL off the.  ** 
fe40: 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20  "sqlite_master" 
fe50: 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  or "sqlite_temp_
fe60: 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e  master" table on
fe70: 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20   the disk..  ** 
fe80: 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
fe90: 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69  to the disk agai
fea0: 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20  n.  Extract the 
feb0: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
fec0: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61  .  ** for the ta
fed0: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ble from the db-
fee0: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69  >init.newTnum fi
fef0: 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20  eld.  (The page 
ff00: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75  number.  ** shou
ff10: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74  ld have been put
ff20: 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71   there by the sq
ff30: 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69  liteOpenCb routi
ff40: 6e 65 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ne.).  **.  ** I
ff50: 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
ff60: 6e 75 6d 62 65 72 20 69 73 20 31 2c 20 74 68 61  number is 1, tha
ff70: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 73 20  t means this is 
ff80: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
ff90: 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 69 74 73  r.  ** table its
ffa0: 65 6c 66 2e 20 20 53 6f 20 6d 61 72 6b 20 69 74  elf.  So mark it
ffb0: 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 20 20 2a 2f   read-only..  */
ffc0: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
ffd0: 62 75 73 79 20 29 7b 0a 20 20 20 20 69 66 28 20  busy ){.    if( 
ffe0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
fff0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10000 28 70 50 61 72 73 65 2c 20 22 22 29 3b 0a 20 20  (pParse, "");.  
10010 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
10020 7d 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  }.    p->tnum = 
10030 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
10040 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 6e 75  ;.    if( p->tnu
10050 6d 3d 3d 31 20 29 20 70 2d 3e 74 61 62 46 6c 61  m==1 ) p->tabFla
10060 67 73 20 7c 3d 20 54 46 5f 52 65 61 64 6f 6e 6c  gs |= TF_Readonl
10070 79 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  y;.  }..  assert
10080 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26  ( (p->tabFlags &
10090 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
100a0 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  y)==0.       || 
100b0 70 2d 3e 69 50 4b 65 79 3e 3d 30 20 7c 7c 20 73  p->iPKey>=0 || s
100c0 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
100d0 49 6e 64 65 78 28 70 29 21 3d 30 20 29 3b 0a 20  Index(p)!=0 );. 
100e0 20 61 73 73 65 72 74 28 20 28 70 2d 3e 74 61 62   assert( (p->tab
100f0 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72  Flags & TF_HasPr
10100 69 6d 61 72 79 4b 65 79 29 21 3d 30 0a 20 20 20  imaryKey)!=0.   
10110 20 20 20 20 7c 7c 20 28 70 2d 3e 69 50 4b 65 79      || (p->iPKey
10120 3c 30 20 26 26 20 73 71 6c 69 74 65 33 50 72 69  <0 && sqlite3Pri
10130 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 29 3d  maryKeyIndex(p)=
10140 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 70 65  =0) );..  /* Spe
10150 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  cial processing 
10160 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
10170 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66  D Tables */.  if
10180 28 20 74 61 62 4f 70 74 73 20 26 20 54 46 5f 57  ( tabOpts & TF_W
10190 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20  ithoutRowid ){. 
101a0 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c     if( (p->tabFl
101b0 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
101c0 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20 20  rement) ){.     
101d0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
101e0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
101f0 20 20 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e     "AUTOINCREMEN
10200 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  T not allowed on
10210 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
10220 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 72  ables");.      r
10230 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
10240 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67   if( (p->tabFlag
10250 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72  s & TF_HasPrimar
10260 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  yKey)==0 ){.    
10270 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10280 67 28 70 50 61 72 73 65 2c 20 22 50 52 49 4d 41  g(pParse, "PRIMA
10290 52 59 20 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f  RY KEY missing o
102a0 6e 20 74 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e  n table %s", p->
102b0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
102c0 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61 62 46  e{.      p->tabF
102d0 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f  lags |= TF_Witho
102e0 75 74 52 6f 77 69 64 20 7c 20 54 46 5f 4e 6f 56  utRowid | TF_NoV
102f0 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20  isibleRowid;.   
10300 20 20 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68     convertToWith
10310 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 70 50  outRowidTable(pP
10320 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  arse, p);.    }.
10330 20 20 7d 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c    }..  iDb = sql
10340 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
10350 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  x(db, p->pSchema
10360 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
10370 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
10380 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73  /* Resolve names
10390 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f   in all CHECK co
103a0 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65 73 73  nstraint express
103b0 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
103c0 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20   p->pCheck ){.  
103d0 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
103e0 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50  SelfReference(pP
103f0 61 72 73 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68  arse, p, NC_IsCh
10400 65 63 6b 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63  eck, 0, p->pChec
10410 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  k);.  }.#endif /
10420 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
10430 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f  E_OMIT_CHECK) */
10440 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20  ..  /* Estimate 
10450 74 68 65 20 61 76 65 72 61 67 65 20 72 6f 77 20  the average row 
10460 73 69 7a 65 20 66 6f 72 20 74 68 65 20 74 61 62  size for the tab
10470 6c 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69  le and for all i
10480 6d 70 6c 69 65 64 20 69 6e 64 69 63 65 73 20 2a  mplied indices *
10490 2f 0a 20 20 65 73 74 69 6d 61 74 65 54 61 62 6c  /.  estimateTabl
104a0 65 57 69 64 74 68 28 70 29 3b 0a 20 20 66 6f 72  eWidth(p);.  for
104b0 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b  (pIdx=p->pIndex;
104c0 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
104d0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 65 73  ->pNext){.    es
104e0 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68  timateIndexWidth
104f0 28 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  (pIdx);.  }..  /
10500 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c  * If not initial
10510 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61  izing, then crea
10520 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20  te a record for 
10530 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20  the new table.  
10540 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  ** in the SQLITE
10550 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66  _MASTER table of
10560 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
10570 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   **.  ** If this
10580 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20   is a TEMPORARY 
10590 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65  table, write the
105a0 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
105b0 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66  auxiliary.  ** f
105c0 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ile instead of i
105d0 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
105e0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
105f0 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
10600 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74  .busy ){.    int
10610 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   n;.    Vdbe *v;
10620 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
10630 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f  ;    /* "view" o
10640 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20  r "table" */.   
10650 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20   char *zType2;  
10660 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54   /* "VIEW" or "T
10670 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61  ABLE" */.    cha
10680 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20  r *zStmt;    /* 
10690 54 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  Text of the CREA
106a0 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41  TE TABLE or CREA
106b0 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
106c0 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71  t */..    v = sq
106d0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
106e0 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45  rse);.    if( NE
106f0 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75  VER(v==0) ) retu
10700 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  rn;..    sqlite3
10710 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
10720 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20  _Close, 0);..   
10730 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74   /* .    ** Init
10740 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f 72  ialize zType for
10750 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 6f 72   the new view or
10760 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
10770 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63     if( p->pSelec
10780 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t==0 ){.      /*
10790 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65   A regular table
107a0 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
107b0 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20  = "table";.     
107c0 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45   zType2 = "TABLE
107d0 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ";.#ifndef SQLIT
107e0 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20  E_OMIT_VIEW.    
107f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
10800 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  A view */.      
10810 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a  zType = "view";.
10820 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
10830 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20  VIEW";.#endif.  
10840 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
10850 68 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20  his is a CREATE 
10860 54 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45  TABLE xx AS SELE
10870 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20  CT ..., execute 
10880 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a  the SELECT.    *
10890 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70  * statement to p
108a0 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20  opulate the new 
108b0 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d  table. The root-
108c0 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
108d0 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74  the.    ** new t
108e0 61 62 6c 65 20 69 73 20 69 6e 20 72 65 67 69 73  able is in regis
108f0 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52  ter pParse->regR
10900 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oot..    **.    
10910 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45  ** Once the SELE
10920 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65  CT has been code
10930 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65  d by sqlite3Sele
10940 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61  ct(), it is in a
10950 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65  .    ** suitable
10960 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20   state to query 
10970 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  for the column n
10980 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74  ames and types t
10990 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a  o be used.    **
109a0 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c   by the new tabl
109b0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
109c0 20 41 20 73 68 61 72 65 64 2d 63 61 63 68 65 20   A shared-cache 
109d0 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f  write-lock is no
109e0 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72  t required to wr
109f0 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74  ite to the new t
10a00 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20  able,.    ** as 
10a10 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75  a schema-lock mu
10a20 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
10a30 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f  been obtained to
10a40 20 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63   create it. Sinc
10a50 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d  e.    ** a schem
10a60 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20  a-lock excludes 
10a70 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61  all other databa
10a80 73 65 20 75 73 65 72 73 2c 20 74 68 65 20 77 72  se users, the wr
10a90 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20  ite-lock would. 
10aa0 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61     ** be redunda
10ab0 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  nt..    */.    i
10ac0 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
10ad0 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
10ae0 65 73 74 3b 20 20 20 20 2f 2a 20 57 68 65 72 65  est;    /* Where
10af0 20 74 68 65 20 53 45 4c 45 43 54 20 73 68 6f 75   the SELECT shou
10b00 6c 64 20 73 74 6f 72 65 20 72 65 73 75 6c 74 73  ld store results
10b10 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
10b20 67 59 69 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a  gYield;       /*
10b30 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
10b40 67 20 63 6f 2d 72 6f 75 74 69 6e 65 20 65 6e 74  g co-routine ent
10b50 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20  ry-point */.    
10b60 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
10b70 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
10b80 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a  the co-routine *
10b90 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52  /.      int regR
10ba0 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ec;         /* A
10bb0 20 72 65 63 6f 72 64 20 74 6f 20 62 65 20 69 6e   record to be in
10bc0 73 65 72 74 20 69 6e 74 6f 20 74 68 65 20 6e 65  sert into the ne
10bd0 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  w table */.     
10be0 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 20 20   int regRowid;  
10bf0 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66       /* Rowid of
10c00 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 74 6f   the next row to
10c10 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 20   insert */.     
10c20 20 69 6e 74 20 61 64 64 72 49 6e 73 4c 6f 6f 70   int addrInsLoop
10c30 3b 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74  ;    /* Top of t
10c40 68 65 20 6c 6f 6f 70 20 66 6f 72 20 69 6e 73 65  he loop for inse
10c50 72 74 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20  rting rows */.  
10c60 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54      Table *pSelT
10c70 61 62 3b 20 20 20 20 20 2f 2a 20 41 20 74 61 62  ab;     /* A tab
10c80 6c 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  le that describe
10c90 73 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 73  s the SELECT res
10ca0 75 6c 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20 72  ults */..      r
10cb0 65 67 59 69 65 6c 64 20 3d 20 2b 2b 70 50 61 72  egYield = ++pPar
10cc0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
10cd0 72 65 67 52 65 63 20 3d 20 2b 2b 70 50 61 72 73  regRec = ++pPars
10ce0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
10cf0 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72  egRowid = ++pPar
10d00 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
10d10 61 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e 6e  assert(pParse->n
10d20 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73  Tab==1);.      s
10d30 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
10d40 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
10d50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
10d60 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
10d70 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65 67 52   1, pParse->regR
10d80 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  oot, iDb);.     
10d90 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
10da0 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50  geP5(v, OPFLAG_P
10db0 32 49 53 52 45 47 29 3b 0a 20 20 20 20 20 20 70  2ISREG);.      p
10dc0 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b  Parse->nTab = 2;
10dd0 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 20 3d  .      addrTop =
10de0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
10df0 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a  entAddr(v) + 1;.
10e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10e10 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
10e20 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  itCoroutine, reg
10e30 59 69 65 6c 64 2c 20 30 2c 20 61 64 64 72 54 6f  Yield, 0, addrTo
10e40 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  p);.      if( pP
10e50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
10e60 75 72 6e 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  urn;.      pSelT
10e70 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
10e80 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
10e90 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a  arse, pSelect);.
10ea0 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61        if( pSelTa
10eb0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  b==0 ) return;. 
10ec0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
10ed0 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
10ee0 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54   p->nCol = pSelT
10ef0 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
10f00 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->aCol = pSelTa
10f10 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->aCol;.      p
10f20 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
10f30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
10f40 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >aCol = 0;.     
10f50 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
10f60 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29  ble(db, pSelTab)
10f70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
10f80 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
10f90 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  est, SRT_Corouti
10fa0 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20  ne, regYield);. 
10fb0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
10fc0 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
10fd0 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ct, &dest);.    
10fe0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
10ff0 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  rr ) return;.   
11000 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e     sqlite3VdbeEn
11010 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65  dCoroutine(v, re
11020 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73  gYield);.      s
11030 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
11040 72 65 28 76 2c 20 61 64 64 72 54 6f 70 20 2d 20  re(v, addrTop - 
11050 31 29 3b 0a 20 20 20 20 20 20 61 64 64 72 49 6e  1);.      addrIn
11060 73 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  sLoop = sqlite3V
11070 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
11080 59 69 65 6c 64 2c 20 64 65 73 74 2e 69 53 44 50  Yield, dest.iSDP
11090 61 72 6d 29 3b 0a 20 20 20 20 20 20 56 64 62 65  arm);.      Vdbe
110a0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
110b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
110c0 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
110d0 65 63 6f 72 64 2c 20 64 65 73 74 2e 69 53 64 73  ecord, dest.iSds
110e0 74 2c 20 64 65 73 74 2e 6e 53 64 73 74 2c 20 72  t, dest.nSdst, r
110f0 65 67 52 65 63 29 3b 0a 20 20 20 20 20 20 73 71  egRec);.      sq
11100 6c 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e 69  lite3TableAffini
11110 74 79 28 76 2c 20 70 2c 20 30 29 3b 0a 20 20 20  ty(v, p, 0);.   
11120 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11130 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
11140 77 69 64 2c 20 31 2c 20 72 65 67 52 6f 77 69 64  wid, 1, regRowid
11150 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11160 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
11170 5f 49 6e 73 65 72 74 2c 20 31 2c 20 72 65 67 52  _Insert, 1, regR
11180 65 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  ec, regRowid);. 
11190 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
111a0 47 6f 74 6f 28 76 2c 20 61 64 64 72 49 6e 73 4c  Goto(v, addrInsL
111b0 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oop);.      sqli
111c0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
111d0 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b  v, addrInsLoop);
111e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
111f0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
11200 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  lose, 1);.    }.
11210 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
11220 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
11230 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
11240 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
11250 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
11260 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72        zStmt = cr
11270 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62  eateTableStmt(db
11280 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , p);.    }else{
11290 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45  .      Token *pE
112a0 6e 64 32 20 3d 20 74 61 62 4f 70 74 73 20 3f 20  nd2 = tabOpts ? 
112b0 26 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f  &pParse->sLastTo
112c0 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20  ken : pEnd;.    
112d0 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64    n = (int)(pEnd
112e0 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73  2->z - pParse->s
112f0 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20  NameToken.z);.  
11300 20 20 20 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a      if( pEnd2->z
11310 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20  [0]!=';' ) n += 
11320 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20  pEnd2->n;.      
11330 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
11340 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20  Printf(db, .    
11350 20 20 20 20 20 20 22 43 52 45 41 54 45 20 25 73        "CREATE %s
11360 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20   %.*s", zType2, 
11370 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65  n, pParse->sName
11380 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b  Token.z.      );
11390 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
113a0 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65   slot for the re
113b0 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79  cord has already
113c0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
113d0 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53  in the .    ** S
113e0 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
113f0 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65  le.  We just nee
11400 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74  d to update that
11410 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20   slot with all. 
11420 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d     ** the inform
11430 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c  ation we've coll
11440 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ected..    */.  
11450 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
11460 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
11470 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
11480 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45 54   ".         "SET
11490 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65   type='%s', name
114a0 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  =%Q, tbl_name=%Q
114b0 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20  , rootpage=#%d, 
114c0 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20  sql=%Q ".       
114d0 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64  "WHERE rowid=#%d
114e0 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ",.      db->aDb
114f0 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20  [iDb].zDbSName, 
11500 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20  MASTER_NAME,.   
11510 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20     zType,.      
11520 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
11530 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
11540 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c  pParse->regRoot,
11550 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20  .      zStmt,.  
11560 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52      pParse->regR
11570 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20 20  owid.    );.    
11580 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
11590 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71  , zStmt);.    sq
115a0 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
115b0 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
115c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
115d0 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
115e0 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  NT.    /* Check 
115f0 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65  to see if we nee
11600 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73  d to create an s
11610 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
11620 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20  able for.    ** 
11630 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66  keeping track of
11640 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b   autoincrement k
11650 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eys..    */.    
11660 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73  if( (p->tabFlags
11670 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
11680 65 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ent)!=0 ){.     
11690 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
116a0 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20  aDb[iDb];.      
116b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
116c0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
116d0 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
116e0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63      if( pDb->pSc
116f0 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30  hema->pSeqTab==0
11700 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
11710 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
11720 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
11730 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25   "CREATE TABLE %
11740 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  Q.sqlite_sequenc
11750 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20  e(name,seq)",.  
11760 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62          pDb->zDb
11770 53 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b  SName.        );
11780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
11790 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65  endif..    /* Re
117a0 70 61 72 73 65 20 65 76 65 72 79 74 68 69 6e 67  parse everything
117b0 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69   to update our i
117c0 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72  nternal data str
117d0 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73  uctures */.    s
117e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72  qlite3VdbeAddPar
117f0 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44  seSchemaOp(v, iD
11800 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  b,.           sq
11810 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
11820 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20   "tbl_name='%q' 
11830 41 4e 44 20 74 79 70 65 21 3d 27 74 72 69 67 67  AND type!='trigg
11840 65 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29  er'", p->zName))
11850 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64  ;.  }...  /* Add
11860 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68   the table to th
11870 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
11880 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
11890 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  e database..  */
118a0 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
118b0 62 75 73 79 20 29 7b 0a 20 20 20 20 54 61 62 6c  busy ){.    Tabl
118c0 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68  e *pOld;.    Sch
118d0 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70  ema *pSchema = p
118e0 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61  ->pSchema;.    a
118f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
11900 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
11910 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
11920 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48   pOld = sqlite3H
11930 61 73 68 49 6e 73 65 72 74 28 26 70 53 63 68 65  ashInsert(&pSche
11940 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e  ma->tblHash, p->
11950 7a 4e 61 6d 65 2c 20 70 29 3b 0a 20 20 20 20 69  zName, p);.    i
11960 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20  f( pOld ){.     
11970 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64   assert( p==pOld
11980 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
11990 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
119a0 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72  inside HashInser
119b0 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  t() */.      sql
119c0 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
119d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
119e0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
119f0 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b  ->pNewTable = 0;
11a00 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67  .    db->mDbFlag
11a10 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65  s |= DBFLAG_Sche
11a20 6d 61 43 68 61 6e 67 65 3b 0a 0a 23 69 66 6e 64  maChange;..#ifnd
11a30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
11a40 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66  LTERTABLE.    if
11a50 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b  ( !p->pSelect ){
11a60 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
11a70 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73  r *zName = (cons
11a80 74 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d  t char *)pParse-
11a90 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20  >sNameToken.z;. 
11aa0 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a       int nName;.
11ab0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
11ac0 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20  Select && pCons 
11ad0 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20  && pEnd );.     
11ae0 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30   if( pCons->z==0
11af0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e   ){.        pCon
11b00 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  s = pEnd;.      
11b10 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20  }.      nName = 
11b20 28 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61  (int)((const cha
11b30 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a  r *)pCons->z - z
11b40 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Name);.      p->
11b50 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31  addColOffset = 1
11b60 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43  3 + sqlite3Utf8C
11b70 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e  harLen(zName, nN
11b80 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ame);.    }.#end
11b90 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  if.  }.}..#ifnde
11ba0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
11bb0 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72  EW./*.** The par
11bc0 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
11bd0 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20  outine in order 
11be0 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
11bf0 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  VIEW.*/.void sql
11c00 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a  ite3CreateView(.
11c10 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
11c20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
11c30 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
11c40 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20   Token *pBegin, 
11c50 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
11c60 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
11c70 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ins the statemen
11c80 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
11c90 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame1,     /* The
11ca0 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
11cb0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
11cc0 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  e view */.  Toke
11cd0 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
11ce0 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
11cf0 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
11d00 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
11d10 20 45 78 70 72 4c 69 73 74 20 2a 70 43 4e 61 6d   ExprList *pCNam
11d20 65 73 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20  es, /* Optional 
11d30 6c 69 73 74 20 6f 66 20 76 69 65 77 20 63 6f 6c  list of view col
11d40 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 53  umn names */.  S
11d50 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
11d60 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
11d70 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c  atement that wil
11d80 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
11d90 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
11da0 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  sTemp,        /*
11db0 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50   TRUE for a TEMP
11dc0 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20  ORARY view */.  
11dd0 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20  int noErr       
11de0 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65     /* Suppress e
11df0 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66  rror messages if
11e00 20 56 49 45 57 20 61 6c 72 65 61 64 79 20 65 78   VIEW already ex
11e10 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ists */.){.  Tab
11e20 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a  le *p;.  int n;.
11e30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
11e40 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20  .  Token sEnd;. 
11e50 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20   DbFixer sFix;. 
11e60 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20   Token *pName = 
11e70 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20  0;.  int iDb;.  
11e80 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
11e90 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
11ea0 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20   pParse->nVar>0 
11eb0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
11ec0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11ed0 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e  parameters are n
11ee0 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69  ot allowed in vi
11ef0 65 77 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ews");.    goto 
11f00 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c  create_view_fail
11f10 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
11f20 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65  tartTable(pParse
11f30 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
11f40 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20  , isTemp, 1, 0, 
11f50 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50  noErr);.  p = pP
11f60 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
11f70 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
11f80 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
11f90 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66  to create_view_f
11fa0 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54 77  ail;.  sqlite3Tw
11fb0 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
11fc0 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
11fd0 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62  , &pName);.  iDb
11fe0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
11ff0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
12000 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
12010 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
12020 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76   pParse, iDb, "v
12030 69 65 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  iew", pName);.  
12040 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 65  if( sqlite3FixSe
12050 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c  lect(&sFix, pSel
12060 65 63 74 29 20 29 20 67 6f 74 6f 20 63 72 65 61  ect) ) goto crea
12070 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20  te_view_fail;.. 
12080 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20   /* Make a copy 
12090 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45  of the entire SE
120a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
120b0 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
120c0 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20  view..  ** This 
120d0 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74  will force all t
120e0 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20  he Expr.token.z 
120f0 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e  values to be dyn
12100 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c  amically.  ** al
12110 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74  located rather t
12120 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  han point to the
12130 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20   input string - 
12140 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
12150 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20  .  ** they will 
12160 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68  persist after th
12170 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65  e current sqlite
12180 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65  3_exec() call re
12190 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  turns..  */.  if
121a0 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
121b0 43 54 20 29 7b 0a 20 20 20 20 70 2d 3e 70 53 65  CT ){.    p->pSe
121c0 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a  lect = pSelect;.
121d0 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20 30 3b      pSelect = 0;
121e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
121f0 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
12200 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
12210 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50  pSelect, EXPRDUP
12220 5f 52 45 44 55 43 45 29 3b 0a 20 20 7d 0a 20 20  _REDUCE);.  }.  
12230 70 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69  p->pCheck = sqli
12240 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
12250 62 2c 20 70 43 4e 61 6d 65 73 2c 20 45 58 50 52  b, pCNames, EXPR
12260 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 69  DUP_REDUCE);.  i
12270 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
12280 6c 65 64 20 29 20 67 6f 74 6f 20 63 72 65 61 74  led ) goto creat
12290 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20  e_view_fail;..  
122a0 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e  /* Locate the en
122b0 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  d of the CREATE 
122c0 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20  VIEW statement. 
122d0 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74   Make sEnd point
122e0 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64   to.  ** the end
122f0 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20  ..  */.  sEnd = 
12300 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
12310 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 45  en;.  assert( sE
12320 6e 64 2e 7a 5b 30 5d 21 3d 30 20 7c 7c 20 73 45  nd.z[0]!=0 || sE
12330 6e 64 2e 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28  nd.n==0 );.  if(
12340 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20   sEnd.z[0]!=';' 
12350 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d  ){.    sEnd.z +=
12360 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73   sEnd.n;.  }.  s
12370 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d  End.n = 0;.  n =
12380 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20   (int)(sEnd.z - 
12390 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 61 73  pBegin->z);.  as
123a0 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 7a  sert( n>0 );.  z
123b0 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20   = pBegin->z;.  
123c0 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73  while( sqlite3Is
123d0 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b  space(z[n-1]) ){
123e0 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a   n--; }.  sEnd.z
123f0 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45   = &z[n-1];.  sE
12400 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20  nd.n = 1;..  /* 
12410 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61  Use sqlite3EndTa
12420 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68 65  ble() to add the
12430 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c   view to the SQL
12440 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
12450 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64   */.  sqlite3End
12460 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c  Table(pParse, 0,
12470 20 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 0a   &sEnd, 0, 0);..
12480 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c  create_view_fail
12490 3a 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  :.  sqlite3Selec
124a0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
124b0 65 63 74 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52  ect);.  if( IN_R
124c0 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a  ENAME_OBJECT ){.
124d0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d      sqlite3Renam
124e0 65 45 78 70 72 6c 69 73 74 55 6e 6d 61 70 28 70  eExprlistUnmap(p
124f0 50 61 72 73 65 2c 20 70 43 4e 61 6d 65 73 29 3b  Parse, pCNames);
12500 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
12510 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
12520 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20 72 65 74   pCNames);.  ret
12530 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  urn;.}.#endif /*
12540 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
12550 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  W */..#if !defin
12560 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
12570 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
12580 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
12590 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a  TUALTABLE)./*.**
125a0 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
125b0 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72  ture pTable is r
125c0 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46  eally a VIEW.  F
125d0 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73  ill in the names
125e0 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   of.** the colum
125f0 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69  ns of the view i
12600 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72  n the pTable str
12610 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20  ucture.  Return 
12620 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
12630 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20   errors.  If an 
12640 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65  error is seen le
12650 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
12660 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
12670 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
12680 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
12690 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20  lumnNames(Parse 
126a0 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
126b0 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65  pTable){.  Table
126c0 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20   *pSelTab;   /* 
126d0 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f  A fake table fro
126e0 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74  m which we get t
126f0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
12700 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b  .  Select *pSel;
12710 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
12720 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20  the SELECT that 
12730 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
12740 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72  iew */.  int nEr
12750 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  r = 0;     /* Nu
12760 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65  mber of errors e
12770 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20  ncountered */.  
12780 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
12790 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79    /* Temporarily
127a0 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65   holds the numbe
127b0 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73  r of cursors ass
127c0 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  igned */.  sqlit
127d0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
127e0 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  >db;  /* Databas
127f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72  e connection for
12800 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a   malloc errors *
12810 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
12820 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
12830 4c 45 0a 20 20 69 6e 74 20 72 63 3b 0a 23 65 6e  LE.  int rc;.#en
12840 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
12850 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
12860 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f  ATION.  sqlite3_
12870 78 61 75 74 68 20 78 41 75 74 68 3b 20 20 20 20  xauth xAuth;    
12880 20 20 20 2f 2a 20 53 61 76 65 64 20 78 41 75 74     /* Saved xAut
12890 68 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 23 65 6e  h pointer */.#en
128a0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
128b0 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65  Table );..#ifnde
128c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
128d0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 64 62 2d  RTUALTABLE.  db-
128e0 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 2b 2b 3b 0a  >nSchemaLock++;.
128f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
12900 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50  abCallConnect(pP
12910 61 72 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a 20  arse, pTable);. 
12920 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b   db->nSchemaLock
12930 2d 2d 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  --;.  if( rc ){.
12940 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
12950 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  }.  if( IsVirtua
12960 6c 28 70 54 61 62 6c 65 29 20 29 20 72 65 74 75  l(pTable) ) retu
12970 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  rn 0;.#endif..#i
12980 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12990 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f  T_VIEW.  /* A po
129a0 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e  sitive nCol mean
129b0 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61  s the columns na
129c0 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65  mes for this vie
129d0 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61  w are.  ** alrea
129e0 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20  dy known..  */. 
129f0 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
12a00 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  l>0 ) return 0;.
12a10 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65  .  /* A negative
12a20 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69   nCol is a speci
12a30 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e  al marker meanin
12a40 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75  g that we are cu
12a50 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79  rrently.  ** try
12a60 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  ing to compute t
12a70 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  he column names.
12a80 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68    If we enter th
12a90 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a  is routine with.
12aa0 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20    ** a negative 
12ab0 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  nCol, it means t
12ac0 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73  wo or more views
12ad0 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69   form a loop, li
12ae0 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  ke this:.  **.  
12af0 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
12b00 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54  EW one AS SELECT
12b10 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a   * FROM two;.  *
12b20 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
12b30 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20  W two AS SELECT 
12b40 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a  * FROM one;.  **
12b50 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
12b60 74 68 65 20 65 72 72 6f 72 20 61 62 6f 76 65 20  the error above 
12b70 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72  is now caught pr
12b80 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20  ior to reaching 
12b90 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a  this point..  **
12ba0 20 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69   But the followi
12bb0 6e 67 20 74 65 73 74 20 69 73 20 73 74 69 6c 6c  ng test is still
12bc0 20 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 69 74   important as it
12bd0 20 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20 20   does come up.  
12be0 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ** in the follow
12bf0 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ing:.  ** .  ** 
12c00 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
12c10 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20   main.ex1(a);.  
12c20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 45  **     CREATE TE
12c30 4d 50 20 56 49 45 57 20 65 78 31 20 41 53 20 53  MP VIEW ex1 AS S
12c40 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 78 31  ELECT a FROM ex1
12c50 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  ;.  **     SELEC
12c60 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78  T * FROM temp.ex
12c70 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  1;.  */.  if( pT
12c80 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a  able->nCol<0 ){.
12c90 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12ca0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65  Msg(pParse, "vie
12cb0 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72  w %s is circular
12cc0 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61  ly defined", pTa
12cd0 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  ble->zName);.   
12ce0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
12cf0 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
12d00 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f  >nCol>=0 );..  /
12d10 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
12d20 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77   far, it means w
12d30 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  e need to comput
12d40 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  e the table name
12d50 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  s..  ** Note tha
12d60 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  t the call to sq
12d70 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
12d80 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78  Select() will ex
12d90 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a  pand any.  ** "*
12da0 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  " elements in th
12db0 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66  e results set of
12dc0 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77 69   the view and wi
12dd0 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72  ll assign cursor
12de0 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c  s.  ** to the el
12df0 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52  ements of the FR
12e00 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20  OM clause.  But 
12e10 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  we do not want t
12e20 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a  hese changes.  *
12e30 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e  * to be permanen
12e40 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75  t.  So the compu
12e50 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f  tation is done o
12e60 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  n a copy of the 
12e70 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74  SELECT.  ** stat
12e80 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e  ement that defin
12e90 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a  es the view..  *
12ea0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
12eb0 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20  le->pSelect );. 
12ec0 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53   pSel = sqlite3S
12ed0 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61  electDup(db, pTa
12ee0 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  ble->pSelect, 0)
12ef0 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a  ;.  if( pSel ){.
12f00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12f10 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20  MIT_ALTERTABLE. 
12f20 20 20 20 75 38 20 65 50 61 72 73 65 4d 6f 64 65     u8 eParseMode
12f30 20 3d 20 70 50 61 72 73 65 2d 3e 65 50 61 72 73   = pParse->ePars
12f40 65 4d 6f 64 65 3b 0a 20 20 20 20 70 50 61 72 73  eMode;.    pPars
12f50 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 20 3d 20  e->eParseMode = 
12f60 50 41 52 53 45 5f 4d 4f 44 45 5f 4e 4f 52 4d 41  PARSE_MODE_NORMA
12f70 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e 20  L;.#endif.    n 
12f80 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
12f90 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
12fa0 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
12fb0 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53  pParse, pSel->pS
12fc0 72 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  rc);.    pTable-
12fd0 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20  >nCol = -1;.    
12fe0 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
12ff0 69 73 61 62 6c 65 2b 2b 3b 0a 23 69 66 6e 64 65  isable++;.#ifnde
13000 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
13010 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
13020 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74  xAuth = db->xAut
13030 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68  h;.    db->xAuth
13040 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61   = 0;.    pSelTa
13050 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
13060 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
13070 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  rse, pSel);.    
13080 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74  db->xAuth = xAut
13090 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53 65  h;.#else.    pSe
130a0 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
130b0 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
130c0 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23  pParse, pSel);.#
130d0 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72 73 65  endif.    pParse
130e0 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20  ->nTab = n;.    
130f0 69 66 28 20 70 54 61 62 6c 65 2d 3e 70 43 68 65  if( pTable->pChe
13100 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  ck ){.      /* C
13110 52 45 41 54 45 20 56 49 45 57 20 6e 61 6d 65 28  REATE VIEW name(
13120 61 72 67 6c 69 73 74 29 20 41 53 20 2e 2e 2e 0a  arglist) AS ....
13130 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e 61 6d        ** The nam
13140 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  es of the column
13150 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 61  s in the table a
13160 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 0a 20 20  re taken from.  
13170 20 20 20 20 2a 2a 20 61 72 67 6c 69 73 74 20 77      ** arglist w
13180 68 69 63 68 20 69 73 20 73 74 6f 72 65 64 20 69  hich is stored i
13190 6e 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b  n pTable->pCheck
131a0 2e 20 20 54 68 65 20 70 43 68 65 63 6b 20 66 69  .  The pCheck fi
131b0 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 72  eld.      ** nor
131c0 6d 61 6c 6c 79 20 68 6f 6c 64 73 20 43 48 45 43  mally holds CHEC
131d0 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e  K constraints on
131e0 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62   an ordinary tab
131f0 6c 65 2c 20 62 75 74 20 66 6f 72 0a 20 20 20 20  le, but for.    
13200 20 20 2a 2a 20 61 20 56 49 45 57 20 69 74 20 68    ** a VIEW it h
13210 6f 6c 64 73 20 74 68 65 20 6c 69 73 74 20 6f 66  olds the list of
13220 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 0a 20   column names.. 
13230 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
13240 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d  lite3ColumnsFrom
13250 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
13260 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 2c   pTable->pCheck,
13270 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
13280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13290 20 20 20 26 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c     &pTable->nCol
132a0 2c 20 26 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29  , &pTable->aCol)
132b0 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
132c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
132d0 0a 20 20 20 20 20 20 20 26 26 20 70 50 61 72 73  .       && pPars
132e0 65 2d 3e 6e 45 72 72 3d 3d 30 0a 20 20 20 20 20  e->nErr==0.     
132f0 20 20 26 26 20 70 54 61 62 6c 65 2d 3e 6e 43 6f    && pTable->nCo
13300 6c 3d 3d 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2d  l==pSel->pEList-
13310 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 29 7b 0a  >nExpr.      ){.
13320 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
13330 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
13340 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
13350 50 61 72 73 65 2c 20 70 54 61 62 6c 65 2c 20 70  Parse, pTable, p
13360 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sel);.      }.  
13370 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65 6c    }else if( pSel
13380 54 61 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Tab ){.      /* 
13390 43 52 45 41 54 45 20 56 49 45 57 20 6e 61 6d 65  CREATE VIEW name
133a0 20 41 53 2e 2e 2e 20 20 77 69 74 68 6f 75 74 20   AS...  without 
133b0 61 6e 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74  an argument list
133c0 2e 20 20 43 6f 6e 73 74 72 75 63 74 0a 20 20 20  .  Construct.   
133d0 20 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e     ** the column
133e0 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65 20   names from the 
133f0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13400 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
13410 65 20 76 69 65 77 2e 0a 20 20 20 20 20 20 2a 2f  e view..      */
13420 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13430 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29  Table->aCol==0 )
13440 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ;.      pTable->
13450 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  nCol = pSelTab->
13460 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61 62  nCol;.      pTab
13470 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54  le->aCol = pSelT
13480 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->aCol;.      
13490 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
134a0 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  0;.      pSelTab
134b0 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
134c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
134d0 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
134e0 28 64 62 2c 20 30 2c 20 70 54 61 62 6c 65 2d 3e  (db, 0, pTable->
134f0 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20  pSchema) );.    
13500 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61  }else{.      pTa
13510 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  ble->nCol = 0;. 
13520 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
13530 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
13540 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53  leteTable(db, pS
13550 65 6c 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69  elTab);.    sqli
13560 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
13570 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64  db, pSel);.    d
13580 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69  b->lookaside.bDi
13590 73 61 62 6c 65 2d 2d 3b 0a 23 69 66 6e 64 65 66  sable--;.#ifndef
135a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54   SQLITE_OMIT_ALT
135b0 45 52 54 41 42 4c 45 0a 20 20 20 20 70 50 61 72  ERTABLE.    pPar
135c0 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 20 3d  se->eParseMode =
135d0 20 65 50 61 72 73 65 4d 6f 64 65 3b 0a 23 65 6e   eParseMode;.#en
135e0 64 69 66 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  dif.  } else {. 
135f0 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20     nErr++;.  }. 
13600 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
13610 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 20 7c 3d  ->schemaFlags |=
13620 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
13630 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
13640 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
13650 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c  sqlite3DeleteCol
13660 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61  umnNames(db, pTa
13670 62 6c 65 29 3b 0a 20 20 20 20 70 54 61 62 6c 65  ble);.    pTable
13680 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
13690 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
136a0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
136b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
136c0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72   */.  return nEr
136d0 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  r;  .}.#endif /*
136e0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
136f0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
13700 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
13710 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
13720 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) */..#ifndef SQ
13730 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
13740 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
13750 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
13760 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64   every VIEW in d
13770 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a  atabase idx..*/.
13780 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
13790 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73  teViewResetAll(s
137a0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
137b0 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  idx){.  HashElem
137c0 20 2a 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73   *i;.  assert( s
137d0 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
137e0 78 48 65 6c 64 28 64 62 2c 20 69 64 78 2c 20 30  xHeld(db, idx, 0
137f0 29 20 29 3b 0a 20 20 69 66 28 20 21 44 62 48 61  ) );.  if( !DbHa
13800 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  sProperty(db, id
13810 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
13820 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ws) ) return;.  
13830 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
13840 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69  First(&db->aDb[i
13850 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  dx].pSchema->tbl
13860 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74  Hash); i;i=sqlit
13870 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
13880 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
13890 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
138a0 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  i);.    if( pTab
138b0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
138c0 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
138d0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20  ColumnNames(db, 
138e0 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54 61  pTab);.      pTa
138f0 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
13900 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20     pTab->nCol = 
13910 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44  0;.    }.  }.  D
13920 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64  bClearProperty(d
13930 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73  b, idx, DB_Unres
13940 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73  etViews);.}.#els
13950 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74  e.# define sqlit
13960 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c  eViewResetAll(A,
13970 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  B).#endif /* SQL
13980 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
13990 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
139a0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
139b0 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20 61  by the VDBE to a
139c0 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e  djust the intern
139d0 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65  al schema.** use
139e0 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e  d by SQLite when
139f0 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
13a00 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72   moves a table r
13a10 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a  oot page. The.**
13a20 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20   root-page of a 
13a30 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69  table or index i
13a40 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20 68  n database iDb h
13a50 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  as changed from 
13a60 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e  iFrom.** to iTo.
13a70 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31  .**.** Ticket #1
13a80 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c  728:  The symbol
13a90 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74 69   table might sti
13aa0 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72  ll contain infor
13ab0 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62  mation.** on tab
13ac0 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63  les and/or indic
13ad0 65 73 20 74 68 61 74 20 61 72 65 20 74 68 65 20  es that are the 
13ae0 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67  process of being
13af0 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20   deleted..** If 
13b00 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c  you are unlucky,
13b10 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 65   one of those de
13b20 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f 72  leted indices or
13b30 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a   tables might.**
13b40 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 72   have the same r
13b50 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20 61  ootpage number a
13b60 73 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c 65  s the real table
13b70 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20 69   or index that i
13b80 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64  s.** being moved
13b90 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20  .  So we cannot 
13ba0 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20 61  stop searching a
13bb0 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20 6d  fter the first m
13bc0 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73 65  atch .** because
13bd0 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
13be0 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f 6e   might be for on
13bf0 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65 64  e of the deleted
13c00 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74   indices.** or t
13c10 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74 68  ables and not th
13c20 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74 68  e table/index th
13c30 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 62  at is actually b
13c40 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57  eing moved..** W
13c50 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65 20  e must continue 
13c60 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c  looping until al
13c70 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64  l tables and ind
13c80 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f  ices with.** roo
13c90 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76  tpage==iFrom hav
13ca0 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64  e been converted
13cb0 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74 70   to have a rootp
13cc0 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e  age of iTo.** in
13cd0 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65 72   order to be cer
13ce0 74 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f 74  tain that we got
13cf0 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a   the right one..
13d00 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
13d10 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
13d20 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  M.void sqlite3Ro
13d30 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71 6c 69  otPageMoved(sqli
13d40 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
13d50 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
13d60 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65   iTo){.  HashEle
13d70 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68  m *pElem;.  Hash
13d80 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20 2a 70   *pHash;.  Db *p
13d90 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  Db;..  assert( s
13da0 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
13db0 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
13dc0 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62  ) );.  pDb = &db
13dd0 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 48  ->aDb[iDb];.  pH
13de0 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68  ash = &pDb->pSch
13df0 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20  ema->tblHash;.  
13e00 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
13e10 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29  HashFirst(pHash)
13e20 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
13e30 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
13e40 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  lem)){.    Table
13e50 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
13e60 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
13e70 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e      if( pTab->tn
13e80 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
13e90 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20     pTab->tnum = 
13ea0 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  iTo;.    }.  }. 
13eb0 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70   pHash = &pDb->p
13ec0 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b  Schema->idxHash;
13ed0 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
13ee0 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61  iteHashFirst(pHa
13ef0 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
13f00 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
13f10 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e  (pElem)){.    In
13f20 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69  dex *pIdx = sqli
13f30 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
13f40 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  );.    if( pIdx-
13f50 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a  >tnum==iFrom ){.
13f60 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d        pIdx->tnum
13f70 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20   = iTo;.    }.  
13f80 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
13f90 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20  * Write code to 
13fa0 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65 20  erase the table 
13fb0 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
13fc0 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62  Table from datab
13fd0 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f  ase iDb..** Also
13fe0 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d   write code to m
13ff0 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74 65  odify the sqlite
14000 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e  _master table an
14010 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  d internal schem
14020 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70  a.** if a root-p
14030 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74  age of another t
14040 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79  able is moved by
14050 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72   the btree-layer
14060 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69   whilst.** erasi
14070 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73 20  ng iTable (this 
14080 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20  can happen with 
14090 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
140a0 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74  atabase)..*/ .st
140b0 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
140c0 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20  yRootPage(Parse 
140d0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61  *pParse, int iTa
140e0 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  ble, int iDb){. 
140f0 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
14100 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
14110 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71  );.  int r1 = sq
14120 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
14130 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 69  pParse);.  if( i
14140 54 61 62 6c 65 3c 32 20 29 20 73 71 6c 69 74 65  Table<2 ) sqlite
14150 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14160 2c 20 22 63 6f 72 72 75 70 74 20 73 63 68 65 6d  , "corrupt schem
14170 61 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  a");.  sqlite3Vd
14180 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44  beAddOp3(v, OP_D
14190 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20  estroy, iTable, 
141a0 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  r1, iDb);.  sqli
141b0 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
141c0 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  se);.#ifndef SQL
141d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
141e0 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74  UUM.  /* OP_Dest
141f0 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e  roy stores an in
14200 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20   integer r1. If 
14210 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a  this integer.  *
14220 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  * is non-zero, t
14230 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f  hen it is the ro
14240 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
14250 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20  f a table moved 
14260 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e  to.  ** location
14270 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c   iTable. The fol
14280 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69  lowing code modi
14290 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f  fies the sqlite_
142a0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a  master table to.
142b0 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69    ** reflect thi
142c0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
142d0 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53   "#NNN" in the S
142e0 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  QL is a special 
142f0 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65  constant that me
14300 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61 6c  ans whatever val
14310 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72 65  ue.  ** is in re
14320 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65  gister NNN.  See
14330 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20 61   grammar rules a
14340 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
14350 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 20  he TK_REGISTER. 
14360 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64   ** token for ad
14370 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
14380 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  tion..  */.  sql
14390 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
143a0 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55  pParse, .     "U
143b0 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54 20  PDATE %Q.%s SET 
143c0 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52  rootpage=%d WHER
143d0 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70 61  E #%d AND rootpa
143e0 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70 50  ge=#%d",.     pP
143f0 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
14400 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53  b].zDbSName, MAS
14410 54 45 52 5f 4e 41 4d 45 2c 20 69 54 61 62 6c 65  TER_NAME, iTable
14420 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69  , r1, r1);.#endi
14430 66 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  f.  sqlite3Relea
14440 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
14450 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , r1);.}../*.** 
14460 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65 20  Write VDBE code 
14470 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20 70  to erase table p
14480 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f  Tab and all asso
14490 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f  ciated indices o
144a0 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20  n disk..** Code 
144b0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73 71  to update the sq
144c0 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
144d0 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  es and internal 
144e0 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f  schema definitio
144f0 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20  ns.** in case a 
14500 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67  root-page belong
14510 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74  ing to another t
14520 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79  able is moved by
14530 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
14540 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65  .** is also adde
14550 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  d (this can happ
14560 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
14570 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
14580 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14590 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61   destroyTable(Pa
145a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
145b0 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 2f 2a 20  le *pTab){.  /* 
145c0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
145d0 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75  may be auto-vacu
145e0 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20 53  um capable (if S
145f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
14600 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f  ACUUM.  ** is no
14610 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e  t defined), then
14620 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
14630 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74   to call OP_Dest
14640 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  roy on the.  ** 
14650 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
14660 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72  root-pages in or
14670 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69  der, starting wi
14680 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c  th the numerical
14690 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74  ly .  ** largest
146a0 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
146b0 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  r. This guarante
146c0 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20  es that none of 
146d0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20  the root-pages. 
146e0 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f   ** to be destro
146f0 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64  yed is relocated
14700 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f   by an earlier O
14710 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20  P_Destroy. i.e. 
14720 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c  if the.  ** foll
14730 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64  owing were coded
14740 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44  :.  **.  ** OP_D
14750 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20  estroy 4 0.  ** 
14760 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74  ....  ** OP_Dest
14770 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a  roy 5 0.  **.  *
14780 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20  * and root page 
14790 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65  5 happened to be
147a0 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
147b0 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  t-page number in
147c0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
147d0 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61  se, then root pa
147e0 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f  ge 5 would be mo
147f0 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62 79  ved to page 4 by
14800 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44   the .  ** "OP_D
14810 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f  estroy 4 0" opco
14820 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75 65  de. The subseque
14830 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35  nt "OP_Destroy 5
14840 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20   0" would hit.  
14850 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70  ** a free-list p
14860 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  age..  */.  int 
14870 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75  iTab = pTab->tnu
14880 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f  m;.  int iDestro
14890 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c  yed = 0;..  whil
148a0 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65  e( 1 ){.    Inde
148b0 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74  x *pIdx;.    int
148c0 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a   iLargest = 0;..
148d0 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f 79      if( iDestroy
148e0 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44  ed==0 || iTab<iD
148f0 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20  estroyed ){.    
14900 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61    iLargest = iTa
14910 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  b;.    }.    for
14920 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
14930 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
14940 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
14950 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49     int iIdx = pI
14960 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  dx->tnum;.      
14970 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53  assert( pIdx->pS
14980 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
14990 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66  hema );.      if
149a0 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30  ( (iDestroyed==0
149b0 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72   || (iIdx<iDestr
149c0 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e 69  oyed)) && iIdx>i
149d0 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20  Largest ){.     
149e0 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49     iLargest = iI
149f0 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dx;.      }.    
14a00 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67 65  }.    if( iLarge
14a10 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
14a20 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65  eturn;.    }else
14a30 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20  {.      int iDb 
14a40 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
14a50 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
14a60 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
14a70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14a80 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 70   iDb>=0 && iDb<p
14a90 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29  Parse->db->nDb )
14aa0 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 52  ;.      destroyR
14ab0 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
14ac0 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b 0a  iLargest, iDb);.
14ad0 20 20 20 20 20 20 69 44 65 73 74 72 6f 79 65 64        iDestroyed
14ae0 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 20   = iLargest;.   
14af0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
14b00 52 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  Remove entries f
14b10 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73  rom the sqlite_s
14b20 74 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f 72  tatN tables (for
14b30 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a   N in (1,2,3)).*
14b40 2a 20 61 66 74 65 72 20 61 20 44 52 4f 50 20 49  * after a DROP I
14b50 4e 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41 42  NDEX or DROP TAB
14b60 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  LE command..*/.s
14b70 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
14b80 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65  e3ClearStatTable
14b90 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
14ba0 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
14bb0 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
14bc0 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14be0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6e  * The database n
14bf0 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  umber */.  const
14c00 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20 20   char *zType,   
14c10 20 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22 74    /* "idx" or "t
14c20 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  bl" */.  const c
14c30 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20  har *zName      
14c40 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78  /* Name of index
14c50 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a   or table */.){.
14c60 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
14c70 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d   char *zDbName =
14c80 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
14c90 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  [iDb].zDbSName;.
14ca0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 34 3b    for(i=1; i<=4;
14cb0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
14cc0 7a 54 61 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71  zTab[24];.    sq
14cd0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
14ce0 69 7a 65 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62  izeof(zTab),zTab
14cf0 2c 22 73 71 6c 69 74 65 5f 73 74 61 74 25 64 22  ,"sqlite_stat%d"
14d00 2c 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ,i);.    if( sql
14d10 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50  ite3FindTable(pP
14d20 61 72 73 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20  arse->db, zTab, 
14d30 7a 44 62 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  zDbName) ){.    
14d40 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
14d50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
14d60 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
14d70 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 25 73  M %Q.%s WHERE %s
14d80 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 7a 44  =%Q",.        zD
14d90 62 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79  bName, zTab, zTy
14da0 70 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20  pe, zName.      
14db0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
14dc0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
14dd0 6f 64 65 20 74 6f 20 64 72 6f 70 20 61 20 74 61  ode to drop a ta
14de0 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
14df0 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c  ite3CodeDropTabl
14e00 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
14e10 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e   Table *pTab, in
14e20 74 20 69 44 62 2c 20 69 6e 74 20 69 73 56 69 65  t iDb, int isVie
14e30 77 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  w){.  Vdbe *v;. 
14e40 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
14e50 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69  Parse->db;.  Tri
14e60 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a  gger *pTrigger;.
14e70 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
14e80 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20  >aDb[iDb];..  v 
14e90 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
14ea0 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
14eb0 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71  rt( v!=0 );.  sq
14ec0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
14ed0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
14ee0 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64   1, iDb);..#ifnd
14ef0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
14f00 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
14f10 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
14f20 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
14f30 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
14f40 5f 56 42 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65  _VBegin);.  }.#e
14f50 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20  ndif..  /* Drop 
14f60 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73 73  all triggers ass
14f70 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
14f80 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
14f90 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20  pped. Code.  ** 
14fa0 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  is generated to 
14fb0 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  remove entries f
14fc0 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  rom sqlite_maste
14fd0 72 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71  r and/or.  ** sq
14fe0 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
14ff0 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20   if required..  
15000 2a 2f 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20  */.  pTrigger = 
15010 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69  sqlite3TriggerLi
15020 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  st(pParse, pTab)
15030 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72 69 67  ;.  while( pTrig
15040 67 65 72 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ger ){.    asser
15050 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63  t( pTrigger->pSc
15060 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
15070 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ema || .        
15080 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
15090 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  a==db->aDb[1].pS
150a0 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c  chema );.    sql
150b0 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50  ite3DropTriggerP
150c0 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67  tr(pParse, pTrig
150d0 67 65 72 29 3b 0a 20 20 20 20 70 54 72 69 67 67  ger);.    pTrigg
150e0 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70  er = pTrigger->p
150f0 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  Next;.  }..#ifnd
15100 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
15110 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f  UTOINCREMENT.  /
15120 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74  * Remove any ent
15130 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ries of the sqli
15140 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
15150 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
15160 68 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65  h.  ** the table
15170 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20   being dropped. 
15180 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66  This is done bef
15190 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20 69 73  ore the table is
151a0 20 64 72 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74   dropped.  ** at
151b0 20 74 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c   the btree level
151c0 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 71  , in case the sq
151d0 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
151e0 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a  ble needs to.  *
151f0 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75  * move as a resu
15200 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28  lt of the drop (
15210 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75  can happen in au
15220 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e  to-vacuum mode).
15230 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
15240 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
15250 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b  Autoincrement ){
15260 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
15270 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
15280 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
15290 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71  OM %Q.sqlite_seq
152a0 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65  uence WHERE name
152b0 3d 25 51 22 2c 0a 20 20 20 20 20 20 70 44 62 2d  =%Q",.      pDb-
152c0 3e 7a 44 62 53 4e 61 6d 65 2c 20 70 54 61 62 2d  >zDbSName, pTab-
152d0 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20  >zName.    );.  
152e0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  }.#endif..  /* D
152f0 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d  rop all SQLITE_M
15300 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20  ASTER table and 
15310 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68  index entries th
15320 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a  at refer to the.
15330 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20    ** table. The 
15340 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f  program name loo
15350 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d  ps through the m
15360 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
15370 64 65 6c 65 74 65 73 0a 20 20 2a 2a 20 65 76 65  deletes.  ** eve
15380 72 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65  ry row that refe
15390 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66  rs to a table of
153a0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
153b0 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a  s the one being.
153c0 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72    ** dropped. Tr
153d0 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c  iggers are handl
153e0 65 64 20 73 65 70 61 72 61 74 65 6c 79 20 62 65  ed separately be
153f0 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72 20  cause a trigger 
15400 63 61 6e 20 62 65 0a 20 20 2a 2a 20 63 72 65 61  can be.  ** crea
15410 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20  ted in the temp 
15420 64 61 74 61 62 61 73 65 20 74 68 61 74 20 72 65  database that re
15430 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20  fers to a table 
15440 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20  in another.  ** 
15450 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
15460 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
15470 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
15480 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
15490 25 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f  %Q.%s WHERE tbl_
154a0 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65  name=%Q and type
154b0 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20  !='trigger'",.  
154c0 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d      pDb->zDbSNam
154d0 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20  e, MASTER_NAME, 
154e0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
154f0 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20 21  if( !isView && !
15500 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
15510 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 54 61  ){.    destroyTa
15520 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
15530 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d  );.  }..  /* Rem
15540 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e  ove the table en
15550 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27  try from SQLite'
15560 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  s internal schem
15570 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a  a and modify.  *
15580 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * the schema coo
15590 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  kie..  */.  if( 
155a0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
155b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
155c0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56  beAddOp4(v, OP_V
155d0 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c  Destroy, iDb, 0,
155e0 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   0, pTab->zName,
155f0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
15600 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
15610 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
15620 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
15630 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20  DropTable, iDb, 
15640 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  0, 0, pTab->zNam
15650 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  e, 0);.  sqlite3
15660 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
15670 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c  rse, iDb);.  sql
15680 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
15690 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  db, iDb);.}../*.
156a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
156b0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  is called to do 
156c0 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52  the work of a DR
156d0 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  OP TABLE stateme
156e0 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20  nt..** pName is 
156f0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
15700 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70  table to be drop
15710 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ped..*/.void sql
15720 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61  ite3DropTable(Pa
15730 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
15740 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
15750 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45   isView, int noE
15760 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  rr){.  Table *pT
15770 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ab;.  Vdbe *v;. 
15780 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
15790 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
157a0 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d   iDb;..  if( db-
157b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
157c0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
157d0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
157e0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
157f0 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73  >nErr==0 );.  as
15800 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
15810 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 73 71  c==1 );.  if( sq
15820 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
15830 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65  pParse) ) goto e
15840 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
15850 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62    if( noErr ) db
15860 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2b 2b 3b  ->suppressErr++;
15870 0a 20 20 61 73 73 65 72 74 28 20 69 73 56 69 65  .  assert( isVie
15880 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d  w==0 || isView==
15890 4c 4f 43 41 54 45 5f 56 49 45 57 20 29 3b 0a 20  LOCATE_VIEW );. 
158a0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
158b0 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70  ocateTableItem(p
158c0 50 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20 26  Parse, isView, &
158d0 70 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20  pName->a[0]);.  
158e0 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e  if( noErr ) db->
158f0 73 75 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a  suppressErr--;..
15900 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
15910 0a 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29  .    if( noErr )
15920 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
15930 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50  fyNamedSchema(pP
15940 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  arse, pName->a[0
15950 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
15960 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
15970 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44  _table;.  }.  iD
15980 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
15990 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
159a0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61  b->pSchema);.  a
159b0 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
159c0 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
159d0 0a 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73  .  /* If pTab is
159e0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
159f0 2c 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f  , call ViewGetCo
15a00 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65  lumnNames() to e
15a10 6e 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73  nsure.  ** it is
15a20 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20   initialized..  
15a30 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
15a40 61 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c 69  al(pTab) && sqli
15a50 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
15a60 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
15a70 61 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ab) ){.    goto 
15a80 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
15a90 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
15aa0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
15ab0 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
15ac0 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e  nt code;.    con
15ad0 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
15ae0 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
15af0 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
15b00 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
15b10 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  [iDb].zDbSName;.
15b20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
15b30 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69  zArg2 = 0;.    i
15b40 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
15b50 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
15b60 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
15b70 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20   0, zDb)){.     
15b80 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
15b90 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
15ba0 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
15bb0 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
15bc0 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
15bd0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
15be0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
15bf0 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  MP_VIEW;.      }
15c00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
15c10 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
15c20 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23  _VIEW;.      }.#
15c30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15c40 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
15c50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
15c60 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
15c70 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51  .      code = SQ
15c80 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45  LITE_DROP_VTABLE
15c90 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20  ;.      zArg2 = 
15ca0 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
15cb0 28 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f 64  (db, pTab)->pMod
15cc0 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a  ->zName;.#endif.
15cd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15ce0 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
15cf0 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
15d00 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
15d10 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
15d20 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
15d30 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
15d40 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  = SQLITE_DROP_TA
15d50 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
15d60 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
15d70 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
15d80 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e  se, code, pTab->
15d90 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44  zName, zArg2, zD
15da0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
15db0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
15dc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15dd0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
15de0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
15df0 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e  DELETE, pTab->zN
15e00 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
15e10 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
15e20 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
15e30 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
15e40 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
15e50 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
15e60 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
15e70 20 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33   .    && sqlite3
15e80 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
15e90 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 74  Name, "sqlite_st
15ea0 61 74 22 2c 20 31 31 29 21 3d 30 20 29 7b 0a 20  at", 11)!=0 ){. 
15eb0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15ec0 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
15ed0 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
15ee0 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e  dropped", pTab->
15ef0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
15f00 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
15f10 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
15f20 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
15f30 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50    /* Ensure DROP
15f40 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73   TABLE is not us
15f50 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e  ed on a view, an
15f60 64 20 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e  d DROP VIEW is n
15f70 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20  ot used.  ** on 
15f80 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  a table..  */.  
15f90 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54  if( isView && pT
15fa0 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
15fb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
15fc0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
15fd0 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f  se DROP TABLE to
15fe0 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73   delete table %s
15ff0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
16000 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
16010 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
16020 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
16030 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
16040 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
16050 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
16060 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64  e DROP VIEW to d
16070 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20  elete view %s", 
16080 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
16090 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
160a0 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  _table;.  }.#end
160b0 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
160c0 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
160d0 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
160e0 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
160f0 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20  .  ** on disk.. 
16100 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
16110 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
16120 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
16130 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
16140 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
16150 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20  se, 1, iDb);.   
16160 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a   if( !isView ){.
16170 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
16180 61 72 53 74 61 74 54 61 62 6c 65 73 28 70 50 61  arStatTables(pPa
16190 72 73 65 2c 20 69 44 62 2c 20 22 74 62 6c 22 2c  rse, iDb, "tbl",
161a0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
161b0 20 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44 72       sqlite3FkDr
161c0 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
161d0 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20  pName, pTab);.  
161e0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
161f0 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 70 50 61  odeDropTable(pPa
16200 72 73 65 2c 20 70 54 61 62 2c 20 69 44 62 2c 20  rse, pTab, iDb, 
16210 69 73 56 69 65 77 29 3b 0a 20 20 7d 0a 0a 65 78  isView);.  }..ex
16220 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20  it_drop_table:. 
16230 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
16240 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29  elete(db, pName)
16250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
16260 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
16270 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  d to create a ne
16280 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e  w foreign key on
16290 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75   the table.** cu
162a0 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
162b0 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72  nstruction.  pFr
162c0 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73  omCol determines
162d0 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a   which columns.*
162e0 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * in the current
162f0 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20   table point to 
16300 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e  the foreign key.
16310 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30    If pFromCol==0
16320 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74   then.** connect
16330 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20   the key to the 
16340 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65  last column inse
16350 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68  rted.  pTo is th
16360 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65  e name of.** the
16370 20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64 20   table referred 
16380 74 6f 20 28 61 2e 6b 2e 61 20 74 68 65 20 22 70  to (a.k.a the "p
16390 61 72 65 6e 74 22 20 74 61 62 6c 65 29 2e 20 20  arent" table).  
163a0 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74  pToCol is a list
163b0 0a 2a 2a 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  .** of tables in
163c0 20 74 68 65 20 70 61 72 65 6e 74 20 70 54 6f 20   the parent pTo 
163d0 74 61 62 6c 65 2e 20 20 66 6c 61 67 73 20 63 6f  table.  flags co
163e0 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e  ntains all.** in
163f0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
16400 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  the conflict res
16410 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
16420 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  ms specified.** 
16430 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45  in the ON DELETE
16440 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20  , ON UPDATE and 
16450 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65  ON INSERT clause
16460 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79  s..**.** An FKey
16470 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72   structure is cr
16480 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20  eated and added 
16490 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
164a0 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20  rently.** under 
164b0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20  construction in 
164c0 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  the pParse->pNew
164d0 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a  Table field..**.
164e0 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b  ** The foreign k
164f0 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d  ey is set for IM
16500 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69  MEDIATE processi
16510 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e  ng.  A subsequen
16520 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c  t call.** to sql
16530 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
16540 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e  Key() might chan
16550 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45 52  ge this to DEFER
16560 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  RED..*/.void sql
16570 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67  ite3CreateForeig
16580 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  nKey(.  Parse *p
16590 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
165a0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
165b0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
165c0 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c  FromCol,  /* Col
165d0 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62  umns in this tab
165e0 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  le that point to
165f0 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
16600 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20    Token *pTo,   
16610 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
16620 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  f the other tabl
16630 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
16640 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43  *pToCol,    /* C
16650 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74  olumns in the ot
16660 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  her table */.  i
16670 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
16680 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20      /* Conflict 
16690 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
166a0 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73  ithms. */.){.  s
166b0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
166c0 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66  rse->db;.#ifndef
166d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
166e0 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20  EIGN_KEY.  FKey 
166f0 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b  *pFKey = 0;.  FK
16700 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54  ey *pNextTo;.  T
16710 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65  able *p = pParse
16720 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
16730 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
16740 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20  i;.  int nCol;. 
16750 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73   char *z;..  ass
16760 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20  ert( pTo!=0 );. 
16770 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f   if( p==0 || IN_
16780 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67  DECLARE_VTAB ) g
16790 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66  oto fk_end;.  if
167a0 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
167b0 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  .    int iCol = 
167c0 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69  p->nCol-1;.    i
167d0 66 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29  f( NEVER(iCol<0)
167e0 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
167f0 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26      if( pToCol &
16800 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21  & pToCol->nExpr!
16810 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
16820 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
16830 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79  se, "foreign key
16840 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20   on %s".        
16850 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65   " should refere
16860 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c  nce only one col
16870 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22  umn of table %T"
16880 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43  ,.         p->aC
16890 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20  ol[iCol].zName, 
168a0 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  pTo);.      goto
168b0 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20   fk_end;.    }. 
168c0 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d     nCol = 1;.  }
168d0 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20  else if( pToCol 
168e0 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
168f0 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  !=pFromCol->nExp
16900 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
16910 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
16920 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72  .        "number
16930 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66   of columns in f
16940 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20  oreign key does 
16950 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75  not match the nu
16960 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20  mber of ".      
16970 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68    "columns in th
16980 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
16990 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66  le");.    goto f
169a0 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  k_end;.  }else{.
169b0 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d      nCol = pFrom
169c0 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a  Col->nExpr;.  }.
169d0 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
169e0 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c  (*pFKey) + (nCol
169f0 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79  -1)*sizeof(pFKey
16a00 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f  ->aCol[0]) + pTo
16a10 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70  ->n + 1;.  if( p
16a20 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
16a30 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e  (i=0; i<pToCol->
16a40 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
16a50 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69     nByte += sqli
16a60 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43  te3Strlen30(pToC
16a70 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20  ol->a[i].zName) 
16a80 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  + 1;.    }.  }. 
16a90 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   pFKey = sqlite3
16aa0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
16ab0 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
16ac0 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  pFKey==0 ){.    
16ad0 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
16ae0 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20  .  pFKey->pFrom 
16af0 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e  = p;.  pFKey->pN
16b00 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b  extFrom = p->pFK
16b10 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a  ey;.  z = (char*
16b20 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43  )&pFKey->aCol[nC
16b30 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54  ol];.  pFKey->zT
16b40 6f 20 3d 20 7a 3b 0a 20 20 69 66 28 20 49 4e 5f  o = z;.  if( IN_
16b50 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
16b60 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61  .    sqlite3Rena
16b70 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73  meTokenMap(pPars
16b80 65 2c 20 28 76 6f 69 64 2a 29 7a 2c 20 70 54 6f  e, (void*)z, pTo
16b90 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28  );.  }.  memcpy(
16ba0 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e  z, pTo->z, pTo->
16bb0 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20  n);.  z[pTo->n] 
16bc0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  = 0;.  sqlite3De
16bd0 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d  quote(z);.  z +=
16be0 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b   pTo->n+1;.  pFK
16bf0 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b  ey->nCol = nCol;
16c00 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
16c10 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d  =0 ){.    pFKey-
16c20 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d  >aCol[0].iFrom =
16c30 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65   p->nCol-1;.  }e
16c40 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
16c50 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
16c60 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
16c70 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
16c80 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
16c90 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
16ca0 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b  StrICmp(p->aCol[
16cb0 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43  j].zName, pFromC
16cc0 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  ol->a[i].zName)=
16cd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
16ce0 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  pFKey->aCol[i].i
16cf0 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  From = j;.      
16d00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16d10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
16d20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f     if( j>=p->nCo
16d30 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
16d40 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
16d50 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
16d60 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20  "unknown column 
16d70 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67  \"%s\" in foreig
16d80 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
16d90 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46  ", .          pF
16da0 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
16db0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
16dc0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20  o fk_end;.      
16dd0 7d 0a 20 20 20 20 20 20 69 66 28 20 49 4e 5f 52  }.      if( IN_R
16de0 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a  ENAME_OBJECT ){.
16df0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
16e00 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28  enameTokenRemap(
16e10 70 50 61 72 73 65 2c 20 26 70 46 4b 65 79 2d 3e  pParse, &pFKey->
16e20 61 43 6f 6c 5b 69 5d 2c 20 70 46 72 6f 6d 43 6f  aCol[i], pFromCo
16e30 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
16e40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16e50 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  }.  if( pToCol )
16e60 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
16e70 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
16e80 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
16e90 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f  e3Strlen30(pToCo
16ea0 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
16eb0 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
16ec0 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20  l[i].zCol = z;. 
16ed0 20 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41       if( IN_RENA
16ee0 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
16ef0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61       sqlite3Rena
16f00 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61  meTokenRemap(pPa
16f10 72 73 65 2c 20 7a 2c 20 70 54 6f 43 6f 6c 2d 3e  rse, z, pToCol->
16f20 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
16f30 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70     }.      memcp
16f40 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69  y(z, pToCol->a[i
16f50 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ].zName, n);.   
16f60 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20     z[n] = 0;.   
16f70 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20     z += n+1;.   
16f80 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e   }.  }.  pFKey->
16f90 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a  isDeferred = 0;.
16fa0 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e    pFKey->aAction
16fb0 5b 30 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73  [0] = (u8)(flags
16fc0 20 26 20 30 78 66 66 29 3b 20 20 20 20 20 20 20   & 0xff);       
16fd0 20 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54       /* ON DELET
16fe0 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46  E action */.  pF
16ff0 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20  Key->aAction[1] 
17000 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e  = (u8)((flags >>
17010 20 38 20 29 20 26 20 30 78 66 66 29 3b 20 20 20   8 ) & 0xff);   
17020 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63   /* ON UPDATE ac
17030 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tion */..  asser
17040 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
17050 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
17060 20 70 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a   p->pSchema) );.
17070 20 20 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65    pNextTo = (FKe
17080 79 20 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49  y *)sqlite3HashI
17090 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d  nsert(&p->pSchem
170a0 61 2d 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20  a->fkeyHash, .  
170b0 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20      pFKey->zTo, 
170c0 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20  (void *)pFKey.  
170d0 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f  );.  if( pNextTo
170e0 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 73  ==pFKey ){.    s
170f0 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
17100 62 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f  b);.    goto fk_
17110 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  end;.  }.  if( p
17120 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20 61 73  NextTo ){.    as
17130 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70  sert( pNextTo->p
17140 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20  PrevTo==0 );.   
17150 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20   pFKey->pNextTo 
17160 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70  = pNextTo;.    p
17170 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20  NextTo->pPrevTo 
17180 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20  = pFKey;.  }..  
17190 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65  /* Link the fore
171a0 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74  ign key to the t
171b0 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74  able as the last
171c0 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d   step..  */.  p-
171d0 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a  >pFKey = pFKey;.
171e0 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b    pFKey = 0;..fk
171f0 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44  _end:.  sqlite3D
17200 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29  bFree(db, pFKey)
17210 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ;.#endif /* !def
17220 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
17230 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f  _FOREIGN_KEY) */
17240 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
17250 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72  stDelete(db, pFr
17260 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  omCol);.  sqlite
17270 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
17280 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a  db, pToCol);.}..
17290 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
172a0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
172b0 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49  n an INITIALLY I
172c0 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54  MMEDIATE or INIT
172d0 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a  IALLY DEFERRED.*
172e0 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e  * clause is seen
172f0 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f   as part of a fo
17300 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
17310 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66  tion.  The isDef
17320 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74  erred.** paramet
17330 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54  er is 1 for INIT
17340 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61  IALLY DEFERRED a
17350 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c  nd 0 for INITIAL
17360 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a  LY IMMEDIATE..**
17370 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   The behavior of
17380 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
17390 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69  ly created forei
173a0 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74  gn key is adjust
173b0 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c  ed.** accordingl
173c0 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
173d0 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
173e0 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
173f0 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29   int isDeferred)
17400 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
17410 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
17420 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  Y.  Table *pTab;
17430 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a  .  FKey *pFKey;.
17440 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50    if( (pTab = pP
17450 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
17460 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20  ==0 || (pFKey = 
17470 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20  pTab->pFKey)==0 
17480 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
17490 72 74 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d  rt( isDeferred==
174a0 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d  0 || isDeferred=
174b0 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  =1 ); /* EV: R-3
174c0 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20  0323-21917 */.  
174d0 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
174e0 64 20 3d 20 28 75 38 29 69 73 44 65 66 65 72 72  d = (u8)isDeferr
174f0 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  ed;.#endif.}../*
17500 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
17510 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73  e that will eras
17520 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64  e and refill ind
17530 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20  ex *pIdx.  This 
17540 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e  is.** used to in
17550 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79  itialize a newly
17560 20 63 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f   created index o
17570 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74  r to recompute t
17580 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
17590 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73   an index in res
175a0 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44  ponse to a REIND
175b0 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  EX command..**.*
175c0 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65  * if memRootPage
175d0 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65   is not negative
175e0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
175f0 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77  the index is new
17600 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20  ly.** created.  
17610 54 68 65 20 72 65 67 69 73 74 65 72 20 73 70 65  The register spe
17620 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f  cified by memRoo
17630 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74  tPage contains t
17640 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
17650 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
17660 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74  dex.  If memRoot
17670 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65  Page is negative
17680 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e  , then.** the in
17690 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
176a0 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63  ts and must be c
176b0 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 62 65  leared before be
176c0 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64  ing refilled and
176d0 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67  .** the root pag
176e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
176f0 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66  index is taken f
17700 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  rom pIndex->tnum
17710 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
17720 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
17730 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
17740 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  e, Index *pIndex
17750 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67  , int memRootPag
17760 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  e){.  Table *pTa
17770 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  b = pIndex->pTab
17780 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  le;  /* The tabl
17790 65 20 74 68 61 74 20 69 73 20 69 6e 64 65 78 65  e that is indexe
177a0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20  d */.  int iTab 
177b0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
177c0 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63  ;     /* Btree c
177d0 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
177e0 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  Tab */.  int iId
177f0 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
17800 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65  ++;     /* Btree
17810 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
17820 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74   pIndex */.  int
17830 20 69 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20   iSorter;       
17840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
17850 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20  ursor opened by 
17860 4f 70 65 6e 53 6f 72 74 65 72 20 28 69 66 20 69  OpenSorter (if i
17870 6e 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20  n use) */.  int 
17880 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  addr1;          
17890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
178a0 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20  dress of top of 
178b0 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
178c0 64 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr2;            
178d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
178e0 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66  ess to jump to f
178f0 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  or next iteratio
17900 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b  n */.  int tnum;
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17920 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
17930 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  ge of index */. 
17940 20 69 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62   int iPartIdxLab
17950 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
17960 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20  /* Jump to this 
17970 6c 61 62 65 6c 20 74 6f 20 73 6b 69 70 20 61 20  label to skip a 
17980 72 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  row */.  Vdbe *v
17990 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
179a0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
179b0 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
179c0 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
179d0 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  ne */.  KeyInfo 
179e0 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20  *pKey;          
179f0 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66         /* KeyInf
17a00 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  o for index */. 
17a10 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20   int regRecord; 
17a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a30 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
17a40 69 6e 67 20 61 73 73 65 6d 62 6c 65 64 20 69 6e  ing assembled in
17a50 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  dex record */.  
17a60 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
17a70 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f  arse->db;      /
17a80 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
17a90 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
17aa0 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
17ab0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
17ac0 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  , pIndex->pSchem
17ad0 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  a);..#ifndef SQL
17ae0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
17af0 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c  ZATION.  if( sql
17b00 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
17b10 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49  arse, SQLITE_REI
17b20 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  NDEX, pIndex->zN
17b30 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62  ame, 0,.      db
17b40 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
17b50 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74  ame ) ){.    ret
17b60 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
17b70 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20  .  /* Require a 
17b80 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
17b90 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f  e table to perfo
17ba0 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  rm this operatio
17bb0 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61  n */.  sqlite3Ta
17bc0 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
17bd0 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
17be0 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   1, pTab->zName)
17bf0 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
17c00 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
17c10 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
17c20 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52  turn;.  if( memR
17c30 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ootPage>=0 ){.  
17c40 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74    tnum = memRoot
17c50 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Page;.  }else{. 
17c60 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78     tnum = pIndex
17c70 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b  ->tnum;.  }.  pK
17c80 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  ey = sqlite3KeyI
17c90 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73  nfoOfIndex(pPars
17ca0 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 61 73  e, pIndex);.  as
17cb0 73 65 72 74 28 20 70 4b 65 79 21 3d 30 20 7c 7c  sert( pKey!=0 ||
17cc0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
17cd0 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
17ce0 72 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  r );..  /* Open 
17cf0 74 68 65 20 73 6f 72 74 65 72 20 63 75 72 73 6f  the sorter curso
17d00 72 20 69 66 20 77 65 20 61 72 65 20 74 6f 20 75  r if we are to u
17d10 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53 6f  se one. */.  iSo
17d20 72 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rter = pParse->n
17d30 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  Tab++;.  sqlite3
17d40 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
17d50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 69 53 6f  _SorterOpen, iSo
17d60 72 74 65 72 2c 20 30 2c 20 70 49 6e 64 65 78 2d  rter, 0, pIndex-
17d70 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63 68 61 72 2a  >nKeyCol, (char*
17d80 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
17d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79        sqlite3Key
17da0 49 6e 66 6f 52 65 66 28 70 4b 65 79 29 2c 20 50  InfoRef(pKey), P
17db0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 2f  4_KEYINFO);..  /
17dc0 2a 20 4f 70 65 6e 20 74 68 65 20 74 61 62 6c 65  * Open the table
17dd0 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  . Loop through a
17de0 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74  ll rows of the t
17df0 61 62 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67 20  able, inserting 
17e00 69 6e 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f 72  index.  ** recor
17e10 64 73 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ds into the sort
17e20 65 72 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  er. */.  sqlite3
17e30 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
17e40 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61  , iTab, iDb, pTa
17e50 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
17e60 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
17e70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17e80 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
17e90 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   0); VdbeCoverag
17ea0 65 28 76 29 3b 0a 20 20 72 65 67 52 65 63 6f 72  e(v);.  regRecor
17eb0 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
17ec0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
17ed0 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69   sqlite3MultiWri
17ee0 74 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 73  te(pParse);..  s
17ef0 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
17f00 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 70 49  dexKey(pParse,pI
17f10 6e 64 65 78 2c 69 54 61 62 2c 72 65 67 52 65 63  ndex,iTab,regRec
17f20 6f 72 64 2c 30 2c 26 69 50 61 72 74 49 64 78 4c  ord,0,&iPartIdxL
17f30 61 62 65 6c 2c 30 2c 30 29 3b 0a 20 20 73 71 6c  abel,0,0);.  sql
17f40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17f50 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72  , OP_SorterInser
17f60 74 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52  t, iSorter, regR
17f70 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
17f80 33 52 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c  3ResolvePartIdxL
17f90 61 62 65 6c 28 70 50 61 72 73 65 2c 20 69 50 61  abel(pParse, iPa
17fa0 72 74 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20 73  rtIdxLabel);.  s
17fb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17fc0 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
17fd0 62 2c 20 61 64 64 72 31 2b 31 29 3b 20 56 64 62  b, addr1+1); Vdb
17fe0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17ff0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
18000 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
18010 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
18020 3c 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  <0 ) sqlite3Vdbe
18030 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65  AddOp2(v, OP_Cle
18040 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ar, tnum, iDb);.
18050 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18060 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op4(v, OP_OpenWr
18070 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c  ite, iIdx, tnum,
18080 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20 20   iDb, .         
18090 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
180a0 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49   *)pKey, P4_KEYI
180b0 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  NFO);.  sqlite3V
180c0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
180d0 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 28 28  PFLAG_BULKCSR|((
180e0 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 29 3f  memRootPage>=0)?
180f0 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 3a 30  OPFLAG_P2ISREG:0
18100 29 29 3b 0a 0a 20 20 61 64 64 72 31 20 3d 20 73  ));..  addr1 = s
18110 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18120 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
18130 74 2c 20 69 53 6f 72 74 65 72 2c 20 30 29 3b 20  t, iSorter, 0); 
18140 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
18150 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75 65 49  .  if( IsUniqueI
18160 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29 7b 0a  ndex(pIndex) ){.
18170 20 20 20 20 69 6e 74 20 6a 32 20 3d 20 73 71 6c      int j2 = sql
18180 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
18190 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  1);.    addr2 = 
181a0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
181b0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73  ntAddr(v);.    s
181c0 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79  qlite3VdbeVerify
181d0 41 62 6f 72 74 61 62 6c 65 28 76 2c 20 4f 45 5f  Abortable(v, OE_
181e0 41 62 6f 72 74 29 3b 0a 20 20 20 20 73 71 6c 69  Abort);.    sqli
181f0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
18200 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d  (v, OP_SorterCom
18210 70 61 72 65 2c 20 69 53 6f 72 74 65 72 2c 20 6a  pare, iSorter, j
18220 32 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20  2, regRecord,.  
18230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18240 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e         pIndex->n
18250 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76  KeyCol); VdbeCov
18260 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
18270 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74  lite3UniqueConst
18280 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 4f 45  raint(pParse, OE
18290 5f 41 62 6f 72 74 2c 20 70 49 6e 64 65 78 29 3b  _Abort, pIndex);
182a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
182b0 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32 29 3b  JumpHere(v, j2);
182c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64  .  }else{.    ad
182d0 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
182e0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
182f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
18300 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
18310 6f 72 74 65 72 44 61 74 61 2c 20 69 53 6f 72 74  orterData, iSort
18320 65 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 69  er, regRecord, i
18330 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Idx);.  sqlite3V
18340 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
18350 53 65 65 6b 45 6e 64 2c 20 69 49 64 78 29 3b 0a  SeekEnd, iIdx);.
18360 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18370 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
18380 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67 52 65  ert, iIdx, regRe
18390 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
183a0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
183b0 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
183c0 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  SULT);.  sqlite3
183d0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
183e0 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
183f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
18400 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
18410 74 65 72 4e 65 78 74 2c 20 69 53 6f 72 74 65 72  terNext, iSorter
18420 2c 20 61 64 64 72 32 29 3b 20 56 64 62 65 43 6f  , addr2); VdbeCo
18430 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
18440 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
18450 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 73  (v, addr1);..  s
18460 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
18470 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54  (v, OP_Close, iT
18480 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ab);.  sqlite3Vd
18490 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
184a0 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a 20 20 73  lose, iIdx);.  s
184b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
184c0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53  (v, OP_Close, iS
184d0 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  orter);.}../*.**
184e0 20 41 6c 6c 6f 63 61 74 65 20 68 65 61 70 20 73   Allocate heap s
184f0 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 61 6e 20  pace to hold an 
18500 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 77 69 74  Index object wit
18510 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a  h nCol columns..
18520 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74  **.** Increase t
18530 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69  he allocation si
18540 7a 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e  ze to provide an
18550 20 65 78 74 72 61 20 6e 45 78 74 72 61 20 62 79   extra nExtra by
18560 74 65 73 0a 2a 2a 20 6f 66 20 38 2d 62 79 74 65  tes.** of 8-byte
18570 20 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61   aligned space a
18580 66 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f  fter the Index o
18590 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
185a0 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f   a.** pointer to
185b0 20 74 68 69 73 20 65 78 74 72 61 20 73 70 61 63   this extra spac
185c0 65 20 69 6e 20 2a 70 70 45 78 74 72 61 2e 0a 2a  e in *ppExtra..*
185d0 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
185e0 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a  AllocateIndexObj
185f0 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ect(.  sqlite3 *
18600 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44  db,         /* D
18610 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
18620 6f 6e 20 2a 2f 0a 20 20 69 31 36 20 6e 43 6f 6c  on */.  i16 nCol
18630 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
18640 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
18650 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69  columns in the i
18660 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ndex */.  int nE
18670 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 2f  xtra,          /
18680 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
18690 73 20 6f 66 20 65 78 74 72 61 20 73 70 61 63 65  s of extra space
186a0 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63   to alloc */.  c
186b0 68 61 72 20 2a 2a 70 70 45 78 74 72 61 20 20 20  har **ppExtra   
186c0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
186d0 6f 20 74 68 65 20 22 65 78 74 72 61 22 20 73 70  o the "extra" sp
186e0 61 63 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ace */.){.  Inde
186f0 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  x *p;           
18700 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 69 6e   /* Allocated in
18710 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dex object */.  
18720 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
18730 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
18740 20 73 70 61 63 65 20 66 6f 72 20 49 6e 64 65 78   space for Index
18750 20 6f 62 6a 65 63 74 20 2b 20 61 72 72 61 79 73   object + arrays
18760 20 2a 2f 0a 0a 20 20 6e 42 79 74 65 20 3d 20 52   */..  nByte = R
18770 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64  OUND8(sizeof(Ind
18780 65 78 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  ex)) +          
18790 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72      /* Index str
187a0 75 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20  ucture  */.     
187b0 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65       ROUND8(size
187c0 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 20  of(char*)*nCol) 
187d0 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  +         /* Ind
187e0 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f  ex.azColl     */
187f0 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44  .          ROUND
18800 38 28 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29  8(sizeof(LogEst)
18810 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20  *(nCol+1) +     
18820 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 4c 6f  /* Index.aiRowLo
18830 67 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20  gEst   */.      
18840 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
18850 66 28 69 31 36 29 2a 6e 43 6f 6c 20 2b 20 20 20  f(i16)*nCol +   
18860 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
18870 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a  x.aiColumn   */.
18880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18890 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c   sizeof(u8)*nCol
188a0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
188b0 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64  * Index.aSortOrd
188c0 65 72 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  er */.  p = sqli
188d0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
188e0 64 62 2c 20 6e 42 79 74 65 20 2b 20 6e 45 78 74  db, nByte + nExt
188f0 72 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ra);.  if( p ){.
18900 20 20 20 20 63 68 61 72 20 2a 70 45 78 74 72 61      char *pExtra
18910 20 3d 20 28 28 63 68 61 72 2a 29 70 29 2b 52 4f   = ((char*)p)+RO
18920 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65  UND8(sizeof(Inde
18930 78 29 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f  x));.    p->azCo
18940 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ll = (const char
18950 2a 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74 72  **)pExtra; pExtr
18960 61 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  a += ROUND8(size
18970 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b  of(char*)*nCol);
18980 0a 20 20 20 20 70 2d 3e 61 69 52 6f 77 4c 6f 67  .    p->aiRowLog
18990 45 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70  Est = (LogEst*)p
189a0 45 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d  Extra; pExtra +=
189b0 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a   sizeof(LogEst)*
189c0 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 70 2d  (nCol+1);.    p-
189d0 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36  >aiColumn = (i16
189e0 2a 29 70 45 78 74 72 61 3b 20 20 20 20 20 20 20  *)pExtra;       
189f0 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66  pExtra += sizeof
18a00 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20  (i16)*nCol;.    
18a10 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  p->aSortOrder = 
18a20 28 75 38 2a 29 70 45 78 74 72 61 3b 0a 20 20 20  (u8*)pExtra;.   
18a30 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43   p->nColumn = nC
18a40 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 43  ol;.    p->nKeyC
18a50 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20  ol = nCol - 1;. 
18a60 20 20 20 2a 70 70 45 78 74 72 61 20 3d 20 28 28     *ppExtra = ((
18a70 63 68 61 72 2a 29 70 29 20 2b 20 6e 42 79 74 65  char*)p) + nByte
18a80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
18a90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
18aa0 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f  e a new index fo
18ab0 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20  r an SQL table. 
18ac0 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69   pName1.pName2 i
18ad0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
18ae0 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20  e index .** and 
18af0 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20  pTblList is the 
18b00 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
18b10 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
18b20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77  indexed.  Both w
18b30 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20  ill .** be NULL 
18b40 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65  for a primary ke
18b50 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68  y or an index th
18b60 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f  at is created to
18b70 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e   satisfy a.** UN
18b80 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
18b90 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20    If pTable and 
18ba0 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c  pIndex are NULL,
18bb0 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   use pParse->pNe
18bc0 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65  wTable.** as the
18bd0 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
18be0 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70  exed.  pParse->p
18bf0 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61  NewTable is a ta
18c00 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63  ble that is.** c
18c10 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
18c20 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20  onstructed by a 
18c30 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
18c40 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  tement..**.** pL
18c50 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
18c60 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
18c70 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77  ndexed.  pList w
18c80 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74  ill be NULL if t
18c90 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d  his.** is a prim
18ca0 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75  ary key or uniqu
18cb0 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e-constraint on 
18cc0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
18cd0 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20  column added.** 
18ce0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
18cf0 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
18d00 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a  struction.  .*/.
18d10 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
18d20 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  teIndex(.  Parse
18d30 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
18d40 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   All information
18d50 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73   about this pars
18d60 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  e */.  Token *pN
18d70 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72  ame1,     /* Fir
18d80 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  st part of index
18d90 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
18da0 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
18db0 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65  Name2,     /* Se
18dc0 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64  cond part of ind
18dd0 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20  ex name. May be 
18de0 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73  NULL */.  SrcLis
18df0 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20  t *pTblName, /* 
18e00 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20  Table to index. 
18e10 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  Use pParse->pNew
18e20 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20  Table if 0 */.  
18e30 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
18e40 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
18e50 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
18e60 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
18e70 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a  nError,       /*
18e80 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67   OE_Abort, OE_Ig
18e90 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65  nore, OE_Replace
18ea0 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a  , or OE_None */.
18eb0 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c    Token *pStart,
18ec0 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41       /* The CREA
18ed0 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
18ee0 67 69 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d  gins this statem
18ef0 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ent */.  Expr *p
18f00 50 49 57 68 65 72 65 2c 20 20 20 20 2f 2a 20 57  PIWhere,    /* W
18f10 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
18f20 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73 20  partial indices 
18f30 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
18f40 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20  er,     /* Sort 
18f50 6f 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79  order of primary
18f60 20 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d   key when pList=
18f70 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69  =NULL */.  int i
18f80 66 4e 6f 74 45 78 69 73 74 2c 20 20 20 20 2f 2a  fNotExist,    /*
18f90 20 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69   Omit error if i
18fa0 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
18fb0 73 74 73 20 2a 2f 0a 20 20 75 38 20 69 64 78 54  sts */.  u8 idxT
18fc0 79 70 65 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ype         /* T
18fd0 68 65 20 69 6e 64 65 78 20 74 79 70 65 20 2a 2f  he index type */
18fe0 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
18ff0 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61  b = 0;     /* Ta
19000 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
19010 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
19020 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54  ndex = 0;   /* T
19030 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
19040 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
19050 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *zName = 0;    
19060 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
19070 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e  index */.  int n
19080 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
19090 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
190a0 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65  racters in zName
190b0 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   */.  int i, j;.
190c0 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20    DbFixer sFix; 
190d0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73         /* For as
190e0 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65  signing database
190f0 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65   names to pTable
19100 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
19110 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20  derMask;   /* 1 
19120 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e  to honor DESC in
19130 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67   index.  0 to ig
19140 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  nore. */.  sqlit
19150 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
19160 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20  >db;.  Db *pDb; 
19170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19180 68 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c  he specific tabl
19190 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
191a0 20 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73   indexed databas
191b0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
191c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
191d0 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
191e0 62 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69  base that is bei
191f0 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  ng written */.  
19200 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30  Token *pName = 0
19210 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
19220 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
19230 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20  index to create 
19240 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  */.  struct Expr
19250 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74  List_item *pList
19260 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f  Item; /* For loo
19270 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20  ping over pList 
19280 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
19290 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
192a0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61        /* Space a
192b0 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 45 78  llocated for zEx
192c0 74 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  tra[] */.  int n
192d0 45 78 74 72 61 43 6f 6c 3b 20 20 20 20 20 20 20  ExtraCol;       
192e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
192f0 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 63  umber of extra c
19300 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f  olumns needed */
19310 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20  .  char *zExtra 
19320 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
19330 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61      /* Extra spa
19340 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64  ce after the Ind
19350 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49  ex object */.  I
19360 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20  ndex *pPk = 0;  
19370 20 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b      /* PRIMARY K
19380 45 59 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54  EY index for WIT
19390 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
193a0 73 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e  s */..  if( db->
193b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
193c0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
193d0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
193e0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
193f0 7d 0a 20 20 69 66 28 20 49 4e 5f 44 45 43 4c 41  }.  if( IN_DECLA
19400 52 45 5f 56 54 41 42 20 26 26 20 69 64 78 54 79  RE_VTAB && idxTy
19410 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59  pe!=SQLITE_IDXTY
19420 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 7b  PE_PRIMARYKEY ){
19430 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
19440 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
19450 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
19460 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
19470 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
19480 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
19490 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
194a0 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
194b0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
194c0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
194d0 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
194e0 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
194f0 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21  .  if( pTblName!
19500 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73  =0 ){..    /* Us
19510 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69  e the two-part i
19520 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74  ndex name to det
19530 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62  ermine the datab
19540 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73  ase .    ** to s
19550 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61  earch for the ta
19560 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74  ble. 'Fix' the t
19570 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69  able name to thi
19580 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f  s db.    ** befo
19590 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68  re looking up th
195a0 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
195b0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
195c0 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a  e1 && pName2 );.
195d0 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
195e0 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
195f0 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
19600 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
19610 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f    if( iDb<0 ) go
19620 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
19630 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
19640 28 20 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65  ( pName && pName
19650 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ->z );..#ifndef 
19660 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50  SQLITE_OMIT_TEMP
19670 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  DB.    /* If the
19680 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20   index name was 
19690 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65  unqualified, che
196a0 63 6b 20 69 66 20 74 68 65 20 74 61 62 6c 65 0a  ck if the table.
196b0 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70      ** is a temp
196c0 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73   table. If so, s
196d0 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
196e0 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20  to 1. Do not do 
196f0 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  this.    ** if i
19700 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61  nitialising a da
19710 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20  tabase schema.. 
19720 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64     */.    if( !d
19730 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
19740 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c        pTab = sql
19750 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  ite3SrcListLooku
19760 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61  p(pParse, pTblNa
19770 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
19780 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70  Name2->n==0 && p
19790 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63  Tab && pTab->pSc
197a0 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
197b0 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
197c0 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20      iDb = 1;.   
197d0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
197e0 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  f..    sqlite3Fi
197f0 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
19800 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78  rse, iDb, "index
19810 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  ", pName);.    i
19820 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  f( sqlite3FixSrc
19830 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c  List(&sFix, pTbl
19840 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Name) ){.      /
19850 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 70 61  * Because the pa
19860 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20  rser constructs 
19870 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20  pTblName from a 
19880 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65  single identifie
19890 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  r,.      ** sqli
198a0 74 65 33 46 69 78 53 72 63 4c 69 73 74 20 63 61  te3FixSrcList ca
198b0 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f  n never fail. */
198c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29  .      assert(0)
198d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
198e0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
198f0 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
19900 2c 20 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e  , 0, &pTblName->
19910 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  a[0]);.    asser
19920 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
19930 6c 65 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d  led==0 || pTab==
19940 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  0 );.    if( pTa
19950 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  b==0 ) goto exit
19960 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
19970 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26     if( iDb==1 &&
19980 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
19990 63 68 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63  chema!=pTab->pSc
199a0 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71  hema ){.      sq
199b0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
199c0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
199d0 20 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65    "cannot create
199e0 20 61 20 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e   a TEMP index on
199f0 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20   non-TEMP table 
19a00 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20  \"%s\"",.       
19a10 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29      pTab->zName)
19a20 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
19a30 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19a40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 48      }.    if( !H
19a50 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20  asRowid(pTab) ) 
19a60 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
19a70 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
19a80 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
19a90 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d   assert( pName==
19aa0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
19ab0 20 70 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20   pStart==0 );.  
19ac0 20 20 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d    pTab = pParse-
19ad0 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20  >pNewTable;.    
19ae0 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f  if( !pTab ) goto
19af0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19b00 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ex;.    iDb = sq
19b10 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
19b20 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
19b30 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62  hema);.  }.  pDb
19b40 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
19b50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
19b60 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
19b70 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
19b80 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
19b90 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
19ba0 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
19bb0 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20  ", 7)==0 .      
19bc0 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   && db->init.bus
19bd0 79 3d 3d 30 0a 23 69 66 20 53 51 4c 49 54 45 5f  y==0.#if SQLITE_
19be0 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
19bf0 49 4f 4e 0a 20 20 20 20 20 20 20 26 26 20 73 71  ION.       && sq
19c00 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61 62  lite3UserAuthTab
19c10 6c 65 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d  le(pTab->zName)=
19c20 3d 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  =0.#endif.#ifdef
19c30 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 53 51   SQLITE_ALLOW_SQ
19c40 4c 49 54 45 5f 4d 41 53 54 45 52 5f 49 4e 44 45  LITE_MASTER_INDE
19c50 58 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  X.       && sqli
19c60 74 65 33 53 74 72 49 43 6d 70 28 26 70 54 61 62  te3StrICmp(&pTab
19c70 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 6d 61 73 74  ->zName[7],"mast
19c80 65 72 22 29 21 3d 30 0a 23 65 6e 64 69 66 0a 20  er")!=0.#endif. 
19c90 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
19ca0 53 74 72 4e 49 43 6d 70 28 26 70 54 61 62 2d 3e  StrNICmp(&pTab->
19cb0 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74  zName[7],"altert
19cc0 61 62 5f 22 2c 39 29 21 3d 30 0a 20 29 7b 0a 20  ab_",9)!=0. ){. 
19cd0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
19ce0 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
19cf0 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
19d00 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e  indexed", pTab->
19d10 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
19d20 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19d30 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  ex;.  }.#ifndef 
19d40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
19d50 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
19d60 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
19d70 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
19d80 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e  se, "views may n
19d90 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
19da0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
19db0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
19dc0 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
19dd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
19de0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49  UALTABLE.  if( I
19df0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
19e00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
19e10 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
19e20 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61  irtual tables ma
19e30 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
19e40 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ");.    goto exi
19e50 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19e60 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
19e70 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e  .  ** Find the n
19e80 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
19e90 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
19ea0 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  re is not alread
19eb0 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69  y another.  ** i
19ec0 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69  ndex or table wi
19ed0 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
19ee0 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  .  .  **.  ** Ex
19ef0 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20  ception:  If we 
19f00 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
19f10 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65  names of permane
19f20 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20  nt indices from 
19f30 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  the.  ** sqlite_
19f40 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65  master table (be
19f50 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72  cause some other
19f60 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64   process changed
19f70 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64   the schema) and
19f80 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  .  ** one of the
19f90 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c   index names col
19fa0 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e  lides with the n
19fb0 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61  ame of a tempora
19fc0 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a  ry table or.  **
19fd0 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20   index, then we 
19fe0 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
19ff0 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e   process this in
1a000 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  dex..  **.  ** I
1a010 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  f pName==0 it me
1a020 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a  ans that we are.
1a030 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74    ** dealing wit
1a040 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  h a primary key 
1a050 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
1a060 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74  aint.  We have t
1a070 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a  o invent our.  *
1a080 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f  * own name..  */
1a090 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
1a0a0 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
1a0b0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1a0c0 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  (db, pName);.   
1a0d0 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
1a0e0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1a0f0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65  _index;.    asse
1a100 72 74 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20  rt( pName->z!=0 
1a110 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
1a120 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65  E_OK!=sqlite3Che
1a130 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61  ckObjectName(pPa
1a140 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  rse, zName) ){. 
1a150 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1a160 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1a170 20 7d 0a 20 20 20 20 69 66 28 20 21 49 4e 5f 52   }.    if( !IN_R
1a180 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a  ENAME_OBJECT ){.
1a190 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69        if( !db->i
1a1a0 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
1a1b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
1a1c0 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
1a1d0 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20  me, 0)!=0 ){.   
1a1e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1a1f0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1a200 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
1a210 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25   a table named %
1a220 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
1a230 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1a240 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1a250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1a260 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1a270 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
1a280 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 44 62 53 4e  Name, pDb->zDbSN
1a290 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
1a2a0 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69     if( !ifNotExi
1a2b0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
1a2c0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1a2d0 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25  pParse, "index %
1a2e0 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  s already exists
1a2f0 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
1a300 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a310 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
1a320 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
1a330 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
1a340 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
1a350 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
1a360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a370 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1a380 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
1a390 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1a3a0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e     int n;.    In
1a3b0 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  dex *pLoop;.    
1a3c0 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e  for(pLoop=pTab->
1a3d0 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f  pIndex, n=1; pLo
1a3e0 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
1a3f0 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20  >pNext, n++){}. 
1a400 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
1a410 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
1a420 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
1a430 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s_%d", pTab->zN
1a440 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28  ame, n);.    if(
1a450 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
1a460 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1a470 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
1a480 0a 0a 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74  ..    /* Automat
1a490 69 63 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 67  ic index names g
1a4a0 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 77 69  enerated from wi
1a4b0 74 68 69 6e 20 73 71 6c 69 74 65 33 5f 64 65 63  thin sqlite3_dec
1a4c0 6c 61 72 65 5f 76 74 61 62 28 29 0a 20 20 20 20  lare_vtab().    
1a4d0 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 6e 61 6d  ** must have nam
1a4e0 65 73 20 74 68 61 74 20 61 72 65 20 64 69 73 74  es that are dist
1a4f0 69 6e 63 74 20 66 72 6f 6d 20 6e 6f 72 6d 61 6c  inct from normal
1a500 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
1a510 20 6e 61 6d 65 73 2e 0a 20 20 20 20 2a 2a 20 54   names..    ** T
1a520 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61  he following sta
1a530 74 65 6d 65 6e 74 20 63 6f 6e 76 65 72 74 73 20  tement converts 
1a540 22 73 71 6c 69 74 65 33 5f 61 75 74 6f 69 6e 64  "sqlite3_autoind
1a550 65 78 2e 2e 2e 22 20 69 6e 74 6f 0a 20 20 20 20  ex..." into.    
1a560 2a 2a 20 22 73 71 6c 69 74 65 33 5f 62 75 74 6f  ** "sqlite3_buto
1a570 69 6e 64 65 78 2e 2e 2e 22 20 69 6e 20 6f 72 64  index..." in ord
1a580 65 72 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e  er to make the n
1a590 61 6d 65 73 20 64 69 73 74 69 6e 63 74 2e 0a 20  ames distinct.. 
1a5a0 20 20 20 2a 2a 20 54 68 65 20 22 76 74 61 62 5f     ** The "vtab_
1a5b0 65 72 72 2e 74 65 73 74 22 20 74 65 73 74 20 64  err.test" test d
1a5c0 65 6d 6f 6e 73 74 72 61 74 65 73 20 74 68 65 20  emonstrates the 
1a5d0 6e 65 65 64 20 6f 66 20 74 68 69 73 20 73 74 61  need of this sta
1a5e0 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69  tement. */.    i
1a5f0 66 28 20 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41  f( IN_SPECIAL_PA
1a600 52 53 45 20 29 20 7a 4e 61 6d 65 5b 37 5d 2b 2b  RSE ) zName[7]++
1a610 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
1a620 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74  k for authorizat
1a630 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e  ion to create an
1a640 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66   index..  */.#if
1a650 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a660 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
1a670 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f   if( !IN_RENAME_
1a680 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 63 6f  OBJECT ){.    co
1a690 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
1a6a0 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 3b 0a 20  pDb->zDbSName;. 
1a6b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
1a6c0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1a6d0 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
1a6e0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
1a6f0 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
1a700 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1a710 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
1a720 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f  .    i = SQLITE_
1a730 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20  CREATE_INDEX;.  
1a740 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
1a750 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69  DB && iDb==1 ) i
1a760 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
1a770 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
1a780 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1a790 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c  Check(pParse, i,
1a7a0 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e   zName, pTab->zN
1a7b0 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
1a7c0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1a7d0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
1a7e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1a7f0 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69  * If pList==0, i
1a800 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75  t means this rou
1a810 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20  tine was called 
1a820 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72  to make a primar
1a830 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f  y.  ** key out o
1a840 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  f the last colum
1a850 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  n added to the t
1a860 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
1a870 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f  ruction..  ** So
1a880 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c   create a fake l
1a890 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  ist to simulate 
1a8a0 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  this..  */.  if(
1a8b0 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
1a8c0 20 54 6f 6b 65 6e 20 70 72 65 76 43 6f 6c 3b 0a   Token prevCol;.
1a8d0 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c      Column *pCol
1a8e0 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 70   = &pTab->aCol[p
1a8f0 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20  Tab->nCol-1];.  
1a900 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
1a910 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51   |= COLFLAG_UNIQ
1a920 55 45 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  UE;.    sqlite3T
1a930 6f 6b 65 6e 49 6e 69 74 28 26 70 72 65 76 43 6f  okenInit(&prevCo
1a940 6c 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  l, pCol->zName);
1a950 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
1a960 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
1a970 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20  nd(pParse, 0,.  
1a980 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1a990 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
1a9a0 20 54 4b 5f 49 44 2c 20 26 70 72 65 76 43 6f 6c   TK_ID, &prevCol
1a9b0 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70  , 0));.    if( p
1a9c0 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
1a9d0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1a9e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
1a9f0 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  ist->nExpr==1 );
1aa00 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1aa10 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72  ListSetSortOrder
1aa20 28 70 4c 69 73 74 2c 20 73 6f 72 74 4f 72 64 65  (pList, sortOrde
1aa30 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
1aa40 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1aa50 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72  CheckLength(pPar
1aa60 73 65 2c 20 70 4c 69 73 74 2c 20 22 69 6e 64 65  se, pList, "inde
1aa70 78 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  x");.  }..  /* F
1aa80 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
1aa90 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ny bytes of spac
1aaa0 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  e are required t
1aab0 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74  o store explicit
1aac0 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65  ly.  ** specifie
1aad0 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
1aae0 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f  ence names..  */
1aaf0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1ab00 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1ab10 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
1ab20 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
1ab30 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
1ab40 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  t( pExpr!=0 );. 
1ab50 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
1ab60 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a  ==TK_COLLATE ){.
1ab70 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20        nExtra += 
1ab80 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c  (1 + sqlite3Strl
1ab90 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54  en30(pExpr->u.zT
1aba0 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20  oken));.    }.  
1abb0 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c  }..  /* .  ** Al
1abc0 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
1abd0 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a   structure. .  *
1abe0 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  nName = sqli
1abf0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
1ac00 65 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20  e);.  nExtraCol 
1ac10 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65  = pPk ? pPk->nKe
1ac20 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70 49 6e 64  yCol : 1;.  pInd
1ac30 65 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f  ex = sqlite3Allo
1ac40 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  cateIndexObject(
1ac50 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  db, pList->nExpr
1ac60 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20 20   + nExtraCol,.  
1ac70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac90 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78 74      nName + nExt
1aca0 72 61 20 2b 20 31 2c 20 26 7a 45 78 74 72 61 29  ra + 1, &zExtra)
1acb0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
1acc0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
1acd0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1ace0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73  _index;.  }.  as
1acf0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
1ad00 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65  _ALIGNMENT(pInde
1ad10 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 29 20  x->aiRowLogEst) 
1ad20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
1ad30 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
1ad40 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  T(pIndex->azColl
1ad50 29 20 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a  ) );.  pIndex->z
1ad60 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20  Name = zExtra;. 
1ad70 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65   zExtra += nName
1ad80 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70   + 1;.  memcpy(p
1ad90 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  Index->zName, zN
1ada0 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20  ame, nName+1);. 
1adb0 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20   pIndex->pTable 
1adc0 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78  = pTab;.  pIndex
1add0 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38 29  ->onError = (u8)
1ade0 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65  onError;.  pInde
1adf0 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d  x->uniqNotNull =
1ae00 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e   onError!=OE_Non
1ae10 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 64 78  e;.  pIndex->idx
1ae20 54 79 70 65 20 3d 20 69 64 78 54 79 70 65 3b 0a  Type = idxType;.
1ae30 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d    pIndex->pSchem
1ae40 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
1ae50 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e 64  .pSchema;.  pInd
1ae60 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c  ex->nKeyCol = pL
1ae70 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66  ist->nExpr;.  if
1ae80 28 20 70 50 49 57 68 65 72 65 20 29 7b 0a 20 20  ( pPIWhere ){.  
1ae90 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
1aea0 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50  SelfReference(pP
1aeb0 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 50  arse, pTab, NC_P
1aec0 61 72 74 49 64 78 2c 20 70 50 49 57 68 65 72 65  artIdx, pPIWhere
1aed0 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e 64 65 78  , 0);.    pIndex
1aee0 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 20  ->pPartIdxWhere 
1aef0 3d 20 70 50 49 57 68 65 72 65 3b 0a 20 20 20 20  = pPIWhere;.    
1af00 70 50 49 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  pPIWhere = 0;.  
1af10 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  }.  assert( sqli
1af20 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
1af30 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
1af40 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
1af50 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c   see if we shoul
1af60 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71  d honor DESC req
1af70 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63  uests on index c
1af80 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66  olumns.  */.  if
1af90 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
1afa0 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
1afb0 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
1afc0 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48  ask = -1;   /* H
1afd0 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d  onor DESC */.  }
1afe0 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72  else{.    sortOr
1aff0 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  derMask = 0;    
1b000 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a  /* Ignore DESC *
1b010 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c  /.  }..  /* Anal
1b020 79 7a 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20  yze the list of 
1b030 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
1b040 20 66 6f 72 6d 20 74 68 65 20 74 65 72 6d 73 20   form the terms 
1b050 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
1b060 0a 20 20 2a 2a 20 72 65 70 6f 72 74 20 61 6e 79  .  ** report any
1b070 20 65 72 72 6f 72 73 2e 20 20 49 6e 20 74 68 65   errors.  In the
1b080 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
1b090 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  re the expressio
1b0a0 6e 20 69 73 20 65 78 61 63 74 6c 79 0a 20 20 2a  n is exactly.  *
1b0b0 2a 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  * a table column
1b0c0 2c 20 73 74 6f 72 65 20 74 68 61 74 20 63 6f 6c  , store that col
1b0d0 75 6d 6e 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b  umn in aiColumn[
1b0e0 5d 2e 20 20 46 6f 72 20 67 65 6e 65 72 61 6c 20  ].  For general 
1b0f0 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 20 20 2a  expressions,.  *
1b100 2a 20 70 6f 70 75 6c 61 74 65 20 70 49 6e 64 65  * populate pInde
1b110 78 2d 3e 61 43 6f 6c 45 78 70 72 20 61 6e 64 20  x->aColExpr and 
1b120 73 74 6f 72 65 20 58 4e 5f 45 58 50 52 20 28 2d  store XN_EXPR (-
1b130 32 29 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d  2) in aiColumn[]
1b140 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f  ..  **.  ** TODO
1b150 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e  : Issue a warnin
1b160 67 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  g if two or more
1b170 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
1b180 69 6e 64 65 78 20 61 72 65 20 69 64 65 6e 74 69  index are identi
1b190 63 61 6c 2e 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20  cal..  ** TODO: 
1b1a0 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20  Issue a warning 
1b1b0 69 66 20 74 68 65 20 74 61 62 6c 65 20 70 72 69  if the table pri
1b1c0 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73 65 64  mary key is used
1b1d0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   as part of the.
1b1e0 20 20 2a 2a 20 69 6e 64 65 78 20 6b 65 79 2e 0a    ** index key..
1b1f0 20 20 2a 2f 0a 20 20 70 4c 69 73 74 49 74 65 6d    */.  pListItem
1b200 20 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 69   = pList->a;.  i
1b210 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
1b220 45 43 54 20 29 7b 0a 20 20 20 20 70 49 6e 64 65  ECT ){.    pInde
1b230 78 2d 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70 4c  x->aColExpr = pL
1b240 69 73 74 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  ist;.    pList =
1b250 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   0;.  }.  for(i=
1b260 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65  0; i<pIndex->nKe
1b270 79 43 6f 6c 3b 20 69 2b 2b 2c 20 70 4c 69 73 74  yCol; i++, pList
1b280 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
1b290 72 20 2a 70 43 45 78 70 72 3b 20 20 20 20 20 20  r *pCExpr;      
1b2a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b2b0 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20 65 78  he i-th index ex
1b2c0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
1b2d0 69 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f 72  int requestedSor
1b2e0 74 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20 2f  tOrder;        /
1b2f0 2a 20 41 53 43 20 6f 72 20 44 45 53 43 20 6f 6e  * ASC or DESC on
1b300 20 74 68 65 20 69 2d 74 68 20 65 78 70 72 65 73   the i-th expres
1b310 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  sion */.    cons
1b320 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20  t char *zColl;  
1b330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1b340 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1b350 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 73 71   name */..    sq
1b360 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28  lite3StringToId(
1b370 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
1b380 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1b390 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e  solveSelfReferen
1b3a0 63 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ce(pParse, pTab,
1b3b0 20 4e 43 5f 49 64 78 45 78 70 72 2c 20 70 4c 69   NC_IdxExpr, pLi
1b3c0 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 30  stItem->pExpr, 0
1b3d0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
1b3e0 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65  e->nErr ) goto e
1b3f0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1b400 3b 0a 20 20 20 20 70 43 45 78 70 72 20 3d 20 73  ;.    pCExpr = s
1b410 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
1b420 6c 6c 61 74 65 28 70 4c 69 73 74 49 74 65 6d 2d  llate(pListItem-
1b430 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  >pExpr);.    if(
1b440 20 70 43 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f   pCExpr->op!=TK_
1b450 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
1b460 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65  if( pTab==pParse
1b470 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20  ->pNewTable ){. 
1b480 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1b490 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1b4a0 65 78 70 72 65 73 73 69 6f 6e 73 20 70 72 6f 68  expressions proh
1b4b0 69 62 69 74 65 64 20 69 6e 20 50 52 49 4d 41 52  ibited in PRIMAR
1b4c0 59 20 4b 45 59 20 61 6e 64 20 22 0a 20 20 20 20  Y KEY and ".    
1b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4e0 20 20 20 20 20 20 20 20 20 20 20 20 22 55 4e 49              "UNI
1b4f0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 22  QUE constraints"
1b500 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
1b510 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1b520 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
1b530 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 43 6f   if( pIndex->aCo
1b540 6c 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  lExpr==0 ){.    
1b550 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c      pIndex->aCol
1b560 45 78 70 72 20 3d 20 70 4c 69 73 74 3b 0a 20 20  Expr = pList;.  
1b570 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b        pList = 0;
1b580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a  .      }.      j
1b590 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20   = XN_EXPR;.    
1b5a0 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
1b5b0 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 45 58 50 52 3b  mn[i] = XN_EXPR;
1b5c0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75  .      pIndex->u
1b5d0 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a  niqNotNull = 0;.
1b5e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b5f0 20 6a 20 3d 20 70 43 45 78 70 72 2d 3e 69 43 6f   j = pCExpr->iCo
1b600 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 61 73 73 65  lumn;.      asse
1b610 72 74 28 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b  rt( j<=0x7fff );
1b620 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 30 20 29  .      if( j<0 )
1b630 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 54  {.        j = pT
1b640 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
1b650 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d   }else if( pTab-
1b660 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c  >aCol[j].notNull
1b670 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
1b680 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75  Index->uniqNotNu
1b690 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ll = 0;.      }.
1b6a0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69        pIndex->ai
1b6b0 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36  Column[i] = (i16
1b6c0 29 6a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43  )j;.    }.    zC
1b6d0 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  oll = 0;.    if(
1b6e0 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
1b6f0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
1b700 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  E ){.      int n
1b710 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  Coll;.      zCol
1b720 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  l = pListItem->p
1b730 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
1b740 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71        nColl = sq
1b750 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
1b760 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  oll) + 1;.      
1b770 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d  assert( nExtra>=
1b780 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d  nColl );.      m
1b790 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 7a 43  emcpy(zExtra, zC
1b7a0 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20  oll, nColl);.   
1b7b0 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72     zColl = zExtr
1b7c0 61 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20  a;.      zExtra 
1b7d0 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  += nColl;.      
1b7e0 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b  nExtra -= nColl;
1b7f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6a  .    }else if( j
1b800 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f  >=0 ){.      zCo
1b810 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ll = pTab->aCol[
1b820 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  j].zColl;.    }.
1b830 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29      if( !zColl )
1b840 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
1b850 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 69  StrBINARY;.    i
1b860 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
1b870 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63  y && !sqlite3Loc
1b880 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
1b890 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
1b8a0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1b8b0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
1b8c0 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43  .    pIndex->azC
1b8d0 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a  oll[i] = zColl;.
1b8e0 20 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72      requestedSor
1b8f0 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74  tOrder = pListIt
1b900 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20  em->sortOrder & 
1b910 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20  sortOrderMask;. 
1b920 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74     pIndex->aSort
1b930 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72  Order[i] = (u8)r
1b940 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
1b950 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70  r;.  }..  /* App
1b960 65 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6b 65  end the table ke
1b970 79 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  y to the end of 
1b980 74 68 65 20 69 6e 64 65 78 2e 20 20 46 6f 72 20  the index.  For 
1b990 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20  WITHOUT ROWID.  
1b9a0 2a 2a 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20  ** tables (when 
1b9b0 70 50 6b 21 3d 30 29 20 74 68 69 73 20 77 69 6c  pPk!=0) this wil
1b9c0 6c 20 62 65 20 74 68 65 20 64 65 63 6c 61 72 65  l be the declare
1b9d0 64 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  d PRIMARY KEY.  
1b9e0 46 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  For.  ** normal 
1b9f0 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b  tables (when pPk
1ba00 3d 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62  ==0) this will b
1ba10 65 20 74 68 65 20 72 6f 77 69 64 2e 0a 20 20 2a  e the rowid..  *
1ba20 2f 0a 20 20 69 66 28 20 70 50 6b 20 29 7b 0a 20  /.  if( pPk ){. 
1ba30 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50     for(j=0; j<pP
1ba40 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29  k->nKeyCol; j++)
1ba50 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  {.      int x = 
1ba60 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  pPk->aiColumn[j]
1ba70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ba80 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  x>=0 );.      if
1ba90 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49 6e 64  ( hasColumn(pInd
1baa0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49  ex->aiColumn, pI
1bab0 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78  ndex->nKeyCol, x
1bac0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  ) ){.        pIn
1bad0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20  dex->nColumn--; 
1bae0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1baf0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69        pIndex->ai
1bb00 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20  Column[i] = x;. 
1bb10 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61         pIndex->a
1bb20 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e  zColl[i] = pPk->
1bb30 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  azColl[j];.     
1bb40 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74     pIndex->aSort
1bb50 4f 72 64 65 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e  Order[i] = pPk->
1bb60 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20  aSortOrder[j];. 
1bb70 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
1bb80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
1bb90 73 65 72 74 28 20 69 3d 3d 70 49 6e 64 65 78 2d  sert( i==pIndex-
1bba0 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65  >nColumn );.  }e
1bbb0 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  lse{.    pIndex-
1bbc0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58  >aiColumn[i] = X
1bbd0 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 70 49 6e  N_ROWID;.    pIn
1bbe0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
1bbf0 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
1bc00 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  Y;.  }.  sqlite3
1bc10 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49  DefaultRowEst(pI
1bc20 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 70 50 61  ndex);.  if( pPa
1bc30 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d  rse->pNewTable==
1bc40 30 20 29 20 65 73 74 69 6d 61 74 65 49 6e 64 65  0 ) estimateInde
1bc50 78 57 69 64 74 68 28 70 49 6e 64 65 78 29 3b 0a  xWidth(pIndex);.
1bc60 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e  .  /* If this in
1bc70 64 65 78 20 63 6f 6e 74 61 69 6e 73 20 65 76 65  dex contains eve
1bc80 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 74 73  ry column of its
1bc90 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 72   table, then mar
1bca0 6b 0a 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63  k.  ** it as a c
1bcb0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f  overing index */
1bcc0 0a 20 20 61 73 73 65 72 74 28 20 48 61 73 52 6f  .  assert( HasRo
1bcd0 77 69 64 28 70 54 61 62 29 20 0a 20 20 20 20 20  wid(pTab) .     
1bce0 20 7c 7c 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c   || pTab->iPKey<
1bcf0 30 20 7c 7c 20 73 71 6c 69 74 65 33 43 6f 6c 75  0 || sqlite3Colu
1bd00 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65 78  mnOfIndex(pIndex
1bd10 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79 29 3e 3d  , pTab->iPKey)>=
1bd20 30 20 29 3b 0a 20 20 72 65 63 6f 6d 70 75 74 65  0 );.  recompute
1bd30 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65 78 65  ColumnsNotIndexe
1bd40 64 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28  d(pIndex);.  if(
1bd50 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 26 26 20   pTblName!=0 && 
1bd60 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  pIndex->nColumn>
1bd70 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  =pTab->nCol ){. 
1bd80 20 20 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76     pIndex->isCov
1bd90 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 66  ering = 1;.    f
1bda0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
1bdb0 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
1bdc0 20 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69    if( j==pTab->i
1bdd0 50 4b 65 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b  PKey ) continue;
1bde0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1bdf0 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
1be00 70 49 6e 64 65 78 2c 6a 29 3e 3d 30 20 29 20 63  pIndex,j)>=0 ) c
1be10 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
1be20 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e  Index->isCoverin
1be30 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  g = 0;.      bre
1be40 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
1be50 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73   if( pTab==pPars
1be60 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a  e->pNewTable ){.
1be70 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74      /* This rout
1be80 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c  ine has been cal
1be90 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e  led to create an
1bea0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
1beb0 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73   as a.    ** res
1bec0 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59  ult of a PRIMARY
1bed0 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
1bee0 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d  lause on a colum
1bef0 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72  n definition, or
1bf00 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52  .    ** a PRIMAR
1bf10 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
1bf20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67  clause following
1bf30 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69   the column defi
1bf40 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20  nitions..    ** 
1bf50 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20  i.e. one of:.   
1bf60 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54   **.    ** CREAT
1bf70 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d  E TABLE t(x PRIM
1bf80 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20  ARY KEY, y);.   
1bf90 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
1bfa0 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28   t(x, y, UNIQUE(
1bfb0 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20  x, y));.    **. 
1bfc0 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79     ** Either way
1bfd0 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
1bfe0 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
1bff0 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e 20  ady has such an 
1c000 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a  index. If.    **
1c010 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65   so, don't bothe
1c020 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73 20  r creating this 
1c030 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61  one. This only a
1c040 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a  pplies to.    **
1c050 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
1c060 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20  reated indices. 
1c070 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20  Users can do as 
1c080 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a 20  they wish with. 
1c090 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69     ** explicit i
1c0a0 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20  ndices..    **. 
1c0b0 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45     ** Two UNIQUE
1c0c0 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20   or PRIMARY KEY 
1c0d0 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
1c0e0 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69 76  considered equiv
1c0f0 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e  alent.    ** (an
1c100 64 20 74 68 75 73 20 73 75 70 70 72 65 73 73 69  d thus suppressi
1c110 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e  ng the second on
1c120 65 29 20 65 76 65 6e 20 69 66 20 74 68 65 79 20  e) even if they 
1c130 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 20  have different. 
1c140 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72     ** sort order
1c150 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
1c160 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
1c170 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e  fferent collatin
1c180 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20 69  g sequences or i
1c190 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
1c1a0 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73  .    ** the cons
1c1b0 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e 20  traint occur in 
1c1c0 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 73  different orders
1c1d0 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74  , then the const
1c1e0 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20 2a  raints are.    *
1c1f0 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73  * considered dis
1c200 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20 72  tinct and both r
1c210 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61 74  esult in separat
1c220 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a  e indices..    *
1c230 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
1c240 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
1c250 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
1c260 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
1c270 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
1c280 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   k;.      assert
1c290 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  ( IsUniqueIndex(
1c2a0 70 49 64 78 29 20 29 3b 0a 20 20 20 20 20 20 61  pIdx) );.      a
1c2b0 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 64 78  ssert( pIdx->idx
1c2c0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58  Type!=SQLITE_IDX
1c2d0 54 59 50 45 5f 41 50 50 44 45 46 20 29 3b 0a 20  TYPE_APPDEF );. 
1c2e0 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73 55       assert( IsU
1c2f0 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65  niqueIndex(pInde
1c300 78 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  x) );..      if(
1c310 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d   pIdx->nKeyCol!=
1c320 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20  pIndex->nKeyCol 
1c330 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1c340 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64    for(k=0; k<pId
1c350 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29  x->nKeyCol; k++)
1c360 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
1c370 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20  char *z1;.      
1c380 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
1c390 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1c3a0 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
1c3b0 5b 6b 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  [k]>=0 );.      
1c3c0 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
1c3d0 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d  lumn[k]!=pIndex-
1c3e0 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62  >aiColumn[k] ) b
1c3f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31  reak;.        z1
1c400 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
1c410 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d  k];.        z2 =
1c420 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1c430 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k];.        if( 
1c440 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1c450 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a  1, z2) ) break;.
1c460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1c470 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  ( k==pIdx->nKeyC
1c480 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ol ){.        if
1c490 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
1c4a0 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  =pIndex->onError
1c4b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1c4c0 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   This constraint
1c4d0 20 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d   creates the sam
1c4e0 65 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65  e index as a pre
1c4f0 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20  vious.          
1c500 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70  ** constraint sp
1c510 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72  ecified somewher
1c520 65 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  e in the CREATE 
1c530 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
1c540 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f  .          ** Ho
1c550 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e  wever the ON CON
1c560 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72  FLICT clauses ar
1c570 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20  e different. If 
1c580 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20  both this .     
1c590 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
1c5a0 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69  nt and the previ
1c5b0 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63  ous equivalent c
1c5c0 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65  onstraint have e
1c5d0 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20  xplicit.        
1c5e0 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54    ** ON CONFLICT
1c5f0 20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73   clauses this is
1c600 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72   an error. Other
1c610 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20  wise, use the.  
1c620 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69          ** expli
1c630 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20  citly specified 
1c640 62 65 68 61 76 69 6f 72 20 66 6f 72 20 74 68 65  behavior for the
1c650 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
1c660 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
1c670 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72  f( !(pIdx->onErr
1c680 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c  or==OE_Default |
1c690 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  | pIndex->onErro
1c6a0 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29  r==OE_Default) )
1c6b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1c6c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1c6d0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
1c6e0 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74         "conflict
1c6f0 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  ing ON CONFLICT 
1c700 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65  clauses specifie
1c710 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  d", 0);.        
1c720 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
1c730 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
1c740 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20  =OE_Default ){. 
1c750 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
1c760 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65  >onError = pInde
1c770 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  x->onError;.    
1c780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c790 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 64  }.        if( id
1c7a0 78 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44  xType==SQLITE_ID
1c7b0 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59  XTYPE_PRIMARYKEY
1c7c0 20 29 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65   ) pIdx->idxType
1c7d0 20 3d 20 69 64 78 54 79 70 65 3b 0a 20 20 20 20   = idxType;.    
1c7e0 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
1c7f0 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
1c800 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
1c810 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  ext = pParse->pN
1c820 65 77 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20  ewIndex;.       
1c830 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49     pParse->pNewI
1c840 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20  ndex = pIndex;. 
1c850 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20           pIndex 
1c860 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
1c870 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
1c880 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1c890 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1c8a0 0a 0a 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41  ..  if( !IN_RENA
1c8b0 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 0a 20 20  ME_OBJECT ){..  
1c8c0 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65    /* Link the ne
1c8d0 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  w Index structur
1c8e0 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61  e to its table a
1c8f0 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a  nd to the other.
1c900 20 20 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79      ** in-memory
1c910 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
1c920 75 72 65 73 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ures. .    */.  
1c930 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1c940 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20  ->nErr==0 );.   
1c950 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
1c960 73 79 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65  sy ){.      Inde
1c970 78 20 2a 70 3b 0a 20 20 20 20 20 20 61 73 73 65  x *p;.      asse
1c980 72 74 28 20 21 49 4e 5f 53 50 45 43 49 41 4c 5f  rt( !IN_SPECIAL_
1c990 50 41 52 53 45 20 29 3b 0a 20 20 20 20 20 20 61  PARSE );.      a
1c9a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
1c9b0 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
1c9c0 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  , 0, pIndex->pSc
1c9d0 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 69  hema) );.      i
1c9e0 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
1c9f0 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
1ca00 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69  ->tnum = db->ini
1ca10 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 20  t.newTnum;.     
1ca20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e     if( sqlite3In
1ca30 64 65 78 48 61 73 44 75 70 6c 69 63 61 74 65 52  dexHasDuplicateR
1ca40 6f 6f 74 50 61 67 65 28 70 49 6e 64 65 78 29 20  ootPage(pIndex) 
1ca50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
1ca60 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1ca70 72 73 65 2c 20 22 69 6e 76 61 6c 69 64 20 72 6f  rse, "invalid ro
1ca80 6f 74 70 61 67 65 22 29 3b 0a 20 20 20 20 20 20  otpage");.      
1ca90 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
1caa0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1cab0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
1cac0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1cad0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20  _index;.        
1cae0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1caf0 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
1cb00 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70  nsert(&pIndex->p
1cb10 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
1cb20 20 0a 20 20 20 20 20 20 20 20 20 20 70 49 6e 64   .          pInd
1cb30 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65  ex->zName, pInde
1cb40 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 20  x);.      if( p 
1cb50 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1cb60 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20  t( p==pIndex ); 
1cb70 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
1cb80 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
1cb90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f         sqlite3Oo
1cba0 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
1cbb0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1cbc0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1cbd0 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6d 44    }.      db->mD
1cbe0 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47  bFlags |= DBFLAG
1cbf0 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20  _SchemaChange;. 
1cc00 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1cc10 74 68 69 73 20 69 73 20 74 68 65 20 69 6e 69 74  this is the init
1cc20 69 61 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58  ial CREATE INDEX
1cc30 20 73 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 43   statement (or C
1cc40 52 45 41 54 45 20 54 41 42 4c 45 20 69 66 20 74  REATE TABLE if t
1cc50 68 65 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  he.    ** index 
1cc60 69 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e  is an implied in
1cc70 64 65 78 20 66 6f 72 20 61 20 55 4e 49 51 55 45  dex for a UNIQUE
1cc80 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20   or PRIMARY KEY 
1cc90 63 6f 6e 73 74 72 61 69 6e 74 29 20 74 68 65 6e  constraint) then
1cca0 0a 20 20 20 20 2a 2a 20 65 6d 69 74 20 63 6f 64  .    ** emit cod
1ccb0 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  e to allocate th
1ccc0 65 20 69 6e 64 65 78 20 72 6f 6f 74 70 61 67 65  e index rootpage
1ccd0 20 6f 6e 20 64 69 73 6b 20 61 6e 64 20 6d 61 6b   on disk and mak
1cce0 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 0a 20  e an entry for. 
1ccf0 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20     ** the index 
1cd00 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  in the sqlite_ma
1cd10 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 70  ster table and p
1cd20 6f 70 75 6c 61 74 65 20 74 68 65 20 69 6e 64 65  opulate the inde
1cd30 78 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 63 6f  x with.    ** co
1cd40 6e 74 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20  ntent.  But, do 
1cd50 6e 6f 74 20 64 6f 20 74 68 69 73 20 69 66 20 77  not do this if w
1cd60 65 20 61 72 65 20 73 69 6d 70 6c 79 20 72 65 61  e are simply rea
1cd70 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
1cd80 6d 61 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 61  master.    ** ta
1cd90 62 6c 65 20 74 6f 20 70 61 72 73 65 20 74 68 65  ble to parse the
1cda0 20 73 63 68 65 6d 61 2c 20 6f 72 20 69 66 20 74   schema, or if t
1cdb0 68 69 73 20 69 6e 64 65 78 20 69 73 20 74 68 65  his index is the
1cdc0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
1cdd0 65 78 0a 20 20 20 20 2a 2a 20 6f 66 20 61 20 57  ex.    ** of a W
1cde0 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
1cdf0 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
1ce00 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  * If pTblName==0
1ce10 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69   it means this i
1ce20 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65  ndex is generate
1ce30 64 20 61 73 20 61 6e 20 69 6d 70 6c 69 65 64 20  d as an implied 
1ce40 50 52 49 4d 41 52 59 20 4b 45 59 0a 20 20 20 20  PRIMARY KEY.    
1ce50 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64  ** or UNIQUE ind
1ce60 65 78 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ex in a CREATE T
1ce70 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
1ce80 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65   Since the table
1ce90 0a 20 20 20 20 2a 2a 20 68 61 73 20 6a 75 73 74  .    ** has just
1cea0 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69   been created, i
1ceb0 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61  t contains no da
1cec0 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ta and the index
1ced0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
1cee0 20 20 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20      ** step can 
1cef0 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20  be skipped..    
1cf00 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
1cf10 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c  HasRowid(pTab) |
1cf20 7c 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  | pTblName!=0 ){
1cf30 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  .      Vdbe *v;.
1cf40 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d        char *zStm
1cf50 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 65  t;.      int iMe
1cf60 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
1cf70 65 6d 3b 0a 0a 20 20 20 20 20 20 76 20 3d 20 73  em;..      v = s
1cf80 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1cf90 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  arse);.      if(
1cfa0 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69   v==0 ) goto exi
1cfb0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1cfc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
1cfd0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
1cfe0 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
1cff0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65  );..      /* Cre
1d000 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65  ate the rootpage
1d010 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 75   for the index u
1d020 73 69 6e 67 20 43 72 65 61 74 65 49 6e 64 65 78  sing CreateIndex
1d030 2e 20 42 75 74 20 62 65 66 6f 72 65 0a 20 20 20  . But before.   
1d040 20 20 20 2a 2a 20 64 6f 69 6e 67 20 73 6f 2c 20     ** doing so, 
1d050 63 6f 64 65 20 61 20 4e 6f 6f 70 20 69 6e 73 74  code a Noop inst
1d060 72 75 63 74 69 6f 6e 20 61 6e 64 20 73 74 6f 72  ruction and stor
1d070 65 20 69 74 73 20 61 64 64 72 65 73 73 20 69 6e  e its address in
1d080 20 0a 20 20 20 20 20 20 2a 2a 20 49 6e 64 65 78   .      ** Index
1d090 2e 74 6e 75 6d 2e 20 54 68 69 73 20 69 73 20 72  .tnum. This is r
1d0a0 65 71 75 69 72 65 64 20 69 6e 20 63 61 73 65 20  equired in case 
1d0b0 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 63  this index is ac
1d0c0 74 75 61 6c 6c 79 20 61 20 0a 20 20 20 20 20 20  tually a .      
1d0d0 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61  ** PRIMARY KEY a
1d0e0 6e 64 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  nd the table is 
1d0f0 61 63 74 75 61 6c 6c 79 20 61 20 57 49 54 48 4f  actually a WITHO
1d100 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20  UT ROWID table. 
1d110 49 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  In .      ** tha
1d120 74 20 63 61 73 65 20 74 68 65 20 63 6f 6e 76 65  t case the conve
1d130 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64  rtToWithoutRowid
1d140 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 20  Table() routine 
1d150 77 69 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20 20  will replace.   
1d160 20 20 20 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77     ** the Noop w
1d170 69 74 68 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75  ith a Goto to ju
1d180 6d 70 20 6f 76 65 72 20 74 68 65 20 56 44 42 45  mp over the VDBE
1d190 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
1d1a0 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  below. */.      
1d1b0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 73  pIndex->tnum = s
1d1c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
1d1d0 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20  (v, OP_Noop);.  
1d1e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d1f0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65 61  ddOp3(v, OP_Crea
1d200 74 65 42 74 72 65 65 2c 20 69 44 62 2c 20 69 4d  teBtree, iDb, iM
1d210 65 6d 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45  em, BTREE_BLOBKE
1d220 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 61  Y);..      /* Ga
1d230 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  ther the complet
1d240 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
1d250 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1d260 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 20 20  ment into.      
1d270 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72  ** the zStmt var
1d280 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20  iable.      */. 
1d290 20 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20       if( pStart 
1d2a0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
1d2b0 20 3d 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d   = (int)(pParse-
1d2c0 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20  >sLastToken.z - 
1d2d0 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72  pName->z) + pPar
1d2e0 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e  se->sLastToken.n
1d2f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
1d300 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27  ame->z[n-1]==';'
1d310 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20   ) n--;.        
1d320 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78  /* A named index
1d330 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69   with an explici
1d340 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  t CREATE INDEX s
1d350 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
1d360 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69      zStmt = sqli
1d370 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1d380 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25  CREATE%s INDEX %
1d390 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  .*s",.          
1d3a0 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f    onError==OE_No
1d3b0 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51  ne ? "" : " UNIQ
1d3c0 55 45 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a  UE", n, pName->z
1d3d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1d3e0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75          /* An au
1d3f0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72  tomatic index cr
1d400 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41  eated by a PRIMA
1d410 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
1d420 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
1d430 20 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20         /* zStmt 
1d440 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
1d450 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20  (""); */.       
1d460 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   zStmt = 0;.    
1d470 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 64    }..      /* Ad
1d480 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71  d an entry in sq
1d490 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20  lite_master for 
1d4a0 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 20  this index.     
1d4b0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1d4c0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
1d4d0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
1d4e0 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e  "INSERT INTO %Q.
1d4f0 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78  %s VALUES('index
1d500 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b  ',%Q,%Q,#%d,%Q);
1d510 22 2c 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  ",.          db-
1d520 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
1d530 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c  me, MASTER_NAME,
1d540 0a 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65  .          pInde
1d550 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  x->zName,.      
1d560 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
1d570 0a 20 20 20 20 20 20 20 20 20 20 69 4d 65 6d 2c  .          iMem,
1d580 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 6d 74  .          zStmt
1d590 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
1d5a0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1d5b0 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20  e(db, zStmt);.. 
1d5c0 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65       /* Fill the
1d5d0 20 69 6e 64 65 78 20 77 69 74 68 20 64 61 74 61   index with data
1d5e0 20 61 6e 64 20 72 65 70 61 72 73 65 20 74 68 65   and reparse the
1d5f0 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e   schema. Code an
1d600 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20 20   OP_Expire.     
1d610 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74   ** to invalidat
1d620 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c  e all pre-compil
1d630 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
1d640 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1d650 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20  ( pTblName ){.  
1d660 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
1d670 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
1d680 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a   pIndex, iMem);.
1d690 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
1d6a0 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
1d6b0 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
1d6c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d6d0 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c  ParseSchemaOp(v,
1d6e0 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20   iDb,.          
1d6f0 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
1d700 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20  (db, "name='%q' 
1d710 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27  AND type='index'
1d720 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ", pIndex->zName
1d730 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
1d740 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d750 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c 20 31   OP_Expire, 0, 1
1d760 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
1d770 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1d780 70 48 65 72 65 28 76 2c 20 70 49 6e 64 65 78 2d  pHere(v, pIndex-
1d790 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  >tnum);.    }.  
1d7a0 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64  }..  /* When add
1d7b0 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ing an index to 
1d7c0 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69  the list of indi
1d7d0 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c  ces for a table,
1d7e0 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20   make.  ** sure 
1d7f0 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65  all indices labe
1d800 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63  led OE_Replace c
1d810 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68  ome after all th
1d820 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a  ose labeled.  **
1d830 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69   OE_Ignore.  Thi
1d840 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66  s is necessary f
1d850 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 63  or the correct c
1d860 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a  onstraint check.
1d870 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
1d880 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72  (in sqlite3Gener
1d890 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65  ateConstraintChe
1d8a0 63 6b 73 28 29 29 20 61 73 20 70 61 72 74 20 6f  cks()) as part o
1d8b0 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e  f.  ** UPDATE an
1d8c0 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  d INSERT stateme
1d8d0 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66  nts.  .  */.  if
1d8e0 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
1d8f0 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29  || pTblName==0 )
1d900 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f  {.    if( onErro
1d910 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c  r!=OE_Replace ||
1d920 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30   pTab->pIndex==0
1d930 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61  .         || pTa
1d940 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  b->pIndex->onErr
1d950 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b  or==OE_Replace){
1d960 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
1d970 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
1d980 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  dex;.      pTab-
1d990 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
1d9a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d9b0 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72     Index *pOther
1d9c0 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
1d9d0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f  .      while( pO
1d9e0 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70  ther->pNext && p
1d9f0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e  Other->pNext->on
1da00 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
1da10 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74  e ){.        pOt
1da20 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  her = pOther->pN
1da30 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
1da40 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
1da50 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
1da60 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e  ;.      pOther->
1da70 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a  pNext = pIndex;.
1da80 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
1da90 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 65 6c 73 65   = 0;.  }.  else
1daa0 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
1dab0 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73  BJECT ){.    ass
1dac0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65  ert( pParse->pNe
1dad0 77 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20  wIndex==0 );.   
1dae0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64   pParse->pNewInd
1daf0 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  ex = pIndex;.   
1db00 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d   pIndex = 0;.  }
1db10 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20  ..  /* Clean up 
1db20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
1db30 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  /.exit_create_in
1db40 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65  dex:.  if( pInde
1db50 78 20 29 20 73 71 6c 69 74 65 33 46 72 65 65 49  x ) sqlite3FreeI
1db60 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
1db70 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
1db80 65 6c 65 74 65 28 64 62 2c 20 70 50 49 57 68 65  elete(db, pPIWhe
1db90 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  re);.  sqlite3Ex
1dba0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
1dbb0 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74   pList);.  sqlit
1dbc0 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
1dbd0 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  db, pTblName);. 
1dbe0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1dbf0 62 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  b, zName);.}../*
1dc00 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64  .** Fill the Ind
1dc10 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72  ex.aiRowEst[] ar
1dc20 72 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74  ray with default
1dc30 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69   information - i
1dc40 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f  nformation.** to
1dc50 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65   be used when we
1dc60 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68   have not run th
1dc70 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e  e ANALYZE comman
1dc80 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73  d..**.** aiRowEs
1dc90 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 64  t[0] is supposed
1dca0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1dcb0 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
1dcc0 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  ts in the index.
1dcd0 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20  .** Since we do 
1dce0 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20  not know, guess 
1dcf0 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f  1 million.  aiRo
1dd00 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73  wEst[1] is an es
1dd10 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a  timate of the.**
1dd20 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1dd30 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  in the table tha
1dd40 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
1dd50 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20  icular value of 
1dd60 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c  the.** first col
1dd70 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
1dd80 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69  .  aiRowEst[2] i
1dd90 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
1dda0 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
1ddb0 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63  f rows that matc
1ddc0 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  h any particular
1ddd0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
1dde0 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75  the first 2 colu
1ddf0 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e  mns.** of the in
1de00 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  dex.  And so for
1de10 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77  th.  It must alw
1de20 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20  ays be the case 
1de30 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20  that.*.**       
1de40 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c      aiRowEst[N]<
1de50 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a  =aiRowEst[N-1].*
1de60 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f  *           aiRo
1de70 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a  wEst[N]>=1.**.**
1de80 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74   Apart from that
1de90 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65  , we have little
1dea0 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65   to go on beside
1deb0 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74  s intuition as t
1dec0 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73  o.** how aiRowEs
1ded0 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  t[] should be in
1dee0 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20  itialized.  The 
1def0 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65  numbers generate
1df00 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61  d here.** are ba
1df10 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76  sed on typical v
1df20 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61  alues found in a
1df30 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a  ctual indices..*
1df40 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
1df50 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65  faultRowEst(Inde
1df60 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20  x *pIdx){.  /*  
1df70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 30                10
1df80 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c 20 20 36  ,  9,  8,  7,  6
1df90 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56 61   */.  LogEst aVa
1dfa0 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20  l[] = { 33, 32, 
1dfb0 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20  30, 28, 26 };.  
1dfc0 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70 49 64 78  LogEst *a = pIdx
1dfd0 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  ->aiRowLogEst;. 
1dfe0 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e   int nCopy = MIN
1dff0 28 41 72 72 61 79 53 69 7a 65 28 61 56 61 6c 29  (ArraySize(aVal)
1e000 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29  , pIdx->nKeyCol)
1e010 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  ;.  int i;..  /*
1e020 20 49 6e 64 65 78 65 73 20 77 69 74 68 20 64 65   Indexes with de
1e030 66 61 75 6c 74 20 72 6f 77 20 65 73 74 69 6d 61  fault row estima
1e040 74 65 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68  tes should not h
1e050 61 76 65 20 73 74 61 74 31 20 64 61 74 61 20 2a  ave stat1 data *
1e060 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 49 64  /.  assert( !pId
1e070 78 2d 3e 68 61 73 53 74 61 74 31 20 29 3b 0a 0a  x->hasStat1 );..
1e080 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72    /* Set the fir
1e090 73 74 20 65 6e 74 72 79 20 28 6e 75 6d 62 65 72  st entry (number
1e0a0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1e0b0 69 6e 64 65 78 29 20 74 6f 20 74 68 65 20 65 73  index) to the es
1e0c0 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e 75  timated .  ** nu
1e0d0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
1e0e0 74 68 65 20 74 61 62 6c 65 2c 20 6f 72 20 68 61  the table, or ha
1e0f0 6c 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  lf the number of
1e100 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
1e110 6c 65 0a 20 20 2a 2a 20 66 6f 72 20 61 20 70 61  le.  ** for a pa
1e120 72 74 69 61 6c 20 69 6e 64 65 78 2e 20 20 20 42  rtial index.   B
1e130 75 74 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68  ut do not let th
1e140 65 20 65 73 74 69 6d 61 74 65 20 64 72 6f 70 20  e estimate drop 
1e150 62 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a 20 20 61  below 10. */.  a
1e160 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  [0] = pIdx->pTab
1e170 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a  le->nRowLogEst;.
1e180 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72    if( pIdx->pPar
1e190 74 49 64 78 57 68 65 72 65 21 3d 30 20 29 20 61  tIdxWhere!=0 ) a
1e1a0 5b 30 5d 20 2d 3d 20 31 30 3b 20 20 61 73 73 65  [0] -= 10;  asse
1e1b0 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 10==sqlite3L
1e1c0 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 69 66  ogEst(2) );.  if
1e1d0 28 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d  ( a[0]<33 ) a[0]
1e1e0 20 3d 20 33 33 3b 20 20 20 20 20 20 20 20 20 20   = 33;          
1e1f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1e200 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  33==sqlite3LogEs
1e210 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45  t(10) );..  /* E
1e220 73 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b 31  stimate that a[1
1e230 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69 73  ] is 10, a[2] is
1e240 20 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20 61   9, a[3] is 8, a
1e250 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20 69  [4] is 7, a[5] i
1e260 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61 63  s.  ** 6 and eac
1e270 68 20 73 75 62 73 65 71 75 65 6e 74 20 76 61 6c  h subsequent val
1e280 75 65 20 28 69 66 20 61 6e 79 29 20 69 73 20 35  ue (if any) is 5
1e290 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26  .  */.  memcpy(&
1e2a0 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70  a[1], aVal, nCop
1e2b0 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29  y*sizeof(LogEst)
1e2c0 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79  );.  for(i=nCopy
1e2d0 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65  +1; i<=pIdx->nKe
1e2e0 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
1e2f0 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20 20  a[i] = 23;      
1e300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1e310 73 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74 65  sert( 23==sqlite
1e320 33 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20 20  3LogEst(5) );.  
1e330 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  }..  assert( 0==
1e340 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29  sqlite3LogEst(1)
1e350 20 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71   );.  if( IsUniq
1e360 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 20  ueIndex(pIdx) ) 
1e370 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d  a[pIdx->nKeyCol]
1e380 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
1e390 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1e3a0 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e   drop an existin
1e3b0 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20  g named index.  
1e3c0 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
1e3d0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44  implements the D
1e3e0 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ROP INDEX statem
1e3f0 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
1e400 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61  ite3DropIndex(Pa
1e410 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
1e420 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
1e430 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e   ifExists){.  In
1e440 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56  dex *pIndex;.  V
1e450 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
1e460 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1e470 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
1e480 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1e490 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f  ->nErr==0 );   /
1e4a0 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77  * Never called w
1e4b0 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73  ith prior errors
1e4c0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
1e4d0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1e4e0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1e4f0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73  _index;.  }.  as
1e500 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
1e510 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51  c==1 );.  if( SQ
1e520 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
1e530 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
1e540 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  e) ){.    goto e
1e550 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1e560 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
1e570 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
1e580 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  db, pName->a[0].
1e590 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
1e5a0 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
1e5b0 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
1e5c0 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69  {.    if( !ifExi
1e5d0 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  sts ){.      sql
1e5e0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1e5f0 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  rse, "no such in
1e600 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c  dex: %S", pName,
1e610 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1e620 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
1e630 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
1e640 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  ma(pParse, pName
1e650 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
1e660 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
1e670 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
1e680 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65   = 1;.    goto e
1e690 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1e6a0 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78    }.  if( pIndex
1e6b0 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54  ->idxType!=SQLIT
1e6c0 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46  E_IDXTYPE_APPDEF
1e6d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1e6e0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1e6f0 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65  "index associate
1e700 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a  d with UNIQUE ".
1e710 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52        "or PRIMAR
1e720 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
1e730 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70   cannot be dropp
1e740 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74  ed", 0);.    got
1e750 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1e760 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  x;.  }.  iDb = s
1e770 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
1e780 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e  dex(db, pIndex->
1e790 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65  pSchema);.#ifnde
1e7a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1e7b0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
1e7c0 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53      int code = S
1e7d0 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58  QLITE_DROP_INDEX
1e7e0 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
1e7f0 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  b = pIndex->pTab
1e800 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le;.    const ch
1e810 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
1e820 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  b[iDb].zDbSName;
1e830 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1e840 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
1e850 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69  ABLE(iDb);.    i
1e860 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1e870 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1e880 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
1e890 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
1e8a0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1e8b0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
1e8c0 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
1e8d0 44 42 20 26 26 20 69 44 62 20 29 20 63 6f 64 65  DB && iDb ) code
1e8e0 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
1e8f0 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
1e900 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1e910 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
1e920 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
1e930 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
1e940 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
1e950 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1e960 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1e970 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
1e980 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
1e990 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66   the index and f
1e9a0 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
1e9b0 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71  able */.  v = sq
1e9c0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1e9d0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
1e9e0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
1e9f0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
1ea00 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
1ea10 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
1ea20 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
1ea30 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
1ea40 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
1ea50 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79 70 65  name=%Q AND type
1ea60 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20 20 20 20  ='index'",.     
1ea70 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
1ea80 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f  DbSName, MASTER_
1ea90 4e 41 4d 45 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  NAME, pIndex->zN
1eaa0 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  ame.    );.    s
1eab0 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54  qlite3ClearStatT
1eac0 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44  ables(pParse, iD
1ead0 62 2c 20 22 69 64 78 22 2c 20 70 49 6e 64 65 78  b, "idx", pIndex
1eae0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
1eaf0 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
1eb00 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
1eb10 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
1eb20 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64  age(pParse, pInd
1eb30 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ex->tnum, iDb);.
1eb40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1eb50 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70  ddOp4(v, OP_Drop
1eb60 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30  Index, iDb, 0, 0
1eb70 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
1eb80 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64   0);.  }..exit_d
1eb90 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c  rop_index:.  sql
1eba0 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
1ebb0 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a  e(db, pName);.}.
1ebc0 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73  ./*.** pArray is
1ebd0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
1ebe0 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   array of object
1ebf0 73 2e 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69  s. Each object i
1ec00 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69  n the.** array i
1ec10 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20  s szEntry bytes 
1ec20 69 6e 20 73 69 7a 65 2e 20 54 68 69 73 20 72 6f  in size. This ro
1ec30 75 74 69 6e 65 20 75 73 65 73 20 73 71 6c 69 74  utine uses sqlit
1ec40 65 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a  e3DbRealloc().**
1ec50 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 61   to extend the a
1ec60 72 72 61 79 20 73 6f 20 74 68 61 74 20 74 68 65  rray so that the
1ec70 72 65 20 69 73 20 73 70 61 63 65 20 66 6f 72 20  re is space for 
1ec80 61 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 74 20  a new object at 
1ec90 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57  the end..**.** W
1eca0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1ecb0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e  n is called, *pn
1ecc0 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 74  Entry contains t
1ecd0 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
1ece0 6f 66 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20  of.** the array 
1ecf0 28 69 6e 20 65 6e 74 72 69 65 73 20 2d 20 73 6f  (in entries - so
1ed00 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
1ed10 69 73 20 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a  is ((*pnEntry) *
1ed20 20 73 7a 45 6e 74 72 79 29 20 62 79 74 65 73 0a   szEntry) bytes.
1ed30 2a 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a  ** in total)..**
1ed40 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 61 6c 6c  .** If the reall
1ed50 6f 63 28 29 20 69 73 20 73 75 63 63 65 73 73 66  oc() is successf
1ed60 75 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f  ul (i.e. if no O
1ed70 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63  OM condition occ
1ed80 75 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61  urs), the.** spa
1ed90 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
1eda0 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
1edb0 69 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e  is zeroed, *pnEn
1edc0 74 72 79 20 75 70 64 61 74 65 64 20 74 6f 0a 2a  try updated to.*
1edd0 2a 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65  * reflect the ne
1ede0 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72  w size of the ar
1edf0 72 61 79 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  ray and a pointe
1ee00 72 20 74 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c  r to the new all
1ee10 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72  ocation.** retur
1ee20 6e 65 64 2e 20 2a 70 49 64 78 20 69 73 20 73 65  ned. *pIdx is se
1ee30 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
1ee40 66 20 74 68 65 20 6e 65 77 20 61 72 72 61 79 20  f the new array 
1ee50 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20 63 61  entry in this ca
1ee60 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  se..**.** Otherw
1ee70 69 73 65 2c 20 69 66 20 74 68 65 20 72 65 61 6c  ise, if the real
1ee80 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a 70 49  loc() fails, *pI
1ee90 64 78 20 69 73 20 73 65 74 20 74 6f 20 2d 31 2c  dx is set to -1,
1eea0 20 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e   *pnEntry remain
1eeb0 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61  s.** unchanged a
1eec0 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 70 41 72  nd a copy of pAr
1eed0 72 61 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  ray returned..*/
1eee0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72  .void *sqlite3Ar
1eef0 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73  rayAllocate(.  s
1ef00 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1ef10 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74   /* Connection t
1ef20 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c  o notify of mall
1ef30 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20  oc failures */. 
1ef40 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20   void *pArray,  
1ef50 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f     /* Array of o
1ef60 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62  bjects.  Might b
1ef70 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  e reallocated */
1ef80 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20  .  int szEntry, 
1ef90 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1efa0 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74  each object in t
1efb0 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  he array */.  in
1efc0 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20  t *pnEntry,     
1efd0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a  /* Number of obj
1efe0 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ects currently i
1eff0 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  n use */.  int *
1f000 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20  pIdx         /* 
1f010 57 72 69 74 65 20 74 68 65 20 69 6e 64 65 78 20  Write the index 
1f020 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65  of a new slot he
1f030 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  re */.){.  char 
1f040 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 2a 70  *z;.  int n = *p
1f050 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28 20 28 6e  nEntry;.  if( (n
1f060 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a   & (n-1))==0 ){.
1f070 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 28 6e 3d      int sz = (n=
1f080 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20  =0) ? 1 : 2*n;. 
1f090 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20     void *pNew = 
1f0a0 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1f0b0 28 64 62 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a  (db, pArray, sz*
1f0c0 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66  szEntry);.    if
1f0d0 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
1f0e0 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20     *pIdx = -1;. 
1f0f0 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 72 72       return pArr
1f100 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41  ay;.    }.    pA
1f110 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  rray = pNew;.  }
1f120 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41  .  z = (char*)pA
1f130 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26  rray;.  memset(&
1f140 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20  z[n * szEntry], 
1f150 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a  0, szEntry);.  *
1f160 70 49 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70  pIdx = n;.  ++*p
1f170 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e  nEntry;.  return
1f180 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a   pArray;.}../*.*
1f190 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65  * Append a new e
1f1a0 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69  lement to the gi
1f1b0 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65  ven IdList.  Cre
1f1c0 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74  ate a new IdList
1f1d0 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a   if.** need be..
1f1e0 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69  **.** A new IdLi
1f1f0 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
1f200 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f  or NULL if mallo
1f210 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64  c() fails..*/.Id
1f220 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
1f230 69 73 74 41 70 70 65 6e 64 28 50 61 72 73 65 20  istAppend(Parse 
1f240 2a 70 50 61 72 73 65 2c 20 49 64 4c 69 73 74 20  *pParse, IdList 
1f250 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
1f260 54 6f 6b 65 6e 29 7b 0a 20 20 73 71 6c 69 74 65  Token){.  sqlite
1f270 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1f280 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  db;.  int i;.  i
1f290 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
1f2a0 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
1f2b0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
1f2c0 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74  b, sizeof(IdList
1f2d0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
1f2e0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
1f2f0 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61  ;.  }.  pList->a
1f300 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
1f310 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 64  llocate(.      d
1f320 62 2c 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  b,.      pList->
1f330 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  a,.      sizeof(
1f340 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20  pList->a[0]),.  
1f350 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c      &pList->nId,
1f360 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20  .      &i.  );. 
1f370 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
1f380 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
1f390 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
1f3a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1f3b0 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  }.  pList->a[i].
1f3c0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
1f3d0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
1f3e0 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20   pToken);.  if( 
1f3f0 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
1f400 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e   && pList->a[i].
1f410 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c  zName ){.    sql
1f420 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d  ite3RenameTokenM
1f430 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64  ap(pParse, (void
1f440 2a 29 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  *)pList->a[i].zN
1f450 61 6d 65 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  ame, pToken);.  
1f460 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  }.  return pList
1f470 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
1f480 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a  e an IdList..*/.
1f490 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69  void sqlite3IdLi
1f4a0 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
1f4b0 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c   *db, IdList *pL
1f4c0 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
1f4d0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1f4e0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
1f4f0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
1f500 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
1f510 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
1f520 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
1f530 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
1f540 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
1f550 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  a);.  sqlite3DbF
1f560 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29  reeNN(db, pList)
1f570 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1f580 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70  n the index in p
1f590 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e  List of the iden
1f5a0 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64  tifier named zId
1f5b0 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20  .  Return -1.** 
1f5c0 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
1f5d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69  .int sqlite3IdLi
1f5e0 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a  stIndex(IdList *
1f5f0 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61  pList, const cha
1f600 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
1f610 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1f620 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  =0 ) return -1;.
1f630 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
1f640 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
1f650 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1f660 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
1f670 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ].zName, zName)=
1f680 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
1f690 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
1f6a0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d  }../*.** Maximum
1f6b0 20 73 69 7a 65 20 6f 66 20 61 20 53 72 63 4c 69   size of a SrcLi
1f6c0 73 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 54 68  st object..** Th
1f6d0 65 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74  e SrcList object
1f6e0 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 70 72   is used to repr
1f6f0 65 73 65 6e 74 20 74 68 65 20 46 52 4f 4d 20 63  esent the FROM c
1f700 6c 61 75 73 65 20 6f 66 20 61 0a 2a 2a 20 53 45  lause of a.** SE
1f710 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
1f720 61 6e 64 20 74 68 65 20 71 75 65 72 79 20 70 6c  and the query pl
1f730 61 6e 6e 65 72 20 63 61 6e 6e 6f 74 20 64 65 61  anner cannot dea
1f740 6c 20 77 69 74 68 20 6d 6f 72 65 0a 2a 2a 20 74  l with more.** t
1f750 68 61 6e 20 36 34 20 74 61 62 6c 65 73 20 69 6e  han 64 tables in
1f760 20 61 20 6a 6f 69 6e 2e 20 20 53 6f 20 61 6e 79   a join.  So any
1f770 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74 68   value larger th
1f780 61 6e 20 36 34 20 68 65 72 65 0a 2a 2a 20 69 73  an 64 here.** is
1f790 20 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20   sufficient for 
1f7a0 6d 6f 73 74 20 75 73 65 73 2e 20 20 53 6d 61 6c  most uses.  Smal
1f7b0 6c 65 72 20 76 61 6c 75 65 73 2c 20 6c 69 6b 65  ler values, like
1f7c0 20 73 61 79 20 31 30 2c 20 61 72 65 0a 2a 2a 20   say 10, are.** 
1f7d0 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
1f7e0 73 6d 61 6c 6c 20 61 6e 64 20 6d 65 6d 6f 72 79  small and memory
1f7f0 2d 6c 69 6d 69 74 65 64 20 61 70 70 6c 69 63 61  -limited applica
1f800 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65  tions..*/.#ifnde
1f810 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43  f SQLITE_MAX_SRC
1f820 4c 49 53 54 0a 23 20 64 65 66 69 6e 65 20 53 51  LIST.# define SQ
1f830 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54  LITE_MAX_SRCLIST
1f840 20 32 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   200.#endif../*.
1f850 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20 73 70  ** Expand the sp
1f860 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
1f870 72 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  r the given SrcL
1f880 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a  ist object by.**
1f890 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74 72 61   creating nExtra
1f8a0 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67 69 6e   new slots begin
1f8b0 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74 2e 20  ning at iStart. 
1f8c0 20 69 53 74 61 72 74 20 69 73 20 7a 65 72 6f 20   iStart is zero 
1f8d0 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c  based..** New sl
1f8e0 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  ots are zeroed..
1f8f0 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1f900 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53 72 63  e, suppose a Src
1f910 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 63  List initially c
1f920 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e 74 72  ontains two entr
1f930 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20  ies: A,B..** To 
1f940 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65 6e 74  append 3 new ent
1f950 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e  ries onto the en
1f960 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a  d, do this:.**.*
1f970 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  *    sqlite3SrcL
1f980 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
1f990 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a  Srclist, 3, 2);.
1f9a0 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
1f9b0 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20 77 6f  call above it wo
1f9c0 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c  uld contain:  A,
1f9d0 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69   B, nil, nil, ni
1f9e0 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 53 74  l..** If the iSt
1f9f0 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68 61 64  art argument had
1fa00 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61 64 20   been 1 instead 
1fa10 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65 20 72  of 2, then the r
1fa20 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68  esult.** would h
1fa30 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69  ave been:  A, ni
1fa40 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20  l, nil, nil, B. 
1fa50 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68 65 20   To prepend the 
1fa60 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68  new slots,.** th
1fa70 65 20 69 53 74 61 72 74 20 76 61 6c 75 65 20 77  e iStart value w
1fa80 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20  ould be 0.  The 
1fa90 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c  result then woul
1faa0 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69  d.** be: nil, ni
1fab0 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a  l, nil, A, B..**
1fac0 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
1fad0 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
1fae0 20 6f 72 20 74 68 65 20 53 72 63 4c 69 73 74 20   or the SrcList 
1faf0 62 65 63 6f 6d 65 73 20 74 6f 6f 20 6c 61 72 67  becomes too larg
1fb00 65 2c 20 6c 65 61 76 65 0a 2a 2a 20 74 68 65 20  e, leave.** the 
1fb10 6f 72 69 67 69 6e 61 6c 20 53 72 63 4c 69 73 74  original SrcList
1fb20 20 75 6e 63 68 61 6e 67 65 64 2c 20 72 65 74 75   unchanged, retu
1fb30 72 6e 20 4e 55 4c 4c 2c 20 61 6e 64 20 6c 65 61  rn NULL, and lea
1fb40 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
1fb50 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65  age.** in pParse
1fb60 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
1fb70 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
1fb80 72 67 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rge(.  Parse *pP
1fb90 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
1fba0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 69 6e 74  sing context int
1fbb0 6f 20 77 68 69 63 68 20 65 72 72 6f 72 73 20 61  o which errors a
1fbc0 72 65 20 72 65 70 6f 72 74 65 64 20 2a 2f 0a 20  re reported */. 
1fbd0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
1fbe0 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c 69      /* The SrcLi
1fbf0 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65  st to be enlarge
1fc00 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  d */.  int nExtr
1fc10 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  a,        /* Num
1fc20 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73  ber of new slots
1fc30 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72 63 2d   to add to pSrc-
1fc40 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53  >a[] */.  int iS
1fc50 74 61 72 74 20 20 20 20 20 20 20 20 20 2f 2a 20  tart         /* 
1fc60 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d 3e 61  Index in pSrc->a
1fc70 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65 77 20  [] of first new 
1fc80 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  slot */.){.  int
1fc90 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   i;..  /* Sanity
1fca0 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c   checking on cal
1fcb0 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  ling parameters 
1fcc0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
1fcd0 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  art>=0 );.  asse
1fce0 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b  rt( nExtra>=1 );
1fcf0 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21  .  assert( pSrc!
1fd00 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1fd10 69 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53  iStart<=pSrc->nS
1fd20 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  rc );..  /* Allo
1fd30 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  cate additional 
1fd40 73 70 61 63 65 20 69 66 20 6e 65 65 64 65 64 20  space if needed 
1fd50 2a 2f 0a 20 20 69 66 28 20 28 75 33 32 29 70 53  */.  if( (u32)pS
1fd60 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e  rc->nSrc+nExtra>
1fd70 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  pSrc->nAlloc ){.
1fd80 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65      SrcList *pNe
1fd90 77 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f  w;.    int nAllo
1fda0 63 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2a 32  c = pSrc->nSrc*2
1fdb0 2b 6e 45 78 74 72 61 3b 0a 20 20 20 20 73 71 6c  +nExtra;.    sql
1fdc0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1fdd0 65 2d 3e 64 62 3b 0a 0a 20 20 20 20 69 66 28 20  e->db;..    if( 
1fde0 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72  pSrc->nSrc+nExtr
1fdf0 61 3e 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52  a>=SQLITE_MAX_SR
1fe00 43 4c 49 53 54 20 29 7b 0a 20 20 20 20 20 20 73  CLIST ){.      s
1fe10 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1fe20 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
1fe30 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1fe40 6d 73 2c 20 6d 61 78 3a 20 25 64 22 2c 0a 20 20  ms, max: %d",.  
1fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe60 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53      SQLITE_MAX_S
1fe70 52 43 4c 49 53 54 29 3b 0a 20 20 20 20 20 20 72  RCLIST);.      r
1fe80 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1fe90 20 20 20 69 66 28 20 6e 41 6c 6c 6f 63 3e 53 51     if( nAlloc>SQ
1fea0 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54  LITE_MAX_SRCLIST
1feb0 20 29 20 6e 41 6c 6c 6f 63 20 3d 20 53 51 4c 49   ) nAlloc = SQLI
1fec0 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 3b 0a  TE_MAX_SRCLIST;.
1fed0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1fee0 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
1fef0 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20  pSrc,.          
1ff00 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72       sizeof(*pSr
1ff10 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a  c) + (nAlloc-1)*
1ff20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
1ff30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ]) );.    if( pN
1ff40 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ew==0 ){.      a
1ff50 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
1ff60 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
1ff70 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1ff80 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77  .    pSrc = pNew
1ff90 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c  ;.    pSrc->nAll
1ffa0 6f 63 20 3d 20 6e 41 6c 6c 6f 63 3b 0a 20 20 7d  oc = nAlloc;.  }
1ffb0 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73  ..  /* Move exis
1ffc0 74 69 6e 67 20 73 6c 6f 74 73 20 74 68 61 74 20  ting slots that 
1ffd0 63 6f 6d 65 20 61 66 74 65 72 20 74 68 65 20 6e  come after the n
1ffe0 65 77 6c 79 20 69 6e 73 65 72 74 65 64 20 73 6c  ewly inserted sl
1fff0 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20  ots.  ** out of 
20000 74 68 65 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72  the way */.  for
20010 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b  (i=pSrc->nSrc-1;
20020 20 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29   i>=iStart; i--)
20030 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b  {.    pSrc->a[i+
20040 6e 45 78 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e  nExtra] = pSrc->
20050 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63  a[i];.  }.  pSrc
20060 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45 78 74 72 61  ->nSrc += nExtra
20070 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65  ;..  /* Zero the
20080 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   newly allocated
20090 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73   slots */.  mems
200a0 65 74 28 26 70 53 72 63 2d 3e 61 5b 69 53 74 61  et(&pSrc->a[iSta
200b0 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  rt], 0, sizeof(p
200c0 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72  Src->a[0])*nExtr
200d0 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74 61  a);.  for(i=iSta
200e0 72 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45 78  rt; i<iStart+nEx
200f0 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  tra; i++){.    p
20100 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
20110 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  r = -1;.  }..  /
20120 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
20130 65 72 20 74 6f 20 74 68 65 20 65 6e 6c 61 72 67  er to the enlarg
20140 65 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  ed SrcList */.  
20150 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a  return pSrc;.}..
20160 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
20170 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  new table name t
20180 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  o the given SrcL
20190 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
201a0 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a  ew SrcList if.**
201b0 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77   need be.  A new
201c0 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65   entry is create
201d0 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  d in the SrcList
201e0 20 65 76 65 6e 20 69 66 20 70 54 61 62 6c 65 20   even if pTable 
201f0 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41  is NULL..**.** A
20200 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75   SrcList is retu
20210 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
20220 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d   there is an OOM
20230 20 65 72 72 6f 72 20 6f 72 20 69 66 20 74 68 65   error or if the
20240 0a 2a 2a 20 53 72 63 4c 69 73 74 20 67 72 6f 77  .** SrcList grow
20250 73 20 74 6f 20 6c 61 72 67 65 2e 20 20 54 68 65  s to large.  The
20260 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63   returned.** Src
20270 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 74 68  List might be th
20280 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 53 72  e same as the Sr
20290 63 4c 69 73 74 20 74 68 61 74 20 77 61 73 20 69  cList that was i
202a0 6e 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74  nput or it might
202b0 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65   be.** a new one
202c0 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  .  If an OOM err
202d0 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20  or does occurs, 
202e0 74 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76  then the prior v
202f0 61 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a  alue of pList.**
20300 20 74 68 61 74 20 69 73 20 69 6e 70 75 74 20 74   that is input t
20310 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
20320 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
20330 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  freed..**.** If 
20340 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74  pDatabase is not
20350 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20   null, it means 
20360 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68  that the table h
20370 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a  as an optional.*
20380 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * database name 
20390 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68  prefix.  Like th
203a0 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74  is:  "database.t
203b0 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74  able".  The pDat
203c0 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20  abase.** points 
203d0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  to the table nam
203e0 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65  e and the pTable
203f0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64   points to the d
20400 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a  atabase name..**
20410 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d   The SrcList.a[]
20420 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20  .zName field is 
20430 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
20440 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68  table name which
20450 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66   might.** come f
20460 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70  rom pTable (if p
20470 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c  Database is NULL
20480 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62  ) or from pDatab
20490 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73  ase.  .** SrcLis
204a0 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20  t.a[].zDatabase 
204b0 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
204c0 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
204d0 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a   from pTable,.**
204e0 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66   or with NULL if
204f0 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20   no database is 
20500 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
20510 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
20520 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68   if call like th
20530 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
20540 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
20550 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b  Append(D,A,B,0);
20560 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73  .**.** Then B is
20570 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   a table name an
20580 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  d the database n
20590 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69  ame is unspecifi
205a0 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a  ed.  If called.*
205b0 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  * like this:.**.
205c0 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
205d0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
205e0 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,B,C);.**.** 
205f0 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61  Then C is the ta
20600 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69  ble name and B i
20610 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  s the database n
20620 61 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64 65  ame.  If C is de
20630 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f  fined.** then so
20640 20 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72   is B.  In other
20650 20 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72   words, we never
20660 20 68 61 76 65 20 61 20 63 61 73 65 20 77 68 65   have a case whe
20670 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
20680 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
20690 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b  Append(D,A,0,C);
206a0 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62  .**.** Both pTab
206b0 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65  le and pDatabase
206c0 20 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20   are assumed to 
206d0 62 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79  be quoted.  They
206e0 20 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a   are dequoted.**
206f0 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64   before being ad
20700 64 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69  ded to the SrcLi
20710 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  st..*/.SrcList *
20720 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
20730 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
20740 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
20750 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2c 20  arsing context, 
20760 69 6e 20 77 68 69 63 68 20 65 72 72 6f 72 73 20  in which errors 
20770 61 72 65 20 72 65 70 6f 72 74 65 64 20 2a 2f 0a  are reported */.
20780 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74    SrcList *pList
20790 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ,     /* Append 
207a0 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e  to this SrcList.
207b0 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20   NULL creates a 
207c0 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20  new SrcList */. 
207d0 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
207e0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
207f0 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b   append */.  Tok
20800 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20 20  en *pDatabase   
20810 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20   /* Database of 
20820 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  the table */.){.
20830 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
20840 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
20850 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61  sqlite3 *db;.  a
20860 73 73 65 72 74 28 20 70 44 61 74 61 62 61 73 65  ssert( pDatabase
20870 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30  ==0 || pTable!=0
20880 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68   );  /* Cannot h
20890 61 76 65 20 43 20 77 69 74 68 6f 75 74 20 42 20  ave C without B 
208a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
208b0 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
208c0 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d  rt( pParse->db!=
208d0 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  0 );.  db = pPar
208e0 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c  se->db;.  if( pL
208f0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
20900 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
20910 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73  allocRawNN(pPars
20920 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 53 72  e->db, sizeof(Sr
20930 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  cList) );.    if
20940 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
20950 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
20960 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20  ->nAlloc = 1;.  
20970 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 3d 20    pList->nSrc = 
20980 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70  1;.    memset(&p
20990 4c 69 73 74 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73  List->a[0], 0, s
209a0 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
209b0 5d 29 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  ]));.    pList->
209c0 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d  a[0].iCursor = -
209d0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
209e0 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  SrcList *pNew = 
209f0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
20a00 6c 61 72 67 65 28 70 50 61 72 73 65 2c 20 70 4c  large(pParse, pL
20a10 69 73 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e  ist, 1, pList->n
20a20 53 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  Src);.    if( pN
20a30 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
20a40 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
20a50 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
20a60 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
20a70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20a80 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20   pList = pNew;. 
20a90 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65 6d     }.  }.  pItem
20aa0 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
20ab0 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69  st->nSrc-1];.  i
20ac0 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
20ad0 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20  pDatabase->z==0 
20ae0 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  ){.    pDatabase
20af0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
20b00 70 44 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20  pDatabase ){.   
20b10 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
20b20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
20b30 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61  oken(db, pDataba
20b40 73 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  se);.    pItem->
20b50 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
20b60 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
20b70 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
20b80 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 6d  }else{.    pItem
20b90 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
20ba0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
20bb0 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20  b, pTable);.    
20bc0 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
20bd0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
20be0 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
20bf0 2a 2a 20 41 73 73 69 67 6e 20 56 64 62 65 43 75  ** Assign VdbeCu
20c00 72 73 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62 65  rsor index numbe
20c10 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73  rs to all tables
20c20 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f   in a SrcList.*/
20c30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
20c40 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
20c50 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
20c60 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
20c70 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
20c80 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
20c90 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72   *pItem;.  asser
20ca0 74 28 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73  t(pList || pPars
20cb0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
20cc0 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  led );.  if( pLi
20cd0 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  st ){.    for(i=
20ce0 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
20cf0 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  a; i<pList->nSrc
20d00 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
20d10 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
20d20 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62  ->iCursor>=0 ) b
20d30 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65  reak;.      pIte
20d40 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61  m->iCursor = pPa
20d50 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
20d60 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
20d70 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
20d80 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
20d90 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
20da0 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  rse, pItem->pSel
20db0 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20  ect->pSrc);.    
20dc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
20dd0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
20de0 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20   entire SrcList 
20df0 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74  including all it
20e00 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a  s substructure..
20e10 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
20e20 72 63 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c  rcListDelete(sql
20e30 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73  ite3 *db, SrcLis
20e40 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
20e50 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   i;.  struct Src
20e60 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
20e70 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
20e80 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
20e90 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
20ea0 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
20eb0 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
20ec0 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
20ed0 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
20ee0 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
20ef0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
20f00 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  b, pItem->zName)
20f10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
20f20 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
20f30 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20  Alias);.    if( 
20f40 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  pItem->fg.isInde
20f50 78 65 64 42 79 20 29 20 73 71 6c 69 74 65 33 44  xedBy ) sqlite3D
20f60 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
20f70 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b  >u1.zIndexedBy);
20f80 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
20f90 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 20 73  fg.isTabFunc ) s
20fa0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
20fb0 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
20fc0 75 31 2e 70 46 75 6e 63 41 72 67 29 3b 0a 20 20  u1.pFuncArg);.  
20fd0 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
20fe0 61 62 6c 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  able(db, pItem->
20ff0 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
21000 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
21010 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  b, pItem->pSelec
21020 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
21030 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
21040 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73  tem->pOn);.    s
21050 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
21060 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55  te(db, pItem->pU
21070 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sing);.  }.  sql
21080 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
21090 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
210a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
210b0 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
210c0 70 61 72 73 65 72 20 74 6f 20 61 64 64 20 61 20  parser to add a 
210d0 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a  new term to the.
210e0 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77  ** end of a grow
210f0 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  ing FROM clause.
21100 20 20 54 68 65 20 22 70 22 20 70 61 72 61 6d 65    The "p" parame
21110 74 65 72 20 69 73 20 74 68 65 20 70 61 72 74 20  ter is the part 
21120 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  of.** the FROM c
21130 6c 61 75 73 65 20 74 68 61 74 20 68 61 73 20 61  lause that has a
21140 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73  lready been cons
21150 74 72 75 63 74 65 64 2e 20 20 22 70 22 20 69 73  tructed.  "p" is
21160 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73   NULL.** if this
21170 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65   is the first te
21180 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rm of the FROM c
21190 6c 61 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61  lause.  pTable a
211a0 6e 64 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20  nd pDatabase.** 
211b0 61 72 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  are the name of 
211c0 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61  the table and da
211d0 74 61 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20  tabase named in 
211e0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
211f0 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61  term..** pDataba
21200 73 65 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68  se is NULL if th
21210 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
21220 71 75 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73  qualifier is mis
21230 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73  sing - the.** us
21240 75 61 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68  ual case.  If th
21250 65 20 74 65 72 6d 20 68 61 73 20 61 6e 20 61 6c  e term has an al
21260 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73  ias, then pAlias
21270 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a   points to the.*
21280 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20  * alias token.  
21290 49 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 61  If the term is a
212a0 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20   subquery, then 
212b0 70 53 75 62 71 75 65 72 79 20 69 73 20 74 68 65  pSubquery is the
212c0 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
212d0 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 73 75  ment that the su
212e0 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20  bquery encodes. 
212f0 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a   The pTable and.
21300 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70 61 72  ** pDatabase par
21310 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c  ameters are NULL
21320 20 66 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e   for subqueries.
21330 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55    The pOn and pU
21340 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65  sing.** paramete
21350 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65  rs are the conte
21360 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64  nt of the ON and
21370 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a   USING clauses..
21380 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e  **.** Return a n
21390 65 77 20 53 72 63 4c 69 73 74 20 77 68 69 63 68  ew SrcList which
213a0 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20   encodes is the 
213b0 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65  FROM with the ne
213c0 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e  w.** term added.
213d0 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
213e0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
213f0 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72  dFromTerm(.  Par
21400 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
21410 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
21420 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
21430 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20  List *p,        
21440 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74       /* The left
21450 20 70 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f   part of the FRO
21460 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79  M clause already
21470 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e   seen */.  Token
21480 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20   *pTable,       
21490 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
214a0 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74  e table to add t
214b0 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  o the FROM claus
214c0 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44  e */.  Token *pD
214d0 61 74 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f  atabase,       /
214e0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
214f0 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
21500 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f  g pTable */.  To
21510 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20  ken *pAlias,    
21520 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
21530 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
21540 74 68 65 20 41 53 20 73 75 62 65 78 70 72 65 73  the AS subexpres
21550 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  sion */.  Select
21560 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20 20 20   *pSubquery,    
21570 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20    /* A subquery 
21580 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
21590 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f   a table name */
215a0 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20  .  Expr *pOn,   
215b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
215c0 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61  e ON clause of a
215d0 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73   join */.  IdLis
215e0 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20  t *pUsing       
215f0 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20     /* The USING 
21600 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e  clause of a join
21610 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
21620 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
21630 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tem;.  sqlite3 *
21640 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
21650 0a 20 20 69 66 28 20 21 70 20 26 26 20 28 70 4f  .  if( !p && (pO
21660 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a  n || pUsing) ){.
21670 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
21680 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4a  Msg(pParse, "a J
21690 4f 49 4e 20 63 6c 61 75 73 65 20 69 73 20 72 65  OIN clause is re
216a0 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 25 73  quired before %s
216b0 22 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f  ", .      (pOn ?
216c0 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29   "ON" : "USING")
216d0 0a 20 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f  .    );.    goto
216e0 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72   append_from_err
216f0 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71  or;.  }.  p = sq
21700 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
21710 6e 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70 54  nd(pParse, p, pT
21720 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29  able, pDatabase)
21730 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
21740 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f      goto append_
21750 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  from_error;.  }.
21760 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 72    assert( p->nSr
21770 63 3e 30 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d  c>0 );.  pItem =
21780 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31   &p->a[p->nSrc-1
21790 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 54  ];.  assert( (pT
217a0 61 62 6c 65 3d 3d 30 29 3d 3d 28 70 44 61 74 61  able==0)==(pData
217b0 62 61 73 65 3d 3d 30 29 20 29 3b 0a 20 20 61 73  base==0) );.  as
217c0 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61  sert( pItem->zNa
217d0 6d 65 3d 3d 30 20 7c 7c 20 70 44 61 74 61 62 61  me==0 || pDataba
217e0 73 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 49  se!=0 );.  if( I
217f0 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
21800 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  && pItem->zName 
21810 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  ){.    Token *pT
21820 6f 6b 65 6e 20 3d 20 28 41 4c 57 41 59 53 28 70  oken = (ALWAYS(p
21830 44 61 74 61 62 61 73 65 29 20 26 26 20 70 44 61  Database) && pDa
21840 74 61 62 61 73 65 2d 3e 7a 29 20 3f 20 70 44 61  tabase->z) ? pDa
21850 74 61 62 61 73 65 20 3a 20 70 54 61 62 6c 65 3b  tabase : pTable;
21860 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61  .    sqlite3Rena
21870 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73  meTokenMap(pPars
21880 65 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  e, pItem->zName,
21890 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20   pToken);.  }.  
218a0 61 73 73 65 72 74 28 20 70 41 6c 69 61 73 21 3d  assert( pAlias!=
218b0 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69 61  0 );.  if( pAlia
218c0 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65  s->n ){.    pIte
218d0 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
218e0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
218f0 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20  (db, pAlias);.  
21900 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  }.  pItem->pSele
21910 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a  ct = pSubquery;.
21920 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70    pItem->pOn = p
21930 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73  On;.  pItem->pUs
21940 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20  ing = pUsing;.  
21950 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65  return p;.. appe
21960 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20  nd_from_error:. 
21970 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b   assert( p==0 );
21980 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
21990 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20  lete(db, pOn);. 
219a0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
219b0 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29  lete(db, pUsing)
219c0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
219d0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
219e0 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72 6e  query);.  return
219f0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   0;.}../*.** Add
21a00 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f   an INDEXED BY o
21a10 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  r NOT INDEXED cl
21a20 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73 74  ause to the most
21a30 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
21a40 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  .** element of t
21a50 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 70  he source-list p
21a60 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
21a70 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
21a80 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
21a90 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 50 61  ListIndexedBy(Pa
21aa0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
21ab0 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a  List *p, Token *
21ac0 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20 61  pIndexedBy){.  a
21ad0 73 73 65 72 74 28 20 70 49 6e 64 65 78 65 64 42  ssert( pIndexedB
21ae0 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 20  y!=0 );.  if( p 
21af0 26 26 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e  && pIndexedBy->n
21b00 3e 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  >0 ){.    struct
21b10 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
21b20 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  Item;.    assert
21b30 28 20 70 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a 20  ( p->nSrc>0 );. 
21b40 20 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61     pItem = &p->a
21b50 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20  [p->nSrc-1];.   
21b60 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
21b70 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30  fg.notIndexed==0
21b80 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
21b90 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  pItem->fg.isInde
21ba0 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  xedBy==0 );.    
21bb0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66  assert( pItem->f
21bc0 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29  g.isTabFunc==0 )
21bd0 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  ;.    if( pIndex
21be0 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70  edBy->n==1 && !p
21bf0 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a  IndexedBy->z ){.
21c00 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20        /* A "NOT 
21c10 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65 20  INDEXED" clause 
21c20 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65  was supplied. Se
21c30 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20  e parse.y .     
21c40 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69   ** construct "i
21c50 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20  ndexed_opt" for 
21c60 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  details. */.    
21c70 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49    pItem->fg.notI
21c80 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20  ndexed = 1;.    
21c90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74  }else{.      pIt
21ca0 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  em->u1.zIndexedB
21cb0 79 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  y = sqlite3NameF
21cc0 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
21cd0 3e 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29  >db, pIndexedBy)
21ce0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66  ;.      pItem->f
21cf0 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 3d 20  g.isIndexedBy = 
21d00 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  1;.    }.  }.}..
21d10 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 6c 69  /*.** Add the li
21d20 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  st of function a
21d30 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  rguments to the 
21d40 53 72 63 4c 69 73 74 20 65 6e 74 72 79 20 66 6f  SrcList entry fo
21d50 72 20 61 0a 2a 2a 20 74 61 62 6c 65 2d 76 61 6c  r a.** table-val
21d60 75 65 64 2d 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ued-function..*/
21d70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
21d80 4c 69 73 74 46 75 6e 63 41 72 67 73 28 50 61 72  ListFuncArgs(Par
21d90 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
21da0 69 73 74 20 2a 70 2c 20 45 78 70 72 4c 69 73 74  ist *p, ExprList
21db0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20   *pList){.  if( 
21dc0 70 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  p ){.    struct 
21dd0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
21de0 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
21df0 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  Src-1];.    asse
21e00 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f  rt( pItem->fg.no
21e10 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20  tIndexed==0 );. 
21e20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
21e30 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
21e40 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
21e50 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54  t( pItem->fg.isT
21e60 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  abFunc==0 );.   
21e70 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63   pItem->u1.pFunc
21e80 41 72 67 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20  Arg = pList;.   
21e90 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62   pItem->fg.isTab
21ea0 46 75 6e 63 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  Func = 1;.  }els
21eb0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
21ec0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
21ed0 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b  rse->db, pList);
21ee0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  .  }.}../*.** Wh
21ef0 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61  en building up a
21f00 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20   FROM clause in 
21f10 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20  the parser, the 
21f20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  join operator.**
21f30 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74   is initially at
21f40 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
21f50 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74  ft operand.  But
21f60 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
21f70 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74  tor.** expects t
21f80 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
21f90 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69   to be on the ri
21fa0 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68  ght operand.  Th
21fb0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68  is routine.** Sh
21fc0 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70  ifts all join op
21fd0 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66  erators from lef
21fe0 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61  t to right for a
21ff0 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a  n entire FROM.**
22000 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45   clause..**.** E
22010 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20  xample: Suppose 
22020 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65  the join is like
22030 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
22040 20 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c         A natural
22050 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a   cross join B.**
22060 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72  .** The operator
22070 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f   is "natural cro
22080 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41  ss join".  The A
22090 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20   and B operands 
220a0 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  are stored.** in
220b0 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e   p->a[0] and p->
220c0 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65  a[1], respective
220d0 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  ly.  The parser 
220e0 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73  initially stores
220f0 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72   the.** operator
22100 20 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72   with A.  This r
22110 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68  outine shifts th
22120 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72  at operator over
22130 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73   to B..*/.void s
22140 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69  qlite3SrcListShi
22150 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69  ftJoinType(SrcLi
22160 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  st *p){.  if( p 
22170 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
22180 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d    for(i=p->nSrc-
22190 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
221a0 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 66 67 2e 6a      p->a[i].fg.j
221b0 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69  ointype = p->a[i
221c0 2d 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b  -1].fg.jointype;
221d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b  .    }.    p->a[
221e0 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d  0].fg.jointype =
221f0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
22200 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
22210 6f 64 65 20 66 6f 72 20 61 20 42 45 47 49 4e 20  ode for a BEGIN 
22220 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
22230 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54  id sqlite3BeginT
22240 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
22250 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79   *pParse, int ty
22260 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pe){.  sqlite3 *
22270 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
22280 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72   int i;..  asser
22290 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
222a0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
222b0 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  b;.  assert( db!
222c0 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  =0 );.  if( sqli
222d0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
222e0 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
222f0 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22  SACTION, "BEGIN"
22300 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  , 0, 0) ){.    r
22310 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d  eturn;.  }.  v =
22320 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
22330 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21  pParse);.  if( !
22340 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  v ) return;.  if
22350 28 20 74 79 70 65 3d 3d 54 4b 5f 49 4d 4d 45 44  ( type==TK_IMMED
22360 49 41 54 45 20 7c 7c 20 74 79 70 65 3d 3d 54 4b  IATE || type==TK
22370 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20  _EXCLUSIVE ){.  
22380 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
22390 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
223a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
223b0 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  Op2(v, OP_Transa
223c0 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d  ction, i, (type=
223d0 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31  =TK_EXCLUSIVE)+1
223e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
223f0 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
22400 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   i);.    }.  }. 
22410 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22420 70 33 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  p3(v, OP_AutoCom
22430 6d 69 74 2c 20 30 2c 20 30 2c 20 28 74 79 70 65  mit, 0, 0, (type
22440 3d 3d 54 4b 5f 43 4f 4e 43 55 52 52 45 4e 54 29  ==TK_CONCURRENT)
22450 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
22460 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66  rate VDBE code f
22470 6f 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 52  or a COMMIT or R
22480 4f 4c 4c 42 41 43 4b 20 73 74 61 74 65 6d 65 6e  OLLBACK statemen
22490 74 2e 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 52  t..** Code for R
224a0 4f 4c 4c 42 41 43 4b 20 69 73 20 67 65 6e 65 72  OLLBACK is gener
224b0 61 74 65 64 20 69 66 20 65 54 79 70 65 3d 3d 54  ated if eType==T
224c0 4b 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20 4f 74 68  K_ROLLBACK.  Oth
224d0 65 72 77 69 73 65 0a 2a 2a 20 63 6f 64 65 20 69  erwise.** code i
224e0 73 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  s generated for 
224f0 61 20 43 4f 4d 4d 49 54 2e 0a 2a 2f 0a 76 6f 69  a COMMIT..*/.voi
22500 64 20 73 71 6c 69 74 65 33 45 6e 64 54 72 61 6e  d sqlite3EndTran
22510 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
22520 50 61 72 73 65 2c 20 69 6e 74 20 65 54 79 70 65  Parse, int eType
22530 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
22540 69 6e 74 20 69 73 52 6f 6c 6c 62 61 63 6b 3b 0a  int isRollback;.
22550 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
22560 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
22570 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20  ( pParse->db!=0 
22580 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  );.  assert( eTy
22590 70 65 3d 3d 54 4b 5f 43 4f 4d 4d 49 54 20 7c 7c  pe==TK_COMMIT ||
225a0 20 65 54 79 70 65 3d 3d 54 4b 5f 45 4e 44 20 7c   eType==TK_END |
225b0 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c  | eType==TK_ROLL
225c0 42 41 43 4b 20 29 3b 0a 20 20 69 73 52 6f 6c 6c  BACK );.  isRoll
225d0 62 61 63 6b 20 3d 20 65 54 79 70 65 3d 3d 54 4b  back = eType==TK
225e0 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 69 66 28  _ROLLBACK;.  if(
225f0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
22600 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
22610 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 0a 20  _TRANSACTION, . 
22620 20 20 20 20 20 20 69 73 52 6f 6c 6c 62 61 63 6b        isRollback
22630 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 22 20 3a 20   ? "ROLLBACK" : 
22640 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20  "COMMIT", 0, 0) 
22650 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
22660 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
22670 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
22680 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
22690 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
226a0 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
226b0 69 74 2c 20 31 2c 20 69 73 52 6f 6c 6c 62 61 63  it, 1, isRollbac
226c0 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  k);.  }.}../*.**
226d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
226e0 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
226f0 70 61 72 73 65 72 20 77 68 65 6e 20 69 74 20 70  parser when it p
22700 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20  arses a command 
22710 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65  to create,.** re
22720 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
22730 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69  k an SQL savepoi
22740 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nt. .*/.void sql
22750 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61  ite3Savepoint(Pa
22760 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
22770 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d   op, Token *pNam
22780 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
22790 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
227a0 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
227b0 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  >db, pName);.  i
227c0 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
227d0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
227e0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
227f0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
22800 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
22810 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63  ION.    static c
22820 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73  onst char * cons
22830 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49  t az[] = { "BEGI
22840 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22  N", "RELEASE", "
22850 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20  ROLLBACK" };.   
22860 20 61 73 73 65 72 74 28 20 21 53 41 56 45 50 4f   assert( !SAVEPO
22870 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56  INT_BEGIN && SAV
22880 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d  EPOINT_RELEASE==
22890 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52  1 && SAVEPOINT_R
228a0 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65  OLLBACK==2 );.#e
228b0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21 76 20  ndif.    if( !v 
228c0 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  || sqlite3AuthCh
228d0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
228e0 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a  TE_SAVEPOINT, az
228f0 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20  [op], zName, 0) 
22900 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
22910 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
22920 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
22930 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
22940 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22950 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70  dOp4(v, OP_Savep
22960 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  oint, op, 0, 0, 
22970 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49  zName, P4_DYNAMI
22980 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  C);.  }.}../*.**
22990 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54   Make sure the T
229a0 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20  EMP database is 
229b0 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62  open and availab
229c0 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74  le for use.  Ret
229d0 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
229e0 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65  r of errors.  Le
229f0 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ave any error me
22a00 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50  ssages in the pP
22a10 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
22a20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70  */.int sqlite3Op
22a30 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50  enTempDatabase(P
22a40 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
22a50 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
22a60 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
22a70 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d   db->aDb[1].pBt=
22a80 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65  =0 && !pParse->e
22a90 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e  xplain ){.    in
22aa0 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65 20  t rc;.    Btree 
22ab0 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74 69 63  *pBt;.    static
22ac0 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
22ad0 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53 51   = .          SQ
22ae0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
22af0 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ITE |.          
22b00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
22b10 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  TE |.          S
22b20 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
22b30 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20  SIVE |.         
22b40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
22b50 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20  ETEONCLOSE |.   
22b60 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
22b70 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20  EN_TEMP_DB;..   
22b80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
22b90 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c  eeOpen(db->pVfs,
22ba0 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20 30 2c   0, db, &pBt, 0,
22bb0 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
22bc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22bd0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
22be0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
22bf0 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
22c00 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  a temporary data
22c10 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22  base ".        "
22c20 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67  file for storing
22c30 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
22c40 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  s");.      pPars
22c50 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
22c60 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
22c70 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d  }.    db->aDb[1]
22c80 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  .pBt = pBt;.    
22c90 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
22ca0 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  1].pSchema );.  
22cb0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d    if( SQLITE_NOM
22cc0 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  EM==sqlite3Btree
22cd0 53 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c  SetPageSize(pBt,
22ce0 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a   db->nextPagesiz
22cf0 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20  e, -1, 0) ){.   
22d00 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
22d10 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65  lt(db);.      re
22d20 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
22d30 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
22d40 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
22d50 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20  e fact that the 
22d60 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69  schema cookie wi
22d70 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 76 65  ll need to be ve
22d80 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61  rified.** for da
22d90 74 61 62 61 73 65 20 69 44 62 2e 20 20 54 68 65  tabase iDb.  The
22da0 20 63 6f 64 65 20 74 6f 20 61 63 74 75 61 6c 6c   code to actuall
22db0 79 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68  y verify the sch
22dc0 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69  ema cookie.** wi
22dd0 6c 6c 20 6f 63 63 75 72 20 61 74 20 74 68 65 20  ll occur at the 
22de0 65 6e 64 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c  end of the top-l
22df0 65 76 65 6c 20 56 44 42 45 20 61 6e 64 20 77 69  evel VDBE and wi
22e00 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a  ll be generated.
22e10 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20 73 71 6c  ** later, by sql
22e20 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67  ite3FinishCoding
22e30 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
22e40 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
22e50 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
22e60 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50  e, int iDb){.  P
22e70 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
22e80 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
22e90 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
22ea0 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
22eb0 30 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d  0 && iDb<pParse-
22ec0 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  >db->nDb );.  as
22ed0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
22ee0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d  ->aDb[iDb].pBt!=
22ef0 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20  0 || iDb==1 );. 
22f00 20 61 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c   assert( iDb<SQL
22f10 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
22f20 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +2 );.  assert( 
22f30 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
22f40 65 78 48 65 6c 64 28 70 50 61 72 73 65 2d 3e 64  exHeld(pParse->d
22f50 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
22f60 69 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70  if( DbMaskTest(p
22f70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
22f80 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20 29 7b  Mask, iDb)==0 ){
22f90 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70  .    DbMaskSet(p
22fa0 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
22fb0 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 20 20  Mask, iDb);.    
22fc0 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
22fd0 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
22fe0 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
22ff0 65 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f 70  empDatabase(pTop
23000 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  level);.    }.  
23010 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72  }.}../*.** If ar
23020 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e 55  gument zDb is NU
23030 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73 71  LL, then call sq
23040 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
23050 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63 68  chema() for each
23060 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61   .** attached da
23070 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69 73  tabase. Otherwis
23080 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72  e, invoke it for
23090 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
230a0 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f  med zDb only..*/
230b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
230c0 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
230d0 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
230e0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
230f0 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  b){.  sqlite3 *d
23100 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
23110 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
23120 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
23130 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62  ++){.    Db *pDb
23140 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
23150 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
23160 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d   && (!zDb || 0==
23170 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
23180 44 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  Db, pDb->zDbSNam
23190 65 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  e)) ){.      sql
231a0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
231b0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b  hema(pParse, i);
231c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
231d0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
231e0 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70  E code that prep
231f0 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61  ares for doing a
23200 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
23210 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
23220 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
23230 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
23240 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74  e starts a new t
23250 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65  ransaction if we
23260 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79   are not already
23270 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61   within.** a tra
23280 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65  nsaction.  If we
23290 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74   are already wit
232a0 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hin a transactio
232b0 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70  n, then a checkp
232c0 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69  oint.** is set i
232d0 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65  f the setStateme
232e0 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
232f0 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f  true.  A checkpo
23300 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  int should.** be
23310 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69   set for operati
23320 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66  ons that might f
23330 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f  ail (due to a co
23340 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f  nstraint) part o
23350 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72  f.** the way thr
23360 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77  ough and which w
23370 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f  ill need to undo
23380 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74   some writes wit
23390 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a  hout having to.*
233a0 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77  * rollback the w
233b0 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  hole transaction
233c0 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e  .  For operation
233d0 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73  s where all cons
233e0 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62  traints.** can b
233f0 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65  e checked before
23400 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65   any changes are
23410 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
23420 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76  abase, it is nev
23430 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20  er.** necessary 
23440 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20  to undo a write 
23450 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69  and the checkpoi
23460 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  nt should not be
23470 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
23480 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
23490 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
234a0 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53  pParse, int setS
234b0 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44  tatement, int iD
234c0 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  b){.  Parse *pTo
234d0 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
234e0 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
234f0 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
23500 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
23510 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
23520 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c   DbMaskSet(pTopl
23530 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c  evel->writeMask,
23540 20 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76   iDb);.  pToplev
23550 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  el->isMultiWrite
23560 20 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74   |= setStatement
23570 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  ;.}../*.** Indic
23580 61 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ate that the sta
23590 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79  tement currently
235a0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
235b0 69 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a  ion might write.
235c0 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ** more than one
235d0 20 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a   entry (example:
235e0 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f   deleting one ro
235f0 77 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67  w then inserting
23600 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73   another,.** ins
23610 65 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  erting multiple 
23620 72 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c  rows in a table,
23630 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20   or inserting a 
23640 72 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e  row and index en
23650 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e  tries.).** If an
23660 20 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66   abort occurs af
23670 74 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73  ter some of thes
23680 65 20 77 72 69 74 65 73 20 68 61 76 65 20 63 6f  e writes have co
23690 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74  mpleted, then it
236a0 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65   will.** be nece
236b0 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68  ssary to undo th
236c0 65 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74  e completed writ
236d0 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
236e0 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61  te3MultiWrite(Pa
236f0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
23700 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
23710 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
23720 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
23730 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73  .  pToplevel->is
23740 4d 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a  MultiWrite = 1;.
23750 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f  }../* .** The co
23760 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c  de generator cal
23770 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
23780 69 66 20 69 73 20 64 69 73 63 6f 76 65 72 73 20  if is discovers 
23790 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f  that it is.** po
237a0 73 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20  ssible to abort 
237b0 61 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f  a statement prio
237c0 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e  r to completion.
237d0 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a    In order to .*
237e0 2a 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61  * perform this a
237f0 62 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72  bort without cor
23800 72 75 70 74 69 6e 67 20 74 68 65 20 64 61 74 61  rupting the data
23810 62 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f  base, we need to
23820 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68   make.** sure th
23830 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
23840 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79   is protected by
23850 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
23860 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
23870 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20  Technically, we 
23880 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74  only need to set
23890 20 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c   the mayAbort fl
238a0 61 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d  ag if the.** isM
238b0 75 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20 77  ultiWrite flag w
238c0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65  as previously se
238d0 74 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 74  t.  There is a t
238e0 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a  ime dependency.*
238f0 2a 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  * such that the 
23900 61 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72  abort must occur
23910 20 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69   after the multi
23920 77 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b  write.  This mak
23930 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65  es.** some state
23940 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20  ments involving 
23950 74 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66  the REPLACE conf
23960 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
23970 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20  algorithm.** go 
23980 61 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e  a little faster.
23990 20 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76    But taking adv
239a0 61 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20 74  antage of this t
239b0 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a  ime dependency.*
239c0 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20  * makes it more 
239d0 64 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f  difficult to pro
239e0 76 65 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  ve that the code
239f0 20 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20   is correct (in 
23a00 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20  .** particular, 
23a10 69 74 20 70 72 65 76 65 6e 74 73 20 75 73 20 66  it prevents us f
23a20 72 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65  rom writing an e
23a30 66 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c  ffective.** impl
23a40 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71  ementation of sq
23a50 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62  lite3AssertMayAb
23a60 6f 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65  ort()) and so we
23a70 20 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20   have chosen.** 
23a80 74 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66 65  to take the safe
23a90 20 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20   route and skip 
23aa0 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
23ab0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23ac0 33 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65 20  3MayAbort(Parse 
23ad0 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73  *pParse){.  Pars
23ae0 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
23af0 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
23b00 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70  vel(pParse);.  p
23b10 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f  Toplevel->mayAbo
23b20 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rt = 1;.}../*.**
23b30 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74   Code an OP_Halt
23b40 20 74 68 61 74 20 63 61 75 73 65 73 20 74 68 65   that causes the
23b50 20 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20   vdbe to return 
23b60 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  an SQLITE_CONSTR
23b70 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54  AINT.** error. T
23b80 68 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d  he onError param
23b90 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20  eter determines 
23ba0 77 68 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f  which (if any) o
23bb0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  f the statement.
23bc0 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e  ** and/or curren
23bd0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
23be0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
23bf0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c  .void sqlite3Hal
23c00 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  tConstraint(.  P
23c10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
23c20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
23c30 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  ext */.  int err
23c40 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20 65 78  Code,      /* ex
23c50 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64  tended error cod
23c60 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  e */.  int onErr
23c70 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73  or,      /* Cons
23c80 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20  traint type */. 
23c90 20 63 68 61 72 20 2a 70 34 2c 20 20 20 20 20 20   char *p4,      
23ca0 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73     /* Error mess
23cb0 61 67 65 20 2a 2f 0a 20 20 69 38 20 70 34 74 79  age */.  i8 p4ty
23cc0 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 34  pe,        /* P4
23cd0 5f 53 54 41 54 49 43 20 6f 72 20 50 34 5f 54 52  _STATIC or P4_TR
23ce0 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20  ANSIENT */.  u8 
23cf0 70 35 45 72 72 6d 73 67 20 20 20 20 20 20 20 2f  p5Errmsg       /
23d00 2a 20 50 35 5f 45 72 72 4d 73 67 20 74 79 70 65  * P5_ErrMsg type
23d10 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
23d20 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
23d30 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
23d40 65 72 74 28 20 28 65 72 72 43 6f 64 65 26 30 78  ert( (errCode&0x
23d50 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
23d60 54 52 41 49 4e 54 20 29 3b 0a 20 20 69 66 28 20  TRAINT );.  if( 
23d70 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72  onError==OE_Abor
23d80 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
23d90 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
23da0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
23db0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
23dc0 48 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f  Halt, errCode, o
23dd0 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70  nError, 0, p4, p
23de0 34 74 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65  4type);.  sqlite
23df0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
23e00 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f   p5Errmsg);.}../
23e10 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
23e20 48 61 6c 74 20 64 75 65 20 74 6f 20 55 4e 49 51  Halt due to UNIQ
23e30 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  UE or PRIMARY KE
23e40 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f  Y constraint vio
23e50 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  lation..*/.void 
23e60 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e  sqlite3UniqueCon
23e70 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65  straint(.  Parse
23e80 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
23e90 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
23ea0 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
23eb0 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  ,      /* Constr
23ec0 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 49  aint type */.  I
23ed0 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
23ee0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68   /* The index th
23ef0 61 74 20 74 72 69 67 67 65 72 73 20 74 68 65 20  at triggers the 
23f00 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b  constraint */.){
23f10 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  .  char *zErr;. 
23f20 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63 63   int j;.  StrAcc
23f30 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54 61 62  um errMsg;.  Tab
23f40 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64 78 2d  le *pTab = pIdx-
23f50 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69  >pTable;..  sqli
23f60 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
23f70 26 65 72 72 4d 73 67 2c 20 70 50 61 72 73 65 2d  &errMsg, pParse-
23f80 3e 64 62 2c 20 30 2c 20 30 2c 20 32 30 30 29 3b  >db, 0, 0, 200);
23f90 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 61 43 6f  .  if( pIdx->aCo
23fa0 6c 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  lExpr ){.    sql
23fb0 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
23fc0 28 26 65 72 72 4d 73 67 2c 20 22 69 6e 64 65 78  (&errMsg, "index
23fd0 20 27 25 71 27 22 2c 20 70 49 64 78 2d 3e 7a 4e   '%q'", pIdx->zN
23fe0 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
23ff0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
24000 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  dx->nKeyCol; j++
24010 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
24020 43 6f 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Col;.      asser
24030 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  t( pIdx->aiColum
24040 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20  n[j]>=0 );.     
24050 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43   zCol = pTab->aC
24060 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  ol[pIdx->aiColum
24070 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  n[j]].zName;.   
24080 20 20 20 69 66 28 20 6a 20 29 20 73 71 6c 69 74     if( j ) sqlit
24090 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 65  e3_str_append(&e
240a0 72 72 4d 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b  rrMsg, ", ", 2);
240b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
240c0 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 65 72  tr_appendall(&er
240d0 72 4d 73 67 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  rMsg, pTab->zNam
240e0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
240f0 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 65 72  3_str_append(&er
24100 72 4d 73 67 2c 20 22 2e 22 2c 20 31 29 3b 0a 20  rMsg, ".", 1);. 
24110 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
24120 5f 61 70 70 65 6e 64 61 6c 6c 28 26 65 72 72 4d  _appendall(&errM
24130 73 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d  sg, zCol);.    }
24140 0a 20 20 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71  .  }.  zErr = sq
24150 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
24160 69 73 68 28 26 65 72 72 4d 73 67 29 3b 0a 20 20  ish(&errMsg);.  
24170 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
24180 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 0a 20  raint(pParse, . 
24190 20 20 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49     IsPrimaryKeyI
241a0 6e 64 65 78 28 70 49 64 78 29 20 3f 20 53 51 4c  ndex(pIdx) ? SQL
241b0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
241c0 52 49 4d 41 52 59 4b 45 59 20 0a 20 20 20 20 20  RIMARYKEY .     
241d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241e0 20 20 20 20 20 20 20 3a 20 53 51 4c 49 54 45 5f         : SQLITE_
241f0 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55  CONSTRAINT_UNIQU
24200 45 2c 0a 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20  E,.    onError, 
24210 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zErr, P4_DYNAMIC
24220 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55  , P5_ConstraintU
24230 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  nique);.}.../*.*
24240 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c  * Code an OP_Hal
24250 74 20 64 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69  t due to non-uni
24260 71 75 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f  que rowid..*/.vo
24270 69 64 20 73 71 6c 69 74 65 33 52 6f 77 69 64 43  id sqlite3RowidC
24280 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
24290 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
242a0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
242b0 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  t */.  int onErr
242c0 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66  or,      /* Conf
242d0 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
242e0 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54  algorithm */.  T
242f0 61 62 6c 65 20 2a 70 54 61 62 20 20 20 20 20 20  able *pTab      
24300 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 77 69   /* The table wi
24310 74 68 20 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75  th the non-uniqu
24320 65 20 72 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20  e rowid */ .){. 
24330 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69   char *zMsg;.  i
24340 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 54 61  nt rc;.  if( pTa
24350 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20  b->iPKey>=0 ){. 
24360 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
24370 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
24380 3e 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54  >db, "%s.%s", pT
24390 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
243a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243b0 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
243c0 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61  pTab->iPKey].zNa
243d0 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  me);.    rc = SQ
243e0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
243f0 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65  PRIMARYKEY;.  }e
24400 6c 73 65 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20  lse{.    zMsg = 
24410 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
24420 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72  Parse->db, "%s.r
24430 6f 77 69 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  owid", pTab->zNa
24440 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  me);.    rc = SQ
24450 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
24460 52 4f 57 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c  ROWID;.  }.  sql
24470 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
24480 6e 74 28 70 50 61 72 73 65 2c 20 72 63 2c 20 6f  nt(pParse, rc, o
24490 6e 45 72 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34  nError, zMsg, P4
244a0 5f 44 59 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20  _DYNAMIC,.      
244b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244c0 20 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55    P5_ConstraintU
244d0 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nique);.}../*.**
244e0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
244f0 20 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65   pIndex uses the
24500 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
24510 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75  nce pColl.  Retu
24520 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74  rn.** true if it
24530 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20   does and false 
24540 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
24550 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
24560 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
24570 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74  tatic int collat
24580 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63  ionMatch(const c
24590 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65  har *zColl, Inde
245a0 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e  x *pIndex){.  in
245b0 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  t i;.  assert( z
245c0 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72  Coll!=0 );.  for
245d0 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e  (i=0; i<pIndex->
245e0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
245f0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
24600 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
24610 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  l[i];.    assert
24620 28 20 7a 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78  ( z!=0 || pIndex
24630 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20  ->aiColumn[i]<0 
24640 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
24650 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d  x->aiColumn[i]>=
24660 30 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53  0 && 0==sqlite3S
24670 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29  trICmp(z, zColl)
24680 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
24690 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
246a0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
246b0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70  if../*.** Recomp
246c0 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
246d0 6f 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65  of pTab that use
246e0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
246f0 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a  equence pColl..*
24700 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68  * If pColl==0 th
24710 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c  en recompute all
24720 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62   indices of pTab
24730 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
24740 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
24750 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69  .static void rei
24760 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20  ndexTable(Parse 
24770 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
24780 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74  pTab, char const
24790 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 69 66 28 20   *zColl){.  if( 
247a0 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
247b0 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
247c0 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
247d0 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
247e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
247f0 70 54 61 62 20 2a 2f 0a 0a 20 20 20 20 66 6f 72  pTab */..    for
24800 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49  (pIndex=pTab->pI
24810 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
24820 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65  ndex=pIndex->pNe
24830 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  xt){.      if( z
24840 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61  Coll==0 || colla
24850 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c  tionMatch(zColl,
24860 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20   pIndex) ){.    
24870 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
24880 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
24890 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
248a0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
248b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
248c0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
248d0 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
248e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
248f0 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
24900 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
24910 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
24920 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
24930 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61  *.** Recompute a
24940 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c  ll indices of al
24950 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20  l tables in all 
24960 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65 20  databases where 
24970 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75  the.** indices u
24980 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  se the collating
24990 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
249a0 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68    If pColl==0 th
249b0 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20  en recompute.** 
249c0 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72  all indices ever
249d0 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64  ywhere..*/.#ifnd
249e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
249f0 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f  EINDEX.static vo
24a00 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62 61  id reindexDataba
24a10 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ses(Parse *pPars
24a20 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  e, char const *z
24a30 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62  Coll){.  Db *pDb
24a40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24a50 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
24a60 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
24a70 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
24a80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24a90 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  e database index
24aa0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c   number */.  sql
24ab0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
24ac0 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20  e->db;   /* The 
24ad0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
24ae0 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65  ion */.  HashEle
24af0 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20  m *k;           
24b00 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
24b10 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20  ing over tables 
24b20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c  in pDb */.  Tabl
24b30 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
24b40 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
24b50 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
24b60 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  se */..  assert(
24b70 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
24b80 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29  dsAllMutexes(db)
24b90 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65 64 20 66   );  /* Needed f
24ba0 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73 73  or schema access
24bb0 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c   */.  for(iDb=0,
24bc0 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44   pDb=db->aDb; iD
24bd0 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b  b<db->nDb; iDb++
24be0 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73  , pDb++){.    as
24bf0 73 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b 0a  sert( pDb!=0 );.
24c00 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65      for(k=sqlite
24c10 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
24c20 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
24c30 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48  );  k; k=sqliteH
24c40 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20  ashNext(k)){.   
24c50 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65     pTab = (Table
24c60 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
24c70 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64  (k);.      reind
24c80 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  exTable(pParse, 
24c90 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  pTab, zColl);.  
24ca0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
24cb0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
24cc0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45   code for the RE
24cd0 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  INDEX command..*
24ce0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  *.**        REIN
24cf0 44 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20  DEX             
24d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
24d10 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 1.**        RE
24d20 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f  INDEX  <collatio
24d30 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n>              
24d40 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20   -- 2.**        
24d50 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62  REINDEX  ?<datab
24d60 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65  ase>.?<tablename
24d70 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20  >  -- 3.**      
24d80 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74    REINDEX  ?<dat
24d90 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61  abase>.?<indexna
24da0 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20  me>  -- 4.**.** 
24db0 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c  Form 1 causes al
24dc0 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
24dd0 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
24de0 73 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c  ses to be rebuil
24df0 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62  t..** Form 2 reb
24e00 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65  uilds all indice
24e10 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
24e20 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  es that use the 
24e30 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69  named.** collati
24e40 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f  ng function.  Fo
24e50 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75  rms 3 and 4 rebu
24e60 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  ild the named in
24e70 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e  dex or all.** in
24e80 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
24e90 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20   with the named 
24ea0 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  table..*/.#ifnde
24eb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
24ec0 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74  INDEX.void sqlit
24ed0 65 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20  e3Reindex(Parse 
24ee0 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
24ef0 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70  pName1, Token *p
24f00 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65  Name2){.  CollSe
24f10 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
24f20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
24f30 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62  ng sequence to b
24f40 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20  e reindexed, or 
24f50 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a  NULL */.  char *
24f60 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
24f70 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
24f80 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
24f90 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  x */.  const cha
24fa0 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20  r *zDb;         
24fb0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
24fc0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
24fd0 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
24fe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
24ff0 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
25000 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65  tabase */.  Inde
25010 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
25020 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
25030 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
25040 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e  ith pTab */.  in
25050 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
25060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25070 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
25080 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69  number */.  sqli
25090 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
250a0 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64  ->db;   /* The d
250b0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
250c0 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  on */.  Token *p
250d0 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  ObjName;        
250e0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
250f0 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
25100 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  x to be reindexe
25110 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20  d */..  /* Read 
25120 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
25130 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ema. If an error
25140 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
25150 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
25160 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e    ** and code in
25170 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
25180 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66  rn NULL. */.  if
25190 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
251a0 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
251b0 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
251c0 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
251d0 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20   pName1==0 ){.  
251e0 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73    reindexDatabas
251f0 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20  es(pParse, 0);. 
25200 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c     return;.  }el
25210 73 65 20 69 66 28 20 4e 45 56 45 52 28 70 4e 61  se if( NEVER(pNa
25220 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65  me2==0) || pName
25230 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63  2->z==0 ){.    c
25240 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20  har *zColl;.    
25250 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e  assert( pName1->
25260 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d  z );.    zColl =
25270 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
25280 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
25290 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69  , pName1);.    i
252a0 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75  f( !zColl ) retu
252b0 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  rn;.    pColl = 
252c0 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
252d0 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
252e0 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69  zColl, 0);.    i
252f0 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
25300 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73    reindexDatabas
25310 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  es(pParse, zColl
25320 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25330 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
25340 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
25350 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
25360 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f  e3DbFree(db, zCo
25370 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  ll);.  }.  iDb =
25380 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
25390 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
253a0 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62  e1, pName2, &pOb
253b0 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44  jName);.  if( iD
253c0 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
253d0 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  z = sqlite3NameF
253e0 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62  romToken(db, pOb
253f0 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d  jName);.  if( z=
25400 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  =0 ) return;.  z
25410 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
25420 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 70 54  ].zDbSName;.  pT
25430 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
25440 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62  Table(db, z, zDb
25450 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b  );.  if( pTab ){
25460 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c  .    reindexTabl
25470 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
25480 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  0);.    sqlite3D
25490 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
254a0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
254b0 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
254c0 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c  FindIndex(db, z,
254d0 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   zDb);.  sqlite3
254e0 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
254f0 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
25500 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
25510 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
25520 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
25530 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
25540 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
25550 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72  ndex, -1);.    r
25560 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
25570 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
25580 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
25590 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a  identify the obj
255a0 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65  ect to be reinde
255b0 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  xed");.}.#endif.
255c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
255d0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
255e0 65 20 74 68 61 74 20 69 73 20 61 70 70 72 6f 70  e that is approp
255f0 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69  riate for the gi
25600 76 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  ven Index..**.**
25610 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   The caller shou
25620 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ld invoke sqlite
25630 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 29 20  3KeyInfoUnref() 
25640 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  on the returned 
25650 6f 62 6a 65 63 74 0a 2a 2a 20 77 68 65 6e 20 69  object.** when i
25660 74 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 75  t has finished u
25670 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49  sing it..*/.KeyI
25680 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49  nfo *sqlite3KeyI
25690 6e 66 6f 4f 66 49 6e 64 65 78 28 50 61 72 73 65  nfoOfIndex(Parse
256a0 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
256b0 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b  *pIdx){.  int i;
256c0 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49  .  int nCol = pI
256d0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69  dx->nColumn;.  i
256e0 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d 3e  nt nKey = pIdx->
256f0 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e  nKeyCol;.  KeyIn
25700 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20  fo *pKey;.  if( 
25710 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
25720 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
25730 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  Idx->uniqNotNull
25740 20 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73   ){.    pKey = s
25750 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
25760 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  oc(pParse->db, n
25770 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b  Key, nCol-nKey);
25780 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b  .  }else{.    pK
25790 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  ey = sqlite3KeyI
257a0 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  nfoAlloc(pParse-
257b0 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20  >db, nCol, 0);. 
257c0 20 7d 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b   }.  if( pKey ){
257d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
257e0 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
257f0 74 65 61 62 6c 65 28 70 4b 65 79 29 20 29 3b 0a  teable(pKey) );.
25800 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
25810 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
25820 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
25830 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ll = pIdx->azCol
25840 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79  l[i];.      pKey
25850 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f  ->aColl[i] = zCo
25860 6c 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 42 49  ll==sqlite3StrBI
25870 4e 41 52 59 20 3f 20 30 20 3a 0a 20 20 20 20 20  NARY ? 0 :.     
25880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25890 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65     sqlite3Locate
258a0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
258b0 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b  zColl);.      pK
258c0 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ey->aSortOrder[i
258d0 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ] = pIdx->aSortO
258e0 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  rder[i];.    }. 
258f0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
25900 45 72 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Err ){.      ass
25910 65 72 74 28 20 70 50 61 72 73 65 2d 3e 72 63 3d  ert( pParse->rc=
25920 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f 4d 49  =SQLITE_ERROR_MI
25930 53 53 49 4e 47 5f 43 4f 4c 4c 53 45 51 20 29 3b  SSING_COLLSEQ );
25940 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
25950 3e 62 4e 6f 51 75 65 72 79 3d 3d 30 20 29 7b 0a  >bNoQuery==0 ){.
25960 20 20 20 20 20 20 20 20 2f 2a 20 44 65 61 63 74          /* Deact
25970 69 76 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ivate the index 
25980 62 65 63 61 75 73 65 20 69 74 20 63 6f 6e 74 61  because it conta
25990 69 6e 73 20 61 6e 20 75 6e 6b 6e 6f 77 6e 20 63  ins an unknown c
259a0 6f 6c 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 20  ollating.       
259b0 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 20 54   ** sequence.  T
259c0 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 72  he only way to r
259d0 65 61 63 74 69 76 65 20 74 68 65 20 69 6e 64 65  eactive the inde
259e0 78 20 69 73 20 74 6f 20 72 65 6c 6f 61 64 20 74  x is to reload t
259f0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 63  he.        ** sc
25a00 68 65 6d 61 2e 20 20 41 64 64 69 6e 67 20 74 68  hema.  Adding th
25a10 65 20 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74  e missing collat
25a20 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6c 61 74  ing sequence lat
25a30 65 72 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20  er does not.    
25a40 20 20 20 20 2a 2a 20 72 65 61 63 74 69 76 65 20      ** reactive 
25a50 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20  the index.  The 
25a60 61 70 70 6c 69 63 61 74 69 6f 6e 20 68 61 64 20  application had 
25a70 74 68 65 20 63 68 61 6e 63 65 20 74 6f 20 72 65  the chance to re
25a80 67 69 73 74 65 72 0a 20 20 20 20 20 20 20 20 2a  gister.        *
25a90 2a 20 74 68 65 20 6d 69 73 73 69 6e 67 20 69 6e  * the missing in
25aa0 64 65 78 20 75 73 69 6e 67 20 74 68 65 20 63 6f  dex using the co
25ab0 6c 6c 61 74 69 6f 6e 2d 6e 65 65 64 65 64 20 63  llation-needed c
25ac0 61 6c 6c 62 61 63 6b 2e 20 20 46 6f 72 0a 20 20  allback.  For.  
25ad0 20 20 20 20 20 20 2a 2a 20 73 69 6d 70 6c 69 63        ** simplic
25ae0 69 74 79 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c  ity, SQLite will
25af0 20 6e 6f 74 20 67 69 76 65 20 74 68 65 20 61 70   not give the ap
25b00 70 6c 69 63 61 74 69 6f 6e 20 61 20 73 65 63 6f  plication a seco
25b10 6e 64 20 63 68 61 6e 63 65 2e 0a 20 20 20 20 20  nd chance..     
25b20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49     */.        pI
25b30 64 78 2d 3e 62 4e 6f 51 75 65 72 79 20 3d 20 31  dx->bNoQuery = 1
25b40 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
25b50 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
25b60 52 4f 52 5f 52 45 54 52 59 3b 0a 20 20 20 20 20  ROR_RETRY;.     
25b70 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
25b80 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
25b90 79 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d  y);.      pKey =
25ba0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
25bb0 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a  return pKey;.}..
25bc0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
25bd0 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54  MIT_CTE./* .** T
25be0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69  his routine is i
25bf0 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 70 65 72 20  nvoked once per 
25c00 43 54 45 20 62 79 20 74 68 65 20 70 61 72 73 65  CTE by the parse
25c10 72 20 77 68 69 6c 65 20 70 61 72 73 69 6e 67 20  r while parsing 
25c20 61 20 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73  a .** WITH claus
25c30 65 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a 73 71 6c  e. .*/.With *sql
25c40 69 74 65 33 57 69 74 68 41 64 64 28 0a 20 20 50  ite3WithAdd(.  P
25c50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
25c60 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
25c70 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
25c80 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20  ith *pWith,     
25c90 20 20 20 20 20 20 20 2f 2a 20 45 78 69 73 74 69         /* Existi
25ca0 6e 67 20 57 49 54 48 20 63 6c 61 75 73 65 2c 20  ng WITH clause, 
25cb0 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b  or NULL */.  Tok
25cc0 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20  en *pName,      
25cd0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
25ce0 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65  the common-table
25cf0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
25d00 70 41 72 67 6c 69 73 74 2c 20 20 20 20 20 2f 2a  pArglist,     /*
25d10 20 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e   Optional column
25d20 20 6e 61 6d 65 20 6c 69 73 74 20 66 6f 72 20 74   name list for t
25d30 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65  he table */.  Se
25d40 6c 65 63 74 20 2a 70 51 75 65 72 79 20 20 20 20  lect *pQuery    
25d50 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 75        /* Query u
25d60 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  sed to initializ
25d70 65 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29  e the table */.)
25d80 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
25d90 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
25da0 57 69 74 68 20 2a 70 4e 65 77 3b 0a 20 20 63 68  With *pNew;.  ch
25db0 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a  ar *zName;..  /*
25dc0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
25dd0 43 54 45 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  CTE name is uniq
25de0 75 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 57  ue within this W
25df0 49 54 48 20 63 6c 61 75 73 65 2e 20 49 66 0a 20  ITH clause. If. 
25e00 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72 65 20 61   ** not, store a
25e10 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50  n error in the P
25e20 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  arse structure. 
25e30 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  */.  zName = sql
25e40 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
25e50 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  n(pParse->db, pN
25e60 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
25e70 65 20 26 26 20 70 57 69 74 68 20 29 7b 0a 20 20  e && pWith ){.  
25e80 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
25e90 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e  (i=0; i<pWith->n
25ea0 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
25eb0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
25ec0 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69 74 68  Cmp(zName, pWith
25ed0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
25ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
25ef0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
25f00 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 57  se, "duplicate W
25f10 49 54 48 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20  ITH table name: 
25f20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
25f30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
25f40 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20    if( pWith ){. 
25f50 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
25f60 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 20 2b 20  izeof(*pWith) + 
25f70 28 73 69 7a 65 6f 66 28 70 57 69 74 68 2d 3e 61  (sizeof(pWith->a
25f80 5b 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e 6e 43  [1]) * pWith->nC
25f90 74 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  te);.    pNew = 
25fa0 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
25fb0 28 64 62 2c 20 70 57 69 74 68 2c 20 6e 42 79 74  (db, pWith, nByt
25fc0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
25fd0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
25fe0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
25ff0 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 29 3b  sizeof(*pWith));
26000 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
26010 70 4e 65 77 21 3d 30 20 26 26 20 7a 4e 61 6d 65  pNew!=0 && zName
26020 21 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  !=0) || db->mall
26030 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 69  ocFailed );..  i
26040 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
26050 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
26060 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
26070 28 64 62 2c 20 70 41 72 67 6c 69 73 74 29 3b 0a  (db, pArglist);.
26080 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
26090 74 44 65 6c 65 74 65 28 64 62 2c 20 70 51 75 65  tDelete(db, pQue
260a0 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ry);.    sqlite3
260b0 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
260c0 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 70 57  );.    pNew = pW
260d0 69 74 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ith;.  }else{.  
260e0 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
260f0 6e 43 74 65 5d 2e 70 53 65 6c 65 63 74 20 3d 20  nCte].pSelect = 
26100 70 51 75 65 72 79 3b 0a 20 20 20 20 70 4e 65 77  pQuery;.    pNew
26110 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e  ->a[pNew->nCte].
26120 70 43 6f 6c 73 20 3d 20 70 41 72 67 6c 69 73 74  pCols = pArglist
26130 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e  ;.    pNew->a[pN
26140 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20  ew->nCte].zName 
26150 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 70 4e 65  = zName;.    pNe
26160 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d  w->a[pNew->nCte]
26170 2e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20  .zCteErr = 0;.  
26180 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a    pNew->nCte++;.
26190 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e    }..  return pN
261a0 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  ew;.}../*.** Fre
261b0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
261c0 66 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63  f the With objec
261d0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
261e0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
261f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
26200 57 69 74 68 44 65 6c 65 74 65 28 73 71 6c 69 74  WithDelete(sqlit
26210 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 57  e3 *db, With *pW
26220 69 74 68 29 7b 0a 20 20 69 66 28 20 70 57 69 74  ith){.  if( pWit
26230 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  h ){.    int i;.
26240 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
26250 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29  With->nCte; i++)
26260 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 43  {.      struct C
26270 74 65 20 2a 70 43 74 65 20 3d 20 26 70 57 69 74  te *pCte = &pWit
26280 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73  h->a[i];.      s
26290 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
262a0 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70  lete(db, pCte->p
262b0 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cols);.      sql
262c0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
262d0 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65  (db, pCte->pSele
262e0 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ct);.      sqlit
262f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 74  e3DbFree(db, pCt
26300 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e->zName);.    }
26310 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
26320 65 65 28 64 62 2c 20 70 57 69 74 68 29 3b 0a 20  ee(db, pWith);. 
26330 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
26340 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
26350 4d 49 54 5f 43 54 45 29 20 2a 2f 0a              MIT_CTE) */.