/ Hex Artifact Content
Login

Artifact 1d5dc39cb3fd437c8031c13f52f600b1541977ea68fe1c29bf200ceb22217d0f:


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 45 78 70 72 20 2a 70 43 45  .      Expr *pCE
b4f0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
b500: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69  rSkipCollate(pLi
b510: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
b520: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
b530: 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70  nameTokenRemap(p
b540: 50 61 72 73 65 2c 20 26 70 54 61 62 2d 3e 69 50  Parse, &pTab->iP
b550: 4b 65 79 2c 20 70 43 45 78 70 72 29 3b 0a 20 20  Key, pCExpr);.  
b560: 20 20 7d 0a 20 20 20 20 70 54 61 62 2d 3e 69 50    }.    pTab->iP
b570: 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  Key = iCol;.    
b580: 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20  pTab->keyConf = 
b590: 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20  (u8)onError;.   
b5a0: 20 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63   assert( autoInc
b5b0: 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d  ==0 || autoInc==
b5c0: 31 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74  1 );.    pTab->t
b5d0: 61 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49  abFlags |= autoI
b5e0: 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d  nc*TF_Autoincrem
b5f0: 65 6e 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ent;.    if( pLi
b600: 73 74 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b  st ) pParse->iPk
b610: 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73  SortOrder = pLis
b620: 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  t->a[0].sortOrde
b630: 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61  r;.  }else if( a
b640: 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65  utoInc ){.#ifnde
b650: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
b660: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
b670: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
b680: 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43  pParse, "AUTOINC
b690: 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61  REMENT is only a
b6a0: 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20  llowed on an ". 
b6b0: 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50        "INTEGER P
b6c0: 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65  RIMARY KEY");.#e
b6d0: 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
b6e0: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49    sqlite3CreateI
b6f0: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20  ndex(pParse, 0, 
b700: 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45  0, 0, pList, onE
b710: 72 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20  rror, 0,.       
b720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b730: 20 20 20 20 30 2c 20 73 6f 72 74 4f 72 64 65 72      0, sortOrder
b740: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 49 44 58 54  , 0, SQLITE_IDXT
b750: 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b  YPE_PRIMARYKEY);
b760: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a  .    pList = 0;.
b770: 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79    }..primary_key
b780: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
b790: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
b7a0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74  Parse->db, pList
b7b0: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
b7c0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
b7d0: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
b7e0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
b7f0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
b800: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
b810: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68  oid sqlite3AddCh
b820: 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  eckConstraint(. 
b830: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
b840: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
b850: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
b860: 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20  *pCheckExpr  /* 
b870: 54 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73  The check expres
b880: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  sion */.){.#ifnd
b890: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
b8a0: 48 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54  HECK.  Table *pT
b8b0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
b8c0: 77 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65  wTable;.  sqlite
b8d0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
b8e0: 64 62 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26  db;.  if( pTab &
b8f0: 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  & !IN_DECLARE_VT
b900: 41 42 0a 20 20 20 26 26 20 21 73 71 6c 69 74 65  AB.   && !sqlite
b910: 33 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79  3BtreeIsReadonly
b920: 28 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e 69  (db->aDb[db->ini
b930: 74 2e 69 44 62 5d 2e 70 42 74 29 0a 20 20 29 7b  t.iDb].pBt).  ){
b940: 0a 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63  .    pTab->pChec
b950: 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  k = sqlite3ExprL
b960: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
b970: 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20  , pTab->pCheck, 
b980: 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20  pCheckExpr);.   
b990: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e   if( pParse->con
b9a0: 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b  straintName.n ){
b9b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
b9c0: 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50  prListSetName(pP
b9d0: 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65  arse, pTab->pChe
b9e0: 63 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e  ck, &pParse->con
b9f0: 73 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b  straintName, 1);
ba00: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23  .    }.  }else.#
ba10: 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71  endif.  {.    sq
ba20: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
ba30: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65  pParse->db, pChe
ba40: 63 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  ckExpr);.  }.}..
ba50: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
ba60: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
ba70: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
ba80: 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62  ently parsed tab
ba90: 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20  le column.** to 
baa0: 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65  the CollSeq give
bab0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
bac0: 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65  e3AddCollateType
bad0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
bae0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
baf0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
bb00: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f  t i;.  char *zCo
bb10: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
bb20: 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d   /* Dequoted nam
bb30: 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  e of collation s
bb40: 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c  equence */.  sql
bb50: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
bb60: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
bb70: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
bb80: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
bb90: 43 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50  Col-1;.  db = pP
bba0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c  arse->db;.  zCol
bbb0: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
bbc0: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f  romToken(db, pTo
bbd0: 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f  ken);.  if( !zCo
bbe0: 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  ll ) return;..  
bbf0: 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  if( sqlite3Locat
bc00: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
bc10: 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49   zColl) ){.    I
bc20: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
bc30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
bc40: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  , p->aCol[i].zCo
bc50: 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c  ll);.    p->aCol
bc60: 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c  [i].zColl = zCol
bc70: 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  l;.  .    /* If 
bc80: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65  the column is de
bc90: 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65  clared as "<name
bca0: 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f  > PRIMARY KEY CO
bcb0: 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20  LLATE <type>",. 
bcc0: 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e     ** then an in
bcd0: 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65  dex may have bee
bce0: 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69  n created on thi
bcf0: 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20  s column before 
bd00: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61  the.    ** colla
bd10: 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64  tion type was ad
bd20: 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69  ded. Correct thi
bd30: 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63  s if it is the c
bd40: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
bd50: 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64  for(pIdx=p->pInd
bd60: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
bd70: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
bd80: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
bd90: 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20  >nKeyCol==1 );. 
bda0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
bdb0: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b  iColumn[0]==i ){
bdc0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
bdd0: 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43  zColl[0] = p->aC
bde0: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[i].zColl;.   
bdf0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
be00: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  se{.    sqlite3D
be10: 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
be20: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
be30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
be40: 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  urns the collati
be50: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
be60: 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20  database native 
be70: 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67  text.** encoding
be80: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
be90: 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c  he string zName,
bea0: 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a   length nName..*
beb0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
bec0: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ested collation 
bed0: 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20  sequence is not 
bee0: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f  available, or no
bef0: 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69  t available.** i
bf00: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  n the database n
bf10: 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20  ative encoding, 
bf20: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
bf30: 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64  ctory is invoked
bf40: 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69   to.** request i
bf50: 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74  t. If the collat
bf60: 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73  ion factory does
bf70: 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68   not supply such
bf80: 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20   a sequence,.** 
bf90: 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65  and the sequence
bfa0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
bfb0: 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e   another text en
bfc0: 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61  coding, then tha
bfd0: 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  t is.** returned
bfe0: 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
bff0: 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f  If no versions o
c000: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
c010: 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65  collations seque
c020: 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c  nce are availabl
c030: 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72  e, or.** another
c040: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
c050: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
c060: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
c070: 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74  sage written int
c080: 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  o.** pParse..**.
c090: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
c0a0: 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
c0b0: 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43  und sqlite3FindC
c0c0: 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20  ollSeq().  This 
c0d0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b  routine.** invok
c0e0: 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
c0f0: 20 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20   factory if the 
c100: 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  named collation 
c110: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a  cannot be found.
c120: 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73  ** and generates
c130: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
c140: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
c150: 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  o: sqlite3FindCo
c160: 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33  llSeq(), sqlite3
c170: 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a  GetCollSeq().*/.
c180: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
c190: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61  LocateCollSeq(Pa
c1a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
c1b0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
c1c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c1d0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75   pParse->db;.  u
c1e0: 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  8 enc = ENC(db);
c1f0: 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d  .  u8 initbusy =
c200: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a   db->init.busy;.
c210: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
c220: 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  ;..  pColl = sql
c230: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
c240: 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20  db, enc, zName, 
c250: 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28  initbusy);.  if(
c260: 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21   !initbusy && (!
c270: 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d  pColl || !pColl-
c280: 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43  >xCmp) ){.    pC
c290: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
c2a0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
c2b0: 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d  enc, pColl, zNam
c2c0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  e);.  }..  retur
c2d0: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a  n pColl;.}.../*.
c2e0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
c2f0: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65   that will incre
c300: 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20  ment the schema 
c310: 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cookie..**.** Th
c320: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
c330: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
c340: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
c350: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
c360: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
c370: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
c380: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
c390: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
c3a0: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
c3b0: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
c3c0: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
c3d0: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
c3e0: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
c3f0: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
c400: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
c410: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
c420: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
c430: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
c440: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
c450: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
c460: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
c470: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
c480: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
c490: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
c4a0: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
c4b0: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
c4c0: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
c4d0: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
c4e0: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
c4f0: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
c500: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
c510: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
c520: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
c530: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
c540: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
c550: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
c560: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
c570: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
c580: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
c590: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
c5a0: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a  fe enough..**.**
c5b0: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
c5c0: 4f 46 3a 20 52 2d 33 34 32 33 30 2d 35 36 30 34  OF: R-34230-5604
c5d0: 39 20 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74  9 SQLite automat
c5e0: 69 63 61 6c 6c 79 20 69 6e 63 72 65 6d 65 6e 74  ically increment
c5f0: 73 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d  s.** the schema-
c600: 76 65 72 73 69 6f 6e 20 77 68 65 6e 65 76 65 72  version whenever
c610: 20 74 68 65 20 73 63 68 65 6d 61 20 63 68 61 6e   the schema chan
c620: 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ges..*/.void sql
c630: 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
c640: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c650: 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69  int iDb){.  sqli
c660: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
c670: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
c680: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
c690: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c6a0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
c6b0: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
c6c0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
c6d0: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f  dOp3(v, OP_SetCo
c6e0: 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45  okie, iDb, BTREE
c6f0: 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c  _SCHEMA_VERSION,
c700: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
c710: 20 20 20 20 20 28 69 6e 74 29 28 31 2b 28 75 6e       (int)(1+(un
c720: 73 69 67 6e 65 64 29 64 62 2d 3e 61 44 62 5b 69  signed)db->aDb[i
c730: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68  Db].pSchema->sch
c740: 65 6d 61 5f 63 6f 6f 6b 69 65 29 29 3b 0a 7d 0a  ema_cookie));.}.
c750: 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74  ./*.** Measure t
c760: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
c770: 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74  racters needed t
c780: 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76  o output the giv
c790: 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72  en.** identifier
c7a0: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65  .  The number re
c7b0: 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20  turned includes 
c7c0: 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a  any quotes used.
c7d0: 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  ** but does not 
c7e0: 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c  include the null
c7f0: 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a   terminator..**.
c800: 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20  ** The estimate 
c810: 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e  is conservative.
c820: 20 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61    It might be la
c830: 72 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69  rger that what i
c840: 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64  s.** really need
c850: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
c860: 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f  t identLength(co
c870: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
c880: 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30  int n;.  for(n=0
c890: 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b  ; *z; n++, z++){
c8a0: 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27  .    if( *z=='"'
c8b0: 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20   ){ n++; }.  }. 
c8c0: 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d   return n + 2;.}
c8d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
c8e0: 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  t parameter is a
c8f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
c900: 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68  utput buffer. Th
c910: 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72  e second .** par
c920: 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
c930: 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ter to an intege
c940: 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  r that contains 
c950: 74 68 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a  the offset at.**
c960: 20 77 68 69 63 68 20 74 6f 20 77 72 69 74 65 20   which to write 
c970: 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  into the output 
c980: 62 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e  buffer. This fun
c990: 63 74 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65  ction copies the
c9a0: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
c9b0: 65 64 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65  ed string pointe
c9c0: 64 20 74 6f 20 62 79 20 74 68 65 20 74 68 69 72  d to by the thir
c9d0: 64 20 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69  d parameter, zSi
c9e0: 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f  gnedIdent,.** to
c9f0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f   the specified o
ca00: 66 66 73 65 74 20 69 6e 20 74 68 65 20 62 75 66  ffset in the buf
ca10: 66 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20  fer and updates 
ca20: 2a 70 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a  *pIdx to refer.*
ca30: 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  * to the first b
ca40: 79 74 65 20 61 66 74 65 72 20 74 68 65 20 6c 61  yte after the la
ca50: 73 74 20 62 79 74 65 20 77 72 69 74 74 65 6e 20  st byte written 
ca60: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
ca70: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
ca80: 73 74 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64  string zSignedId
ca90: 65 6e 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  ent consists ent
caa0: 69 72 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e  irely of alpha-n
cab0: 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63  umeric.** charac
cac0: 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62  ters, does not b
cad0: 65 67 69 6e 20 77 69 74 68 20 61 20 64 69 67 69  egin with a digi
cae0: 74 20 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20  t and is not an 
caf0: 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20  SQL keyword,.** 
cb00: 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65  then it is copie
cb10: 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  d to the output 
cb20: 62 75 66 66 65 72 20 65 78 61 63 74 6c 79 20 61  buffer exactly a
cb30: 73 20 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69  s it is. Otherwi
cb40: 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f  se,.** it is quo
cb50: 74 65 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65  ted using double
cb60: 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  -quotes..*/.stat
cb70: 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74  ic void identPut
cb80: 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70  (char *z, int *p
cb90: 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e  Idx, char *zSign
cba0: 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69  edIdent){.  unsi
cbb0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e  gned char *zIden
cbc0: 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  t = (unsigned ch
cbd0: 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74  ar*)zSignedIdent
cbe0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65  ;.  int i, j, ne
cbf0: 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a  edQuote;.  i = *
cc00: 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30  pIdx;..  for(j=0
cc10: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
cc20: 29 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  ){.    if( !sqli
cc30: 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e  te3Isalnum(zIden
cc40: 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b  t[j]) && zIdent[
cc50: 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b  j]!='_' ) break;
cc60: 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65  .  }.  needQuote
cc70: 20 3d 20 73 71 6c 69 74 65 33 49 73 64 69 67 69   = sqlite3Isdigi
cc80: 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20  t(zIdent[0]).   
cc90: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
cca0: 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a  te3KeywordCode(z
ccb0: 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44  Ident, j)!=TK_ID
ccc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
ccd0: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20  zIdent[j]!=0.   
cce0: 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30           || j==0
ccf0: 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f  ;..  if( needQuo
cd00: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  te ) z[i++] = '"
cd10: 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  ';.  for(j=0; zI
cd20: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
cd30: 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65     z[i++] = zIde
cd40: 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a  nt[j];.    if( z
cd50: 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20  Ident[j]=='"' ) 
cd60: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
cd70: 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  }.  if( needQuot
cd80: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
cd90: 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20  ;.  z[i] = 0;.  
cda0: 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a  *pIdx = i;.}../*
cdb0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43  .** Generate a C
cdc0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
cdd0: 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74  ement appropriat
cde0: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
cdf0: 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72  ** table.  Memor
ce00: 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65  y to hold the te
ce10: 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  xt of the statem
ce20: 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ent is obtained.
ce30: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ** from sqliteMa
ce40: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
ce50: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
ce60: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
ce70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
ce80: 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d   *createTableStm
ce90: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  t(sqlite3 *db, T
cea0: 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  able *p){.  int 
ceb0: 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20  i, k, n;.  char 
cec0: 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a  *zStmt;.  char *
ced0: 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a  zSep, *zSep2, *z
cee0: 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  End;.  Column *p
cef0: 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  Col;.  n = 0;.  
cf00: 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43  for(pCol = p->aC
cf10: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
cf20: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
cf30: 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74  {.    n += ident
cf40: 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61  Length(pCol->zNa
cf50: 6d 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e  me) + 5;.  }.  n
cf60: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
cf70: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  p->zName);.  if(
cf80: 20 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53   n<50 ){ .    zS
cf90: 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65  ep = "";.    zSe
cfa0: 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45  p2 = ",";.    zE
cfb0: 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73  nd = ")";.  }els
cfc0: 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c  e{.    zSep = "\
cfd0: 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  n  ";.    zSep2 
cfe0: 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a  = ",\n  ";.    z
cff0: 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d  End = "\n)";.  }
d000: 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70  .  n += 35 + 6*p
d010: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20  ->nCol;.  zStmt 
d020: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
d030: 63 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66  cRaw(0, n);.  if
d040: 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  ( zStmt==0 ){.  
d050: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
d060: 74 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72  t(db);.    retur
d070: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
d080: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a  e3_snprintf(n, z
d090: 53 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41  Stmt, "CREATE TA
d0a0: 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71  BLE ");.  k = sq
d0b0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53  lite3Strlen30(zS
d0c0: 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74  tmt);.  identPut
d0d0: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a  (zStmt, &k, p->z
d0e0: 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b  Name);.  zStmt[k
d0f0: 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72  ++] = '(';.  for
d100: 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69  (pCol=p->aCol, i
d110: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
d120: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
d130: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
d140: 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70  ar * const azTyp
d150: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
d160: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  /* SQLITE_AFF_BL
d170: 4f 42 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20  OB    */ "",.   
d180: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
d190: 46 46 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20  FF_TEXT    */ " 
d1a0: 54 45 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f  TEXT",.        /
d1b0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  * SQLITE_AFF_NUM
d1c0: 45 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a  ERIC */ " NUM",.
d1d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
d1e0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f  E_AFF_INTEGER */
d1f0: 20 22 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20   " INT",.       
d200: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52   /* SQLITE_AFF_R
d210: 45 41 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c  EAL    */ " REAL
d220: 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  ".    };.    int
d230: 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20   len;.    const 
d240: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20  char *zType;..  
d250: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
d260: 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b  tf(n-k, &zStmt[k
d270: 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20  ], zSep);.    k 
d280: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
d290: 33 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20  30(&zStmt[k]);. 
d2a0: 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b     zSep = zSep2;
d2b0: 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53  .    identPut(zS
d2c0: 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a  tmt, &k, pCol->z
d2d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Name);.    asser
d2e0: 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  t( pCol->affinit
d2f0: 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  y-SQLITE_AFF_BLO
d300: 42 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73  B >= 0 );.    as
d310: 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69  sert( pCol->affi
d320: 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f  nity-SQLITE_AFF_
d330: 42 4c 4f 42 20 3c 20 41 72 72 61 79 53 69 7a 65  BLOB < ArraySize
d340: 28 61 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20  (azType) );.    
d350: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
d360: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
d370: 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20  _AFF_BLOB );.   
d380: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
d390: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
d3a0: 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20  E_AFF_TEXT );.  
d3b0: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
d3c0: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
d3d0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
d3e0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
d3f0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
d400: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
d410: 45 52 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ER );.    testca
d420: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
d430: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ty==SQLITE_AFF_R
d440: 45 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20  EAL );.    .    
d450: 7a 54 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70  zType = azType[p
d460: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20  Col->affinity - 
d470: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d  SQLITE_AFF_BLOB]
d480: 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69  ;.    len = sqli
d490: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70  te3Strlen30(zTyp
d4a0: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
d4b0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
d4c0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
d4d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
d4e0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
d4f0: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
d500: 79 70 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b  ype(zType, 0) );
d510: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74  .    memcpy(&zSt
d520: 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65  mt[k], zType, le
d530: 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e  n);.    k += len
d540: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c  ;.    assert( k<
d550: 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  =n );.  }.  sqli
d560: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b  te3_snprintf(n-k
d570: 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73  , &zStmt[k], "%s
d580: 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75  ", zEnd);.  retu
d590: 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a  rn zStmt;.}../*.
d5a0: 2a 2a 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64  ** Resize an Ind
d5b0: 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c  ex object to hol
d5c0: 64 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61  d N columns tota
d5d0: 6c 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  l.  Return SQLIT
d5e0: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
d5f0: 73 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f  ss and SQLITE_NO
d600: 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72  MEM on an OOM er
d610: 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ror..*/.static i
d620: 6e 74 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62  nt resizeIndexOb
d630: 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  ject(sqlite3 *db
d640: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69  , Index *pIdx, i
d650: 6e 74 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a  nt N){.  char *z
d660: 45 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79  Extra;.  int nBy
d670: 74 65 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e  te;.  if( pIdx->
d680: 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74  nColumn>=N ) ret
d690: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
d6a0: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69   assert( pIdx->i
d6b0: 73 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20  sResized==0 );. 
d6c0: 20 6e 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66   nByte = (sizeof
d6d0: 28 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66  (char*) + sizeof
d6e0: 28 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20  (i16) + 1)*N;.  
d6f0: 7a 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33  zExtra = sqlite3
d700: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
d710: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a   nByte);.  if( z
d720: 45 78 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72  Extra==0 ) retur
d730: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
d740: 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45  KPT;.  memcpy(zE
d750: 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  xtra, pIdx->azCo
d760: 6c 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a  ll, sizeof(char*
d770: 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  )*pIdx->nColumn)
d780: 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  ;.  pIdx->azColl
d790: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a   = (const char**
d7a0: 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72  )zExtra;.  zExtr
d7b0: 61 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61 72  a += sizeof(char
d7c0: 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a  *)*N;.  memcpy(z
d7d0: 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 69 43  Extra, pIdx->aiC
d7e0: 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31  olumn, sizeof(i1
d7f0: 36 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  6)*pIdx->nColumn
d800: 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c  );.  pIdx->aiCol
d810: 75 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78 74  umn = (i16*)zExt
d820: 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20  ra;.  zExtra += 
d830: 73 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20  sizeof(i16)*N;. 
d840: 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20   memcpy(zExtra, 
d850: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
d860: 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  , pIdx->nColumn)
d870: 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ;.  pIdx->aSortO
d880: 72 64 65 72 20 3d 20 28 75 38 2a 29 7a 45 78 74  rder = (u8*)zExt
d890: 72 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c  ra;.  pIdx->nCol
d8a0: 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d  umn = N;.  pIdx-
d8b0: 3e 69 73 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a  >isResized = 1;.
d8c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d8d0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74  OK;.}../*.** Est
d8e0: 69 6d 61 74 65 20 74 68 65 20 74 6f 74 61 6c 20  imate the total 
d8f0: 72 6f 77 20 77 69 64 74 68 20 66 6f 72 20 61 20  row width for a 
d900: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
d910: 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65 54 61   void estimateTa
d920: 62 6c 65 57 69 64 74 68 28 54 61 62 6c 65 20 2a  bleWidth(Table *
d930: 70 54 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pTab){.  unsigne
d940: 64 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  d wTable = 0;.  
d950: 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54  const Column *pT
d960: 61 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  abCol;.  int i;.
d970: 20 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43    for(i=pTab->nC
d980: 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62  ol, pTabCol=pTab
d990: 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d  ->aCol; i>0; i--
d9a0: 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20  , pTabCol++){.  
d9b0: 20 20 77 54 61 62 6c 65 20 2b 3d 20 70 54 61 62    wTable += pTab
d9c0: 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a  Col->szEst;.  }.
d9d0: 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65    if( pTab->iPKe
d9e0: 79 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a  y<0 ) wTable++;.
d9f0: 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77    pTab->szTabRow
da00: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
da10: 28 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f  (wTable*4);.}../
da20: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
da30: 65 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f  e average size o
da40: 66 20 61 20 72 6f 77 20 66 6f 72 20 61 6e 20 69  f a row for an i
da50: 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
da60: 76 6f 69 64 20 65 73 74 69 6d 61 74 65 49 6e 64  void estimateInd
da70: 65 78 57 69 64 74 68 28 49 6e 64 65 78 20 2a 70  exWidth(Index *p
da80: 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Idx){.  unsigned
da90: 20 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69   wIndex = 0;.  i
daa0: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f  nt i;.  const Co
dab0: 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64  lumn *aCol = pId
dac0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b  x->pTable->aCol;
dad0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
dae0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
daf0: 29 7b 0a 20 20 20 20 69 31 36 20 78 20 3d 20 70  ){.    i16 x = p
db00: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
db10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 78 3c  ;.    assert( x<
db20: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43  pIdx->pTable->nC
db30: 6f 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64 65 78  ol );.    wIndex
db40: 20 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61 43   += x<0 ? 1 : aC
db50: 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  ol[pIdx->aiColum
db60: 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d  n[i]].szEst;.  }
db70: 0a 20 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  .  pIdx->szIdxRo
db80: 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
db90: 74 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a  t(wIndex*4);.}..
dba0: 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  /* Return true i
dbb0: 66 20 76 61 6c 75 65 20 78 20 69 73 20 66 6f 75  f value x is fou
dbc0: 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69  nd any of the fi
dbd0: 72 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73  rst nCol entries
dbe0: 20 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73   of aiCol[].*/.s
dbf0: 74 61 74 69 63 20 69 6e 74 20 68 61 73 43 6f 6c  tatic int hasCol
dc00: 75 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a 61  umn(const i16 *a
dc10: 69 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20  iCol, int nCol, 
dc20: 69 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c 65 28  int x){.  while(
dc30: 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66   nCol-- > 0 ) if
dc40: 28 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20  ( x==*(aiCol++) 
dc50: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
dc60: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65  turn 0;.}../* Re
dc70: 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 4e  compute the colN
dc80: 6f 74 49 64 78 65 64 20 66 69 65 6c 64 20 6f 66  otIdxed field of
dc90: 20 74 68 65 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a   the Index..**.*
dca0: 2a 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 69 73  * colNotIdxed is
dcb0: 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20   a bitmask that 
dcc0: 68 61 73 20 61 20 30 20 62 69 74 20 72 65 70 72  has a 0 bit repr
dcd0: 65 73 65 6e 74 69 6e 67 20 65 61 63 68 20 69 6e  esenting each in
dce0: 64 65 78 65 64 0a 2a 2a 20 63 6f 6c 75 6d 6e 73  dexed.** columns
dcf0: 20 74 68 61 74 20 61 72 65 20 77 69 74 68 69 6e   that are within
dd00: 20 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f   the first 63 co
dd10: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62  lumns of the tab
dd20: 6c 65 2e 20 20 54 68 65 0a 2a 2a 20 68 69 67 68  le.  The.** high
dd30: 2d 6f 72 64 65 72 20 62 69 74 20 6f 66 20 63 6f  -order bit of co
dd40: 6c 4e 6f 74 49 64 78 65 64 20 69 73 20 61 6c 77  lNotIdxed is alw
dd50: 61 79 73 20 31 2e 20 20 41 6c 6c 20 75 6e 69 6e  ays 1.  All unin
dd60: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  dexed columns.**
dd70: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 68 61   of the table ha
dd80: 76 65 20 61 20 31 2e 0a 2a 2a 0a 2a 2a 20 54 68  ve a 1..**.** Th
dd90: 65 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 6d 61  e colNotIdxed ma
dda0: 73 6b 20 69 73 20 41 4e 44 2d 65 64 20 77 69 74  sk is AND-ed wit
ddb0: 68 20 74 68 65 20 53 72 63 4c 69 73 74 2e 61 5b  h the SrcList.a[
ddc0: 5d 2e 63 6f 6c 55 73 65 64 20 6d 61 73 6b 0a 2a  ].colUsed mask.*
ddd0: 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  * to determine i
dde0: 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 63  f the index is c
ddf0: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 2a  overing index..*
de00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
de10: 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f  computeColumnsNo
de20: 74 49 6e 64 65 78 65 64 28 49 6e 64 65 78 20 2a  tIndexed(Index *
de30: 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b  pIdx){.  Bitmask
de40: 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b   m = 0;.  int j;
de50: 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e  .  for(j=pIdx->n
de60: 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20  Column-1; j>=0; 
de70: 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  j--){.    int x 
de80: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
de90: 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d  [j];.    if( x>=
dea0: 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
deb0: 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b  ase( x==BMS-1 );
dec0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ded0: 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20   x==BMS-2 );.   
dee0: 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29     if( x<BMS-1 )
def0: 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29   m |= MASKBIT(x)
df00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49  ;.    }.  }.  pI
df10: 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 20  dx->colNotIdxed 
df20: 3d 20 7e 6d 3b 0a 20 20 61 73 73 65 72 74 28 20  = ~m;.  assert( 
df30: 28 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78  (pIdx->colNotIdx
df40: 65 64 3e 3e 36 33 29 3d 3d 31 20 29 3b 0a 7d 0a  ed>>63)==1 );.}.
df50: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
df60: 69 6e 65 20 72 75 6e 73 20 61 74 20 74 68 65 20  ine runs at the 
df70: 65 6e 64 20 6f 66 20 70 61 72 73 69 6e 67 20 61  end of parsing a
df80: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
df90: 61 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20  atement that.** 
dfa0: 68 61 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f  has a WITHOUT RO
dfb0: 57 49 44 20 63 6c 61 75 73 65 2e 20 20 54 68 65  WID clause.  The
dfc0: 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75   job of this rou
dfd0: 74 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76 65  tine is to conve
dfe0: 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72  rt both.** inter
dff0: 6e 61 6c 20 73 63 68 65 6d 61 20 64 61 74 61 20  nal schema data 
e000: 73 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 74  structures and t
e010: 68 65 20 67 65 6e 65 72 61 74 65 64 20 56 44 42  he generated VDB
e020: 45 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20 74  E code so that t
e030: 68 65 79 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f  hey.** are appro
e040: 70 72 69 61 74 65 20 66 6f 72 20 61 20 57 49 54  priate for a WIT
e050: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
e060: 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 72 6f   instead of a ro
e070: 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68  wid table..** Ch
e080: 61 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a  anges include:.*
e090: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 53 65  *.**     (1)  Se
e0a0: 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66  t all columns of
e0b0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
e0c0: 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 74   schema object t
e0d0: 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a  o be NOT NULL..*
e0e0: 2a 20 20 20 20 20 28 32 29 20 20 43 6f 6e 76 65  *     (2)  Conve
e0f0: 72 74 20 50 33 20 70 61 72 61 6d 65 74 65 72 20  rt P3 parameter 
e100: 6f 66 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65  of the OP_Create
e110: 42 74 72 65 65 20 66 72 6f 6d 20 42 54 52 45 45  Btree from BTREE
e120: 5f 49 4e 54 4b 45 59 20 0a 2a 2a 20 20 20 20 20  _INTKEY .**     
e130: 20 20 20 20 20 69 6e 74 6f 20 42 54 52 45 45 5f       into BTREE_
e140: 42 4c 4f 42 4b 45 59 2e 0a 2a 2a 20 20 20 20 20  BLOBKEY..**     
e150: 28 33 29 20 20 42 79 70 61 73 73 20 74 68 65 20  (3)  Bypass the 
e160: 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  creation of the 
e170: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
e180: 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20 20  ble entry.**    
e190: 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 50 52        for the PR
e1a0: 49 4d 41 52 59 20 4b 45 59 20 61 73 20 74 68 65  IMARY KEY as the
e1b0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
e1c0: 65 78 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20 20  ex is now.**    
e1d0: 20 20 20 20 20 20 69 64 65 6e 74 69 66 69 65 64        identified
e1e0: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   by the sqlite_m
e1f0: 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72  aster table entr
e200: 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  y of the table i
e210: 74 73 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28 34  tself..**     (4
e220: 29 20 20 53 65 74 20 74 68 65 20 49 6e 64 65 78  )  Set the Index
e230: 2e 74 6e 75 6d 20 6f 66 20 74 68 65 20 50 52 49  .tnum of the PRI
e240: 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f  MARY KEY Index o
e250: 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20  bject in the.** 
e260: 20 20 20 20 20 20 20 20 20 73 63 68 65 6d 61 20           schema 
e270: 74 6f 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20  to the rootpage 
e280: 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 61  from the main ta
e290: 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 35 29 20  ble..**     (5) 
e2a0: 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63   Add all table c
e2b0: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52  olumns to the PR
e2c0: 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20  IMARY KEY Index 
e2d0: 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20 20 20 20  object.**       
e2e0: 20 20 20 73 6f 20 74 68 61 74 20 74 68 65 20 50     so that the P
e2f0: 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 61 20  RIMARY KEY is a 
e300: 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20  covering index. 
e310: 20 54 68 65 20 73 75 72 70 6c 75 73 0a 2a 2a 20   The surplus.** 
e320: 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73           columns
e330: 20 61 72 65 20 70 61 72 74 20 6f 66 20 4b 65 79   are part of Key
e340: 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20 61  Info.nAllField a
e350: 6e 64 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  nd are not used 
e360: 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  for.**          
e370: 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b 75  sorting or looku
e380: 70 20 6f 72 20 75 6e 69 71 75 65 6e 65 73 73 20  p or uniqueness 
e390: 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20 20 28  checks..**     (
e3a0: 36 29 20 20 52 65 70 6c 61 63 65 20 74 68 65 20  6)  Replace the 
e3b0: 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20 61 6c  rowid tail on al
e3c0: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
e3d0: 67 65 6e 65 72 61 74 65 64 20 55 4e 49 51 55 45  generated UNIQUE
e3e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e 64  .**          ind
e3f0: 69 63 65 73 20 77 69 74 68 20 74 68 65 20 50 52  ices with the PR
e400: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
e410: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 76 69 72  s..**.** For vir
e420: 74 75 61 6c 20 74 61 62 6c 65 73 2c 20 6f 6e 6c  tual tables, onl
e430: 79 20 28 31 29 20 69 73 20 70 65 72 66 6f 72 6d  y (1) is perform
e440: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
e450: 69 64 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68  id convertToWith
e460: 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 50 61  outRowidTable(Pa
e470: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
e480: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64  le *pTab){.  Ind
e490: 65 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e 64 65  ex *pIdx;.  Inde
e4a0: 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20 6e 50  x *pPk;.  int nP
e4b0: 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  k;.  int i, j;. 
e4c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
e4d0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
e4e0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
e4f0: 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  Vdbe;..  /* Mark
e500: 20 65 76 65 72 79 20 50 52 49 4d 41 52 59 20 4b   every PRIMARY K
e510: 45 59 20 63 6f 6c 75 6d 6e 20 61 73 20 4e 4f 54  EY column as NOT
e520: 20 4e 55 4c 4c 20 28 65 78 63 65 70 74 20 66 6f   NULL (except fo
e530: 72 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  r imposter table
e540: 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  s).  */.  if( !d
e550: 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72  b->init.imposter
e560: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 6f 72  Table ){.    for
e570: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
e580: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
e590: 69 66 28 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  if( (pTab->aCol[
e5a0: 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f  i].colFlags & CO
e5b0: 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d  LFLAG_PRIMKEY)!=
e5c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61  0 ){.        pTa
e5d0: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75  b->aCol[i].notNu
e5e0: 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  ll = OE_Abort;. 
e5f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
e600: 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74  ..  /* Convert t
e610: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 6f 66  he P3 operand of
e620: 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 42 74   the OP_CreateBt
e630: 72 65 65 20 6f 70 63 6f 64 65 20 66 72 6f 6d 20  ree opcode from 
e640: 42 54 52 45 45 5f 49 4e 54 4b 45 59 0a 20 20 2a  BTREE_INTKEY.  *
e650: 2a 20 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c 4f  * into BTREE_BLO
e660: 42 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BKEY..  */.  if(
e670: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54   pParse->addrCrT
e680: 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
e690: 28 20 76 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ( v );.    sqlit
e6a0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
e6b0: 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72  , pParse->addrCr
e6c0: 54 61 62 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b  Tab, BTREE_BLOBK
e6d0: 45 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  EY);.  }..  /* L
e6e0: 6f 63 61 74 65 20 74 68 65 20 50 52 49 4d 41 52  ocate the PRIMAR
e6f0: 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f 72  Y KEY index.  Or
e700: 2c 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20  , if this table 
e710: 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  was originally. 
e720: 20 2a 2a 20 61 6e 20 49 4e 54 45 47 45 52 20 50   ** an INTEGER P
e730: 52 49 4d 41 52 59 20 4b 45 59 20 74 61 62 6c 65  RIMARY KEY table
e740: 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 50  , create a new P
e750: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
e760: 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  . .  */.  if( pT
e770: 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a  ab->iPKey>=0 ){.
e780: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
e790: 69 73 74 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 69  ist;.    Token i
e7a0: 70 6b 54 6f 6b 65 6e 3b 0a 20 20 20 20 73 71 6c  pkToken;.    sql
e7b0: 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 69  ite3TokenInit(&i
e7c0: 70 6b 54 6f 6b 65 6e 2c 20 70 54 61 62 2d 3e 61  pkToken, pTab->a
e7d0: 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d  Col[pTab->iPKey]
e7e0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69  .zName);.    pLi
e7f0: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
e800: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
e810: 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  e, 0, .         
e820: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e830: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
e840: 5f 49 44 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c 20  _ID, &ipkToken, 
e850: 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  0));.    if( pLi
e860: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
e870: 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e      pList->a[0].
e880: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 50 61 72  sortOrder = pPar
e890: 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72  se->iPkSortOrder
e8a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
e8b0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
e8c0: 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 73 71 6c  =pTab );.    sql
e8d0: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
e8e0: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
e8f0: 20 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65   pList, pTab->ke
e900: 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20  yConf, 0, 0, 0, 
e910: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
e920: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
e930: 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59  _IDXTYPE_PRIMARY
e940: 4b 45 59 29 3b 0a 20 20 20 20 69 66 28 20 64 62  KEY);.    if( db
e950: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
e960: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
e970: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b   return;.    pPk
e980: 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
e990: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
e9a0: 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
e9b0: 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
e9c0: 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65      pPk = sqlite
e9d0: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
e9e0: 28 70 54 61 62 29 3b 0a 20 20 20 20 61 73 73 65  (pTab);.    asse
e9f0: 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 0a 20  rt( pPk!=0 );.. 
ea00: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 6d     /*.    ** Rem
ea10: 6f 76 65 20 61 6c 6c 20 72 65 64 75 6e 64 61 6e  ove all redundan
ea20: 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  t columns from t
ea30: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20  he PRIMARY KEY. 
ea40: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 68   For example, ch
ea50: 61 6e 67 65 0a 20 20 20 20 2a 2a 20 22 50 52 49  ange.    ** "PRI
ea60: 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 61 2c 62  MARY KEY(a,b,a,b
ea70: 2c 63 2c 62 2c 63 2c 64 29 22 20 69 6e 74 6f 20  ,c,b,c,d)" into 
ea80: 6a 75 73 74 20 22 50 52 49 4d 41 52 59 20 4b 45  just "PRIMARY KE
ea90: 59 28 61 2c 62 2c 63 2c 64 29 22 2e 20 20 4c 61  Y(a,b,c,d)".  La
eaa0: 74 65 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  ter.    ** code 
eab0: 61 73 73 75 6d 65 73 20 74 68 65 20 50 52 49 4d  assumes the PRIM
eac0: 41 52 59 20 4b 45 59 20 63 6f 6e 74 61 69 6e 73  ARY KEY contains
ead0: 20 6e 6f 20 72 65 70 65 61 74 65 64 20 63 6f 6c   no repeated col
eae0: 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  umns..    */.   
eaf0: 20 66 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c 70 50   for(i=j=1; i<pP
eb00: 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29  k->nKeyCol; i++)
eb10: 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 43  {.      if( hasC
eb20: 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c  olumn(pPk->aiCol
eb30: 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69 43  umn, j, pPk->aiC
eb40: 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20  olumn[i]) ){.   
eb50: 20 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d       pPk->nColum
eb60: 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n--;.      }else
eb70: 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61  {.        pPk->a
eb80: 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70  iColumn[j++] = p
eb90: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  Pk->aiColumn[i];
eba0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ebb0: 20 20 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20     pPk->nKeyCol 
ebc0: 3d 20 6a 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = j;.  }.  asser
ebd0: 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20 70  t( pPk!=0 );.  p
ebe0: 50 6b 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d  Pk->isCovering =
ebf0: 20 31 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   1;.  if( !db->i
ec00: 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c  nit.imposterTabl
ec10: 65 20 29 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74  e ) pPk->uniqNot
ec20: 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 6e 50 6b 20  Null = 1;.  nPk 
ec30: 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a  = pPk->nKeyCol;.
ec40: 0a 20 20 2f 2a 20 42 79 70 61 73 73 20 74 68 65  .  /* Bypass the
ec50: 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65   creation of the
ec60: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 62 74 72   PRIMARY KEY btr
ec70: 65 65 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  ee and the sqlit
ec80: 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61  e_master.  ** ta
ec90: 62 6c 65 20 65 6e 74 72 79 2e 20 54 68 69 73 20  ble entry. This 
eca0: 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64  is only required
ecb0: 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 67 65   if currently ge
ecc0: 6e 65 72 61 74 69 6e 67 20 56 44 42 45 0a 20 20  nerating VDBE.  
ecd0: 2a 2a 20 63 6f 64 65 20 66 6f 72 20 61 20 43 52  ** code for a CR
ece0: 45 41 54 45 20 54 41 42 4c 45 20 28 6e 6f 74 20  EATE TABLE (not 
ecf0: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 6f 6e 65  when parsing one
ed00: 20 61 73 20 70 61 72 74 20 6f 66 20 72 65 61 64   as part of read
ed10: 69 6e 67 0a 20 20 2a 2a 20 61 20 64 61 74 61 62  ing.  ** a datab
ed20: 61 73 65 20 73 63 68 65 6d 61 29 2e 20 20 2a 2f  ase schema).  */
ed30: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 6b 2d  .  if( v && pPk-
ed40: 3e 74 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 61  >tnum>0 ){.    a
ed50: 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e  ssert( db->init.
ed60: 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 73  busy==0 );.    s
ed70: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
ed80: 4f 70 63 6f 64 65 28 76 2c 20 70 50 6b 2d 3e 74  Opcode(v, pPk->t
ed90: 6e 75 6d 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  num, OP_Goto);. 
eda0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 6f 6f   }..  /* The roo
edb0: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 50 52  t page of the PR
edc0: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 74 68 65  IMARY KEY is the
edd0: 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65   table root page
ede0: 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d 20   */.  pPk->tnum 
edf0: 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20  = pTab->tnum;.. 
ee00: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 69   /* Update the i
ee10: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
ee20: 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 55  ntation of all U
ee30: 4e 49 51 55 45 20 69 6e 64 69 63 65 73 20 62 79  NIQUE indices by
ee40: 20 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20 2a 2a   converting.  **
ee50: 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64   the final rowid
ee60: 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65   column into one
ee70: 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73   or more columns
ee80: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
ee90: 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  KEY..  */.  for(
eea0: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
eeb0: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
eec0: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
eed0: 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 49  int n;.    if( I
eee0: 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
eef0: 28 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75  (pIdx) ) continu
ef00: 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30  e;.    for(i=n=0
ef10: 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20  ; i<nPk; i++){. 
ef20: 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c       if( !hasCol
ef30: 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75  umn(pIdx->aiColu
ef40: 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  mn, pIdx->nKeyCo
ef50: 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  l, pPk->aiColumn
ef60: 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20 20 20  [i]) ) n++;.    
ef70: 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29  }.    if( n==0 )
ef80: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
ef90: 69 6e 64 65 78 20 69 73 20 61 20 73 75 70 65 72  index is a super
efa0: 73 65 74 20 6f 66 20 74 68 65 20 70 72 69 6d 61  set of the prima
efb0: 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20  ry key */.      
efc0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20  pIdx->nColumn = 
efd0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20  pIdx->nKeyCol;. 
efe0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
eff0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73     }.    if( res
f000: 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64  izeIndexObject(d
f010: 62 2c 20 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e  b, pIdx, pIdx->n
f020: 4b 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65 74 75  KeyCol+n) ) retu
f030: 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  rn;.    for(i=0,
f040: 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   j=pIdx->nKeyCol
f050: 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20  ; i<nPk; i++){. 
f060: 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c       if( !hasCol
f070: 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75  umn(pIdx->aiColu
f080: 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  mn, pIdx->nKeyCo
f090: 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  l, pPk->aiColumn
f0a0: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
f0b0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
f0c0: 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ] = pPk->aiColum
f0d0: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70 49  n[i];.        pI
f0e0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20  dx->azColl[j] = 
f0f0: 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  pPk->azColl[i];.
f100: 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
f110: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
f120: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
f130: 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79  lumn>=pIdx->nKey
f140: 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61 73 73  Col+n );.    ass
f150: 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
f160: 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20  mn>=j );.  }..  
f170: 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65  /* Add all table
f180: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
f190: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
f1a0: 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 6b  x.  */.  if( nPk
f1b0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  <pTab->nCol ){. 
f1c0: 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64     if( resizeInd
f1d0: 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 50 6b  exObject(db, pPk
f1e0: 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 20  , pTab->nCol) ) 
f1f0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28  return;.    for(
f200: 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54  i=0, j=nPk; i<pT
f210: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
f220: 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f        if( !hasCo
f230: 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75  lumn(pPk->aiColu
f240: 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20 20 20  mn, j, i) ){.   
f250: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70       assert( j<p
f260: 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  Pk->nColumn );. 
f270: 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f         pPk->aiCo
f280: 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20  lumn[j] = i;.   
f290: 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c       pPk->azColl
f2a0: 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72  [j] = sqlite3Str
f2b0: 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 20 20  BINARY;.        
f2c0: 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j++;.      }.   
f2d0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
f2e0: 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29  Pk->nColumn==j )
f2f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
f300: 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20  ab->nCol==j );. 
f310: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 2d   }else{.    pPk-
f320: 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d  >nColumn = pTab-
f330: 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 63  >nCol;.  }.  rec
f340: 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74  omputeColumnsNot
f350: 49 6e 64 65 78 65 64 28 70 50 6b 29 3b 0a 7d 0a  Indexed(pPk);.}.
f360: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f370: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
f380: 45 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  E./*.** Return t
f390: 72 75 65 20 69 66 20 7a 4e 61 6d 65 20 69 73 20  rue if zName is 
f3a0: 61 20 73 68 61 64 6f 77 20 74 61 62 6c 65 20 6e  a shadow table n
f3b0: 61 6d 65 20 69 6e 20 74 68 65 20 63 75 72 72 65  ame in the curre
f3c0: 6e 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  nt database.** c
f3d0: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
f3e0: 20 7a 4e 61 6d 65 20 69 73 20 74 65 6d 70 6f 72   zName is tempor
f3f0: 61 72 69 6c 79 20 6d 6f 64 69 66 69 65 64 20 77  arily modified w
f400: 68 69 6c 65 20 74 68 69 73 20 72 6f 75 74 69 6e  hile this routin
f410: 65 20 69 73 20 72 75 6e 6e 69 6e 67 2c 20 62 75  e is running, bu
f420: 74 20 69 73 0a 2a 2a 20 72 65 73 74 6f 72 65 64  t is.** restored
f430: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
f440: 20 76 61 6c 75 65 20 70 72 69 6f 72 20 74 6f 20   value prior to 
f450: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
f460: 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
f470: 63 20 69 6e 74 20 69 73 53 68 61 64 6f 77 54 61  c int isShadowTa
f480: 62 6c 65 4e 61 6d 65 28 73 71 6c 69 74 65 33 20  bleName(sqlite3 
f490: 2a 64 62 2c 20 63 68 61 72 20 2a 7a 4e 61 6d 65  *db, char *zName
f4a0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 61 69 6c  ){.  char *zTail
f4b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f4c0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
f4d0: 20 74 68 65 20 6c 61 73 74 20 22 5f 22 20 69 6e   the last "_" in
f4e0: 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 54 61 62 6c   zName */.  Tabl
f4f0: 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
f500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
f510: 6c 65 20 74 68 61 74 20 7a 4e 61 6d 65 20 69 73  le that zName is
f520: 20 61 20 73 68 61 64 6f 77 20 6f 66 20 2a 2f 0a   a shadow of */.
f530: 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 3b 20    Module *pMod; 
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f550: 2f 2a 20 4d 6f 64 75 6c 65 20 66 6f 72 20 74 68  /* Module for th
f560: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
f570: 2a 2f 0a 0a 20 20 7a 54 61 69 6c 20 3d 20 73 74  */..  zTail = st
f580: 72 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27 5f 27  rrchr(zName, '_'
f590: 29 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 3d 3d  );.  if( zTail==
f5a0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
f5b0: 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 70 54  *zTail = 0;.  pT
f5c0: 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
f5d0: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
f5e0: 20 30 29 3b 0a 20 20 2a 7a 54 61 69 6c 20 3d 20   0);.  *zTail = 
f5f0: 27 5f 27 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  '_';.  if( pTab=
f600: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
f610: 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c 28   if( !IsVirtual(
f620: 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
f630: 3b 0a 20 20 70 4d 6f 64 20 3d 20 28 4d 6f 64 75  ;.  pMod = (Modu
f640: 6c 65 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46  le*)sqlite3HashF
f650: 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  ind(&db->aModule
f660: 2c 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65  , pTab->azModule
f670: 41 72 67 5b 30 5d 29 3b 0a 20 20 69 66 28 20 70  Arg[0]);.  if( p
f680: 4d 6f 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Mod==0 ) return 
f690: 30 3b 0a 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70  0;.  if( pMod->p
f6a0: 4d 6f 64 75 6c 65 2d 3e 69 56 65 72 73 69 6f 6e  Module->iVersion
f6b0: 3c 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  <3 ) return 0;. 
f6c0: 20 69 66 28 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75   if( pMod->pModu
f6d0: 6c 65 2d 3e 78 53 68 61 64 6f 77 4e 61 6d 65 3d  le->xShadowName=
f6e0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
f6f0: 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e 70 4d   return pMod->pM
f700: 6f 64 75 6c 65 2d 3e 78 53 68 61 64 6f 77 4e 61  odule->xShadowNa
f710: 6d 65 28 7a 54 61 69 6c 2b 31 29 3b 0a 7d 0a 23  me(zTail+1);.}.#
f720: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 69 73  else.# define is
f730: 53 68 61 64 6f 77 54 61 62 6c 65 4e 61 6d 65 28  ShadowTableName(
f740: 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 20 2f 2a  x,y) 0.#endif /*
f750: 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f   ifndef SQLITE_O
f760: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
f770: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
f780: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
f790: 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20  d to report the 
f7a0: 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74  final ")" that t
f7b0: 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43  erminates.** a C
f7c0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
f7d0: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
f7e0: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
f7f0: 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69   that other acti
f800: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65  on routines have
f810: 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a   been building.*
f820: 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
f830: 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  e internal hash 
f840: 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67  tables, assuming
f850: 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a   no errors have.
f860: 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a  ** occurred..**.
f870: 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20  ** An entry for 
f880: 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64  the table is mad
f890: 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  e in the master 
f8a0: 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75  table on disk, u
f8b0: 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73  nless.** this is
f8c0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
f8d0: 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62  le or db->init.b
f8e0: 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62  usy==1.  When db
f8f0: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a  ->init.busy==1.*
f900: 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  * it means we ar
f910: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e reading the sq
f920: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
f930: 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  e because we jus
f940: 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74  t.** connected t
f950: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
f960: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71  r because the sq
f970: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
f980: 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c  e has.** recentl
f990: 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68  y changed, so th
f9a0: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73  e entry for this
f9b0: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
f9c0: 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20  xists in.** the 
f9d0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
f9e0: 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ble.  We do not 
f9f0: 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69  want to create i
fa00: 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49  t again..**.** I
fa10: 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72  f the pSelect ar
fa20: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
fa30: 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
fa40: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
fa50: 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  * was called to 
fa60: 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67  create a table g
fa70: 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20  enerated from a 
fa80: 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c  .** "CREATE TABL
fa90: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20  E ... AS SELECT 
faa0: 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20  ..." statement. 
fab0: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
fac0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  s of.** the new 
fad0: 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68  table will match
fae0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
faf0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  of the SELECT..*
fb00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e  /.void sqlite3En
fb10: 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  dTable(.  Parse 
fb20: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
fb30: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
fb40: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
fb50: 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20  Cons,           
fb60: 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e  /* The ',' token
fb70: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
fb80: 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a  column defn. */.
fb90: 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20    Token *pEnd,  
fba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
fbb0: 20 27 29 27 20 62 65 66 6f 72 65 20 6f 70 74 69   ')' before opti
fbc0: 6f 6e 73 20 69 6e 20 74 68 65 20 43 52 45 41 54  ons in the CREAT
fbd0: 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75 38 20  E TABLE */.  u8 
fbe0: 74 61 62 4f 70 74 73 2c 20 20 20 20 20 20 20 20  tabOpts,        
fbf0: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 74 61       /* Extra ta
fc00: 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20 55 73 75  ble options. Usu
fc10: 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20 53 65 6c  ally 0. */.  Sel
fc20: 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20  ect *pSelect    
fc30: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66       /* Select f
fc40: 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e  rom a "CREATE ..
fc50: 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a  . AS SELECT" */.
fc60: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 20 20  ){.  Table *p;  
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fc80: 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
fc90: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
fca0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f   = pParse->db; /
fcb0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
fcc0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
fcd0: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
fce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
fcf0: 62 61 73 65 20 69 6e 20 77 68 69 63 68 20 74 68  base in which th
fd00: 65 20 74 61 62 6c 65 20 6c 69 76 65 73 20 2a 2f  e table lives */
fd10: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
fd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fd30: 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78  An implied index
fd40: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   of the table */
fd50: 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d 30 20  ..  if( pEnd==0 
fd60: 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  && pSelect==0 ){
fd70: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
fd80: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
fd90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
fda0: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
fdb0: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
fdc0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
fdd0: 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30 20   if( pSelect==0 
fde0: 26 26 20 69 73 53 68 61 64 6f 77 54 61 62 6c 65  && isShadowTable
fdf0: 4e 61 6d 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d  Name(db, p->zNam
fe00: 65 29 20 29 7b 0a 20 20 20 20 70 2d 3e 74 61 62  e) ){.    p->tab
fe10: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 53 68 61 64  Flags |= TF_Shad
fe20: 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ow;.  }..  /* If
fe30: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
fe40: 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73  sy is 1 it means
fe50: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
fe60: 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a  the SQL off the.
fe70: 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73    ** "sqlite_mas
fe80: 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f  ter" or "sqlite_
fe90: 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62  temp_master" tab
fea0: 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a  le on the disk..
feb0: 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77    ** So do not w
fec0: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
fed0: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
fee0: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
fef0: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
ff00: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
ff10: 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  e db->init.newTn
ff20: 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20  um field.  (The 
ff30: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
ff40: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
ff50: 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74  n put there by t
ff60: 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20  he sqliteOpenCb 
ff70: 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2a 0a 20  routine.).  **. 
ff80: 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20   ** If the root 
ff90: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 31  page number is 1
ffa0: 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 69  , that means thi
ffb0: 73 20 69 73 20 74 68 65 20 73 71 6c 69 74 65 5f  s is the sqlite_
ffc0: 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c  master.  ** tabl
ffd0: 65 20 69 74 73 65 6c 66 2e 20 20 53 6f 20 6d 61  e itself.  So ma
ffe0: 72 6b 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e  rk it read-only.
fff0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
10000 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
10010 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
10020 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
10030 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 22  orMsg(pParse, ""
10040 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
10050 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e  .    }.    p->tn
10060 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
10070 77 54 6e 75 6d 3b 0a 20 20 20 20 69 66 28 20 70  wTnum;.    if( p
10080 2d 3e 74 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e 74  ->tnum==1 ) p->t
10090 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 52 65  abFlags |= TF_Re
100a0 61 64 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20 61  adonly;.  }..  a
100b0 73 73 65 72 74 28 20 28 70 2d 3e 74 61 62 46 6c  ssert( (p->tabFl
100c0 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d  ags & TF_HasPrim
100d0 61 72 79 4b 65 79 29 3d 3d 30 0a 20 20 20 20 20  aryKey)==0.     
100e0 20 20 7c 7c 20 70 2d 3e 69 50 4b 65 79 3e 3d 30    || p->iPKey>=0
100f0 20 7c 7c 20 73 71 6c 69 74 65 33 50 72 69 6d 61   || sqlite3Prima
10100 72 79 4b 65 79 49 6e 64 65 78 28 70 29 21 3d 30  ryKeyIndex(p)!=0
10110 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
10120 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
10130 48 61 73 50 72 69 6d 61 72 79 4b 65 79 29 21 3d  HasPrimaryKey)!=
10140 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 2d 3e  0.       || (p->
10150 69 50 4b 65 79 3c 30 20 26 26 20 73 71 6c 69 74  iPKey<0 && sqlit
10160 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
10170 78 28 70 29 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  x(p)==0) );..  /
10180 2a 20 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73  * Special proces
10190 73 69 6e 67 20 66 6f 72 20 57 49 54 48 4f 55 54  sing for WITHOUT
101a0 20 52 4f 57 49 44 20 54 61 62 6c 65 73 20 2a 2f   ROWID Tables */
101b0 0a 20 20 69 66 28 20 74 61 62 4f 70 74 73 20 26  .  if( tabOpts &
101c0 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64   TF_WithoutRowid
101d0 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   ){.    if( (p->
101e0 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
101f0 74 6f 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a  toincrement) ){.
10200 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
10210 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
10220 20 20 20 20 20 20 20 20 22 41 55 54 4f 49 4e 43          "AUTOINC
10230 52 45 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77  REMENT not allow
10240 65 64 20 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f  ed on WITHOUT RO
10250 57 49 44 20 74 61 62 6c 65 73 22 29 3b 0a 20 20  WID tables");.  
10260 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
10270 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61  }.    if( (p->ta
10280 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50  bFlags & TF_HasP
10290 72 69 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b  rimaryKey)==0 ){
102a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
102b0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
102c0 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 69 73 73  PRIMARY KEY miss
102d0 69 6e 67 20 6f 6e 20 74 61 62 6c 65 20 25 73 22  ing on table %s"
102e0 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
102f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
10300 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
10310 57 69 74 68 6f 75 74 52 6f 77 69 64 20 7c 20 54  WithoutRowid | T
10320 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64  F_NoVisibleRowid
10330 3b 0a 20 20 20 20 20 20 63 6f 6e 76 65 72 74 54  ;.      convertT
10340 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62  oWithoutRowidTab
10350 6c 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  le(pParse, p);. 
10360 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62 20     }.  }..  iDb 
10370 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
10380 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53  oIndex(db, p->pS
10390 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
103a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
103b0 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  CK.  /* Resolve 
103c0 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45  names in all CHE
103d0 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78  CK constraint ex
103e0 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
103f0 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20    if( p->pCheck 
10400 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
10410 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e  solveSelfReferen
10420 63 65 28 70 50 61 72 73 65 2c 20 70 2c 20 4e 43  ce(pParse, p, NC
10430 5f 49 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e  _IsCheck, 0, p->
10440 70 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e  pCheck);.  }.#en
10450 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
10460 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
10470 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74 69  K) */..  /* Esti
10480 6d 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65  mate the average
10490 20 72 6f 77 20 73 69 7a 65 20 66 6f 72 20 74 68   row size for th
104a0 65 20 74 61 62 6c 65 20 61 6e 64 20 66 6f 72 20  e table and for 
104b0 61 6c 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64 69  all implied indi
104c0 63 65 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61 74  ces */.  estimat
104d0 65 54 61 62 6c 65 57 69 64 74 68 28 70 29 3b 0a  eTableWidth(p);.
104e0 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49    for(pIdx=p->pI
104f0 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
10500 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
10510 20 20 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78     estimateIndex
10520 57 69 64 74 68 28 70 49 64 78 29 3b 0a 20 20 7d  Width(pIdx);.  }
10530 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
10540 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e  itializing, then
10550 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   create a record
10560 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
10570 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53  le.  ** in the S
10580 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
10590 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
105a0 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  se..  **.  ** If
105b0 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f   this is a TEMPO
105c0 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74  RARY table, writ
105d0 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f  e the entry into
105e0 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20   the auxiliary. 
105f0 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64   ** file instead
10600 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   of into the mai
10610 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
10620 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
10630 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
10640 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62    int n;.    Vdb
10650 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
10660 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69  zType;    /* "vi
10670 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a  ew" or "table" *
10680 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  /.    char *zTyp
10690 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20  e2;   /* "VIEW" 
106a0 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20  or "TABLE" */.  
106b0 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20    char *zStmt;  
106c0 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
106d0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72   CREATE TABLE or
106e0 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
106f0 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76  tement */..    v
10700 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
10710 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
10720 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
10730 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71   return;..    sq
10740 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
10750 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b  v, OP_Close, 0);
10760 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a  ..    /* .    **
10770 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70   Initialize zTyp
10780 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69  e for the new vi
10790 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20  ew or table..   
107a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
107b0 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
107c0 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20     /* A regular 
107d0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a  table */.      z
107e0 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a  Type = "table";.
107f0 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
10800 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20  TABLE";.#ifndef 
10810 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
10820 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10830 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20    /* A view */. 
10840 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69       zType = "vi
10850 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  ew";.      zType
10860 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64  2 = "VIEW";.#end
10870 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
10880 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52   If this is a CR
10890 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53  EATE TABLE xx AS
108a0 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65   SELECT ..., exe
108b0 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a  cute the SELECT.
108c0 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
108d0 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
108e0 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20   new table. The 
108f0 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
10900 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20   for the.    ** 
10910 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20  new table is in 
10920 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d  register pParse-
10930 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a  >regRoot..    **
10940 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65  .    ** Once the
10950 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e   SELECT has been
10960 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65   coded by sqlite
10970 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73  3Select(), it is
10980 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69   in a.    ** sui
10990 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71  table state to q
109a0 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  uery for the col
109b0 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79  umn names and ty
109c0 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20  pes to be used. 
109d0 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77     ** by the new
109e0 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20   table..    **. 
109f0 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63     ** A shared-c
10a00 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ache write-lock 
10a10 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
10a20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
10a30 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a  new table,.    *
10a40 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f  * as a schema-lo
10a50 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ck must have alr
10a60 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e  eady been obtain
10a70 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e  ed to create it.
10a80 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20   Since.    ** a 
10a90 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c  schema-lock excl
10aa0 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64  udes all other d
10ab0 61 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74  atabase users, t
10ac0 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f  he write-lock wo
10ad0 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65  uld.    ** be re
10ae0 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a  dundant..    */.
10af0 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
10b00 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  ){.      SelectD
10b10 65 73 74 20 64 65 73 74 3b 20 20 20 20 2f 2a 20  est dest;    /* 
10b20 57 68 65 72 65 20 74 68 65 20 53 45 4c 45 43 54  Where the SELECT
10b30 20 73 68 6f 75 6c 64 20 73 74 6f 72 65 20 72 65   should store re
10b40 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  sults */.      i
10b50 6e 74 20 72 65 67 59 69 65 6c 64 3b 20 20 20 20  nt regYield;    
10b60 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
10b70 6f 6c 64 69 6e 67 20 63 6f 2d 72 6f 75 74 69 6e  olding co-routin
10b80 65 20 65 6e 74 72 79 2d 70 6f 69 6e 74 20 2a 2f  e entry-point */
10b90 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
10ba0 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  op;        /* To
10bb0 70 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74  p of the co-rout
10bc0 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ine */.      int
10bd0 20 72 65 67 52 65 63 3b 20 20 20 20 20 20 20 20   regRec;        
10be0 20 2f 2a 20 41 20 72 65 63 6f 72 64 20 74 6f 20   /* A record to 
10bf0 62 65 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74  be insert into t
10c00 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a  he new table */.
10c10 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77        int regRow
10c20 69 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  id;       /* Row
10c30 69 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20 72  id of the next r
10c40 6f 77 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a  ow to insert */.
10c50 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e        int addrIn
10c60 73 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 6f 70  sLoop;    /* Top
10c70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
10c80 20 69 6e 73 65 72 74 69 6e 67 20 72 6f 77 73 20   inserting rows 
10c90 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
10ca0 70 53 65 6c 54 61 62 3b 20 20 20 20 20 2f 2a 20  pSelTab;     /* 
10cb0 41 20 74 61 62 6c 65 20 74 68 61 74 20 64 65 73  A table that des
10cc0 63 72 69 62 65 73 20 74 68 65 20 53 45 4c 45 43  cribes the SELEC
10cd0 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20  T results */..  
10ce0 20 20 20 20 72 65 67 59 69 65 6c 64 20 3d 20 2b      regYield = +
10cf0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
10d00 20 20 20 20 20 72 65 67 52 65 63 20 3d 20 2b 2b       regRec = ++
10d10 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
10d20 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b      regRowid = +
10d30 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
10d40 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 72       assert(pPar
10d50 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20  se->nTab==1);.  
10d60 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
10d70 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ort(pParse);.   
10d80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10d90 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp3(v, OP_OpenW
10da0 72 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d  rite, 1, pParse-
10db0 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a  >regRoot, iDb);.
10dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10dd0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
10de0 4c 41 47 5f 50 32 49 53 52 45 47 29 3b 0a 20 20  LAG_P2ISREG);.  
10df0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
10e00 20 3d 20 32 3b 0a 20 20 20 20 20 20 61 64 64 72   = 2;.      addr
10e10 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
10e20 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
10e30 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  + 1;.      sqlit
10e40 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
10e50 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
10e60 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 61  , regYield, 0, a
10e70 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 69  ddrTop);.      i
10e80 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
10e90 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
10ea0 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
10eb0 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
10ec0 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
10ed0 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ct);.      if( p
10ee0 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75  SelTab==0 ) retu
10ef0 72 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rn;.      assert
10f00 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ( p->aCol==0 );.
10f10 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20        p->nCol = 
10f20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
10f30 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70       p->aCol = p
10f40 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
10f50 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
10f60 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65  l = 0;.      pSe
10f70 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
10f80 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
10f90 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65  eteTable(db, pSe
10fa0 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 73 71 6c  lTab);.      sql
10fb0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
10fc0 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f  it(&dest, SRT_Co
10fd0 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c  routine, regYiel
10fe0 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
10ff0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
11000 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b  pSelect, &dest);
11010 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
11020 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
11030 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11040 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
11050 76 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20  v, regYield);.  
11060 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
11070 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
11080 6f 70 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 61  op - 1);.      a
11090 64 64 72 49 6e 73 4c 6f 6f 70 20 3d 20 73 71 6c  ddrInsLoop = sql
110a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
110b0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 64 65 73 74  , OP_Yield, dest
110c0 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  .iSDParm);.     
110d0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
110e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
110f0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
11100 4d 61 6b 65 52 65 63 6f 72 64 2c 20 64 65 73 74  MakeRecord, dest
11110 2e 69 53 64 73 74 2c 20 64 65 73 74 2e 6e 53 64  .iSdst, dest.nSd
11120 73 74 2c 20 72 65 67 52 65 63 29 3b 0a 20 20 20  st, regRec);.   
11130 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 41     sqlite3TableA
11140 66 66 69 6e 69 74 79 28 76 2c 20 70 2c 20 30 29  ffinity(v, p, 0)
11150 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11160 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11170 4e 65 77 52 6f 77 69 64 2c 20 31 2c 20 72 65 67  NewRowid, 1, reg
11180 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
11190 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
111a0 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 31 2c  v, OP_Insert, 1,
111b0 20 72 65 67 52 65 63 2c 20 72 65 67 52 6f 77 69   regRec, regRowi
111c0 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
111d0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
111e0 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  rInsLoop);.     
111f0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
11200 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 73 4c  Here(v, addrInsL
11210 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oop);.      sqli
11220 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
11230 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a 20   OP_Close, 1);. 
11240 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d     }..    /* Com
11250 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74  pute the complet
11260 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
11270 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  EATE statement *
11280 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  /.    if( pSelec
11290 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74  t ){.      zStmt
112a0 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74   = createTableSt
112b0 6d 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d  mt(db, p);.    }
112c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 6f 6b 65  else{.      Toke
112d0 6e 20 2a 70 45 6e 64 32 20 3d 20 74 61 62 4f 70  n *pEnd2 = tabOp
112e0 74 73 20 3f 20 26 70 50 61 72 73 65 2d 3e 73 4c  ts ? &pParse->sL
112f0 61 73 74 54 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b  astToken : pEnd;
11300 0a 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29  .      n = (int)
11310 28 70 45 6e 64 32 2d 3e 7a 20 2d 20 70 50 61 72  (pEnd2->z - pPar
11320 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
11330 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e  );.      if( pEn
11340 64 32 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29 20  d2->z[0]!=';' ) 
11350 6e 20 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20  n += pEnd2->n;. 
11360 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c       zStmt = sql
11370 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
11380 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
11390 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79  TE %s %.*s", zTy
113a0 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e  pe2, n, pParse->
113b0 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20  sNameToken.z.   
113c0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
113d0 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74   /* A slot for t
113e0 68 65 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c  he record has al
113f0 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
11400 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20  ated in the .   
11410 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45   ** SQLITE_MASTE
11420 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73  R table.  We jus
11430 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65  t need to update
11440 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20   that slot with 
11450 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69  all.    ** the i
11460 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65  nformation we've
11470 20 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20   collected..    
11480 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
11490 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
114a0 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20  ,.      "UPDATE 
114b0 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20  %Q.%s ".        
114c0 20 22 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c   "SET type='%s',
114d0 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61   name=%Q, tbl_na
114e0 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d  me=%Q, rootpage=
114f0 23 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20  #%d, sql=%Q ".  
11500 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69       "WHERE rowi
11510 64 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62  d=#%d",.      db
11520 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
11530 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45  ame, MASTER_NAME
11540 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20  ,.      zType,. 
11550 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20       p->zName,. 
11560 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20       p->zName,. 
11570 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67       pParse->reg
11580 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d  Root,.      zStm
11590 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  t,.      pParse-
115a0 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29 3b  >regRowid.    );
115b0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
115c0 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20  ee(db, zStmt);. 
115d0 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
115e0 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
115f0 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
11600 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
11610 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43  CREMENT.    /* C
11620 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
11630 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  e need to create
11640 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65   an sqlite_seque
11650 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20  nce table for.  
11660 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61    ** keeping tra
11670 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d  ck of autoincrem
11680 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f  ent keys..    */
11690 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62  .    if( (p->tab
116a0 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
116b0 6e 63 72 65 6d 65 6e 74 29 21 3d 30 20 29 7b 0a  ncrement)!=0 ){.
116c0 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20        Db *pDb = 
116d0 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
116e0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
116f0 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
11700 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
11710 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  );.      if( pDb
11720 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54  ->pSchema->pSeqT
11730 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
11740 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
11750 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
11760 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
11770 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65  BLE %Q.sqlite_se
11780 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29  quence(name,seq)
11790 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  ",.          pDb
117a0 2d 3e 7a 44 62 53 4e 61 6d 65 0a 20 20 20 20 20  ->zDbSName.     
117b0 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
117c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
117d0 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79  /* Reparse every
117e0 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20  thing to update 
117f0 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74  our internal dat
11800 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a  a structures */.
11810 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11820 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28  ddParseSchemaOp(
11830 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20  v, iDb,.        
11840 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
11850 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d  f(db, "tbl_name=
11860 27 25 71 27 20 41 4e 44 20 74 79 70 65 21 3d 27  '%q' AND type!='
11870 74 72 69 67 67 65 72 27 22 2c 20 70 2d 3e 7a 4e  trigger'", p->zN
11880 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  ame));.  }...  /
11890 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20  * Add the table 
118a0 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  to the in-memory
118b0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
118c0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
118d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
118e0 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
118f0 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
11900 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
11910 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a  a = p->pSchema;.
11920 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
11930 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
11940 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
11950 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
11960 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
11970 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
11980 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a  , p->zName, p);.
11990 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a      if( pOld ){.
119a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
119b0 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c  =pOld );  /* Mal
119c0 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
119d0 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68  iled inside Hash
119e0 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20  Insert() */.    
119f0 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
11a00 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74  t(db);.      ret
11a10 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
11a20 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
11a30 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6d 44   = 0;.    db->mD
11a40 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47  bFlags |= DBFLAG
11a50 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 0a  _SchemaChange;..
11a60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11a70 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20  MIT_ALTERTABLE. 
11a80 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65     if( !p->pSele
11a90 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ct ){.      cons
11aa0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
11ab0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50  (const char *)pP
11ac0 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
11ad0 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e  .z;.      int nN
11ae0 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ame;.      asser
11af0 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70  t( !pSelect && p
11b00 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a  Cons && pEnd );.
11b10 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d        if( pCons-
11b20 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >z==0 ){.       
11b30 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20   pCons = pEnd;. 
11b40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61       }.      nNa
11b50 6d 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73  me = (int)((cons
11b60 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e  t char *)pCons->
11b70 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  z - zName);.    
11b80 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65    p->addColOffse
11b90 74 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33  t = 13 + sqlite3
11ba0 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d  Utf8CharLen(zNam
11bb0 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, nName);.    }
11bc0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23  .#endif.  }.}..#
11bd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11be0 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68  IT_VIEW./*.** Th
11bf0 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
11c00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f  his routine in o
11c10 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61  rder to create a
11c20 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69   new VIEW.*/.voi
11c30 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56  d sqlite3CreateV
11c40 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50  iew(.  Parse *pP
11c50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65  arse,     /* The
11c60 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
11c70 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65   */.  Token *pBe
11c80 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  gin,     /* The 
11c90 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
11ca0 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61  t begins the sta
11cb0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
11cc0 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
11cd0 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
11ce0 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
11cf0 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
11d00 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
11d10 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
11d20 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
11d30 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
11d40 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
11d50 70 43 4e 61 6d 65 73 2c 20 2f 2a 20 4f 70 74 69  pCNames, /* Opti
11d60 6f 6e 61 6c 20 6c 69 73 74 20 6f 66 20 76 69 65  onal list of vie
11d70 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  w column names *
11d80 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
11d90 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45  ect,   /* A SELE
11da0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
11db0 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
11dc0 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20  e new view */.  
11dd0 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20  int isTemp,     
11de0 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61     /* TRUE for a
11df0 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20   TEMPORARY view 
11e00 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20  */.  int noErr  
11e10 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72          /* Suppr
11e20 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ess error messag
11e30 65 73 20 69 66 20 56 49 45 57 20 61 6c 72 65 61  es if VIEW alrea
11e40 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a  dy exists */.){.
11e50 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
11e60 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t n;.  const cha
11e70 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45  r *z;.  Token sE
11e80 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46  nd;.  DbFixer sF
11e90 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61  ix;.  Token *pNa
11ea0 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 44  me = 0;.  int iD
11eb0 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
11ec0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
11ed0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56    if( pParse->nV
11ee0 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ar>0 ){.    sqli
11ef0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
11f00 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20  se, "parameters 
11f10 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  are not allowed 
11f20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20  in views");.    
11f30 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77  goto create_view
11f40 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c  _fail;.  }.  sql
11f50 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70  ite3StartTable(p
11f60 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
11f70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31  Name2, isTemp, 1
11f80 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70  , 0, noErr);.  p
11f90 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
11fa0 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
11fb0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
11fc0 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76   ) goto create_v
11fd0 69 65 77 5f 66 61 69 6c 3b 0a 20 20 73 71 6c 69  iew_fail;.  sqli
11fe0 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
11ff0 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
12000 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
12010 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
12020 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
12030 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20   p->pSchema);.  
12040 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
12050 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
12060 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65  b, "view", pName
12070 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
12080 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c  FixSelect(&sFix,
12090 20 70 53 65 6c 65 63 74 29 20 29 20 67 6f 74 6f   pSelect) ) goto
120a0 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69   create_view_fai
120b0 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20  l;..  /* Make a 
120c0 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69  copy of the enti
120d0 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  re SELECT statem
120e0 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
120f0 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20   the view..  ** 
12100 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20  This will force 
12110 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b  all the Expr.tok
12120 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62  en.z values to b
12130 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20  e dynamically.  
12140 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74  ** allocated rat
12150 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74  her than point t
12160 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  o the input stri
12170 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73  ng - which means
12180 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20   that.  ** they 
12190 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74  will persist aft
121a0 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  er the current s
121b0 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61  qlite3_exec() ca
121c0 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f  ll returns..  */
121d0 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45  .  if( IN_RENAME
121e0 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 70  _OBJECT ){.    p
121f0 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ->pSelect = pSel
12200 65 63 74 3b 0a 20 20 20 20 70 53 65 6c 65 63 74  ect;.    pSelect
12210 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
12220 20 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20     p->pSelect = 
12230 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
12240 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45 58  (db, pSelect, EX
12250 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
12260 20 7d 0a 20 20 70 2d 3e 70 43 68 65 63 6b 20 3d   }.  p->pCheck =
12270 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
12280 44 75 70 28 64 62 2c 20 70 43 4e 61 6d 65 73 2c  Dup(db, pCNames,
12290 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
122a0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
122b0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
122c0 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c  create_view_fail
122d0 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  ;..  /* Locate t
122e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
122f0 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d  EATE VIEW statem
12300 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20  ent.  Make sEnd 
12310 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68  point to.  ** th
12320 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45  e end..  */.  sE
12330 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61  nd = pParse->sLa
12340 73 74 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72  stToken;.  asser
12350 74 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20  t( sEnd.z[0]!=0 
12360 7c 7c 20 73 45 6e 64 2e 6e 3d 3d 30 20 29 3b 0a  || sEnd.n==0 );.
12370 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21    if( sEnd.z[0]!
12380 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64  =';' ){.    sEnd
12390 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20  .z += sEnd.n;.  
123a0 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a  }.  sEnd.n = 0;.
123b0 20 20 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e 64    n = (int)(sEnd
123c0 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b  .z - pBegin->z);
123d0 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29  .  assert( n>0 )
123e0 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e  ;.  z = pBegin->
123f0 7a 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  z;.  while( sqli
12400 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31  te3Isspace(z[n-1
12410 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73  ]) ){ n--; }.  s
12420 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b  End.z = &z[n-1];
12430 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a  .  sEnd.n = 1;..
12440 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33    /* Use sqlite3
12450 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64  EndTable() to ad
12460 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68  d the view to th
12470 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
12480 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
12490 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73  e3EndTable(pPars
124a0 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 2c 20  e, 0, &sEnd, 0, 
124b0 30 29 3b 0a 0a 63 72 65 61 74 65 5f 76 69 65 77  0);..create_view
124c0 5f 66 61 69 6c 3a 0a 20 20 73 71 6c 69 74 65 33  _fail:.  sqlite3
124d0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
124e0 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28   pSelect);.  if(
124f0 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
12500 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
12510 52 65 6e 61 6d 65 45 78 70 72 6c 69 73 74 55 6e  RenameExprlistUn
12520 6d 61 70 28 70 50 61 72 73 65 2c 20 70 43 4e 61  map(pParse, pCNa
12530 6d 65 73 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  mes);.  }.  sqli
12540 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
12550 65 28 64 62 2c 20 70 43 4e 61 6d 65 73 29 3b 0a  e(db, pCNames);.
12560 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
12570 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
12580 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21  T_VIEW */..#if !
12590 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
125a0 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
125b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
125c0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
125d0 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  /*.** The Table 
125e0 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65  structure pTable
125f0 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45   is really a VIE
12600 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  W.  Fill in the 
12610 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
12620 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76  columns of the v
12630 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c  iew in the pTabl
12640 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  e structure.  Re
12650 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a  turn the number.
12660 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  ** of errors.  I
12670 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
12680 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  en leave an erro
12690 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
126a0 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f  rse->zErrMsg..*/
126b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77  .int sqlite3View
126c0 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50  GetColumnNames(P
126d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
126e0 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
126f0 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20  Table *pSelTab; 
12700 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c    /* A fake tabl
12710 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20  e from which we 
12720 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 73  get the result s
12730 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  et */.  Select *
12740 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70  pSel;     /* Cop
12750 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
12760 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
12770 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  the view */.  in
12780 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20  t nErr = 0;     
12790 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
127a0 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ors encountered 
127b0 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
127c0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
127d0 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20  arily holds the 
127e0 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
127f0 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20  s assigned */.  
12800 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
12810 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61  arse->db;  /* Da
12820 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12830 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72  n for malloc err
12840 6f 72 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ors */.#ifndef S
12850 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
12860 41 4c 54 41 42 4c 45 0a 20 20 69 6e 74 20 72 63  ALTABLE.  int rc
12870 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ;.#endif.#ifndef
12880 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
12890 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 73 71 6c  HORIZATION.  sql
128a0 69 74 65 33 5f 78 61 75 74 68 20 78 41 75 74 68  ite3_xauth xAuth
128b0 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
128c0 20 78 41 75 74 68 20 70 6f 69 6e 74 65 72 20 2a   xAuth pointer *
128d0 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  /.#endif..  asse
128e0 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23  rt( pTable );..#
128f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12900 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
12910 20 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63    db->nSchemaLoc
12920 6b 2b 2b 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  k++;.  rc = sqli
12930 74 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65  te3VtabCallConne
12940 63 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  ct(pParse, pTabl
12950 65 29 3b 0a 20 20 64 62 2d 3e 6e 53 63 68 65 6d  e);.  db->nSchem
12960 61 4c 6f 63 6b 2d 2d 3b 0a 20 20 69 66 28 20 72  aLock--;.  if( r
12970 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
12980 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56  1;.  }.  if( IsV
12990 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29  irtual(pTable) )
129a0 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
129b0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
129c0 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a  E_OMIT_VIEW.  /*
129d0 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c   A positive nCol
129e0 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d   means the colum
129f0 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69  ns names for thi
12a00 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20  s view are.  ** 
12a10 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20  already known.. 
12a20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
12a30 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72  ->nCol>0 ) retur
12a40 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67  n 0;..  /* A neg
12a50 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20  ative nCol is a 
12a60 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d  special marker m
12a70 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61  eaning that we a
12a80 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a  re currently.  *
12a90 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70  * trying to comp
12aa0 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ute the column n
12ab0 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74  ames.  If we ent
12ac0 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
12ad0 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61  with.  ** a nega
12ae0 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65  tive nCol, it me
12af0 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ans two or more 
12b00 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f  views form a loo
12b10 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  p, like this:.  
12b20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  **.  **     CREA
12b30 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53  TE VIEW one AS S
12b40 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f  ELECT * FROM two
12b50 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
12b60 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45  E VIEW two AS SE
12b70 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b  LECT * FROM one;
12b80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
12b90 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61  lly, the error a
12ba0 62 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67  bove is now caug
12bb0 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63  ht prior to reac
12bc0 68 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e  hing this point.
12bd0 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f  .  ** But the fo
12be0 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20  llowing test is 
12bf0 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20  still important 
12c00 61 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20  as it does come 
12c10 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66  up.  ** in the f
12c20 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a  ollowing:.  ** .
12c30 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
12c40 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61  TABLE main.ex1(a
12c50 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  );.  **     CREA
12c60 54 45 20 54 45 4d 50 20 56 49 45 57 20 65 78 31  TE TEMP VIEW ex1
12c70 20 41 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f   AS SELECT a FRO
12c80 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20  M ex1;.  **     
12c90 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65  SELECT * FROM te
12ca0 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69  mp.ex1;.  */.  i
12cb0 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c  f( pTable->nCol<
12cc0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
12cd0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
12ce0 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72   "view %s is cir
12cf0 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22  cularly defined"
12d00 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
12d10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
12d20 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54    }.  assert( pT
12d30 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b  able->nCol>=0 );
12d40 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
12d50 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
12d60 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63  ans we need to c
12d70 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65  ompute the table
12d80 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74   names..  ** Not
12d90 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20  e that the call 
12da0 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  to sqlite3Result
12db0 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69  SetOfSelect() wi
12dc0 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20  ll expand any.  
12dd0 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20  ** "*" elements 
12de0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73  in the results s
12df0 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61  et of the view a
12e00 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63  nd will assign c
12e10 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74  ursors.  ** to t
12e20 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  he elements of t
12e30 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
12e40 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77   But we do not w
12e50 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65  ant these change
12e60 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72  s.  ** to be per
12e70 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20  manent.  So the 
12e80 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64  computation is d
12e90 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66  one on a copy of
12ea0 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a   the SELECT.  **
12eb0 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
12ec0 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
12ed0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
12ee0 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
12ef0 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c   );.  pSel = sql
12f00 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
12f10 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
12f20 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65  t, 0);.  if( pSe
12f30 6c 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  l ){.#ifndef SQL
12f40 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41  ITE_OMIT_ALTERTA
12f50 42 4c 45 0a 20 20 20 20 75 38 20 65 50 61 72 73  BLE.    u8 ePars
12f60 65 4d 6f 64 65 20 3d 20 70 50 61 72 73 65 2d 3e  eMode = pParse->
12f70 65 50 61 72 73 65 4d 6f 64 65 3b 0a 20 20 20 20  eParseMode;.    
12f80 70 50 61 72 73 65 2d 3e 65 50 61 72 73 65 4d 6f  pParse->eParseMo
12f90 64 65 20 3d 20 50 41 52 53 45 5f 4d 4f 44 45 5f  de = PARSE_MODE_
12fa0 4e 4f 52 4d 41 4c 3b 0a 23 65 6e 64 69 66 0a 20  NORMAL;.#endif. 
12fb0 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e     n = pParse->n
12fc0 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Tab;.    sqlite3
12fd0 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
12fe0 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53 65  sors(pParse, pSe
12ff0 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54  l->pSrc);.    pT
13000 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b  able->nCol = -1;
13010 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
13020 64 65 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 23  de.bDisable++;.#
13030 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13040 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
13050 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d  .    xAuth = db-
13060 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e  >xAuth;.    db->
13070 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70  xAuth = 0;.    p
13080 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
13090 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
130a0 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b  t(pParse, pSel);
130b0 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d  .    db->xAuth =
130c0 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20   xAuth;.#else.  
130d0 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
130e0 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
130f0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
13100 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  l);.#endif.    p
13110 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b  Parse->nTab = n;
13120 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d  .    if( pTable-
13130 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20  >pCheck ){.     
13140 20 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57 20   /* CREATE VIEW 
13150 6e 61 6d 65 28 61 72 67 6c 69 73 74 29 20 41 53  name(arglist) AS
13160 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68   ....      ** Th
13170 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63  e names of the c
13180 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
13190 62 6c 65 20 61 72 65 20 74 61 6b 65 6e 20 66 72  ble are taken fr
131a0 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 6c  om.      ** argl
131b0 69 73 74 20 77 68 69 63 68 20 69 73 20 73 74 6f  ist which is sto
131c0 72 65 64 20 69 6e 20 70 54 61 62 6c 65 2d 3e 70  red in pTable->p
131d0 43 68 65 63 6b 2e 20 20 54 68 65 20 70 43 68 65  Check.  The pChe
131e0 63 6b 20 66 69 65 6c 64 0a 20 20 20 20 20 20 2a  ck field.      *
131f0 2a 20 6e 6f 72 6d 61 6c 6c 79 20 68 6f 6c 64 73  * normally holds
13200 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
13210 74 73 20 6f 6e 20 61 6e 20 6f 72 64 69 6e 61 72  ts on an ordinar
13220 79 20 74 61 62 6c 65 2c 20 62 75 74 20 66 6f 72  y table, but for
13230 0a 20 20 20 20 20 20 2a 2a 20 61 20 56 49 45 57  .      ** a VIEW
13240 20 69 74 20 68 6f 6c 64 73 20 74 68 65 20 6c 69   it holds the li
13250 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  st of column nam
13260 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  es..      */.   
13270 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
13280 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
13290 61 72 73 65 2c 20 70 54 61 62 6c 65 2d 3e 70 43  arse, pTable->pC
132a0 68 65 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 20  heck, .         
132b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132c0 20 20 20 20 20 20 20 20 26 70 54 61 62 6c 65 2d          &pTable-
132d0 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 6c 65 2d 3e  >nCol, &pTable->
132e0 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  aCol);.      if(
132f0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
13300 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  d==0 .       && 
13310 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 0a  pParse->nErr==0.
13320 20 20 20 20 20 20 20 26 26 20 70 54 61 62 6c 65         && pTable
13330 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 2d 3e 70 45  ->nCol==pSel->pE
13340 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20  List->nExpr.    
13350 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
13360 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c  ite3SelectAddCol
13370 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
13380 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
13390 6c 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20  le, pSel);.     
133a0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
133b0 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20   pSelTab ){.    
133c0 20 20 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57    /* CREATE VIEW
133d0 20 6e 61 6d 65 20 41 53 2e 2e 2e 20 20 77 69 74   name AS...  wit
133e0 68 6f 75 74 20 61 6e 20 61 72 67 75 6d 65 6e 74  hout an argument
133f0 20 6c 69 73 74 2e 20 20 43 6f 6e 73 74 72 75 63   list.  Construc
13400 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  t.      ** the c
13410 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
13420 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
13430 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e  ement that defin
13440 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 20  es the view..   
13450 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
13460 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  rt( pTable->aCol
13470 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61  ==0 );.      pTa
13480 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c  ble->nCol = pSel
13490 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
134a0 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
134b0 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
134c0 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
134d0 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  ol = 0;.      pS
134e0 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
134f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
13500 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
13510 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 54 61  xHeld(db, 0, pTa
13520 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b  ble->pSchema) );
13530 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13540 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
13550 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b   0;.      nErr++
13560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
13570 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
13580 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20  b, pSelTab);.   
13590 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
135a0 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a  lete(db, pSel);.
135b0 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
135c0 65 2e 62 44 69 73 61 62 6c 65 2d 2d 3b 0a 23 69  e.bDisable--;.#i
135d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
135e0 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20  T_ALTERTABLE.   
135f0 20 70 50 61 72 73 65 2d 3e 65 50 61 72 73 65 4d   pParse->eParseM
13600 6f 64 65 20 3d 20 65 50 61 72 73 65 4d 6f 64 65  ode = eParseMode
13610 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 20 65 6c 73  ;.#endif.  } els
13620 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  e {.    nErr++;.
13630 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53    }.  pTable->pS
13640 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61  chema->schemaFla
13650 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74  gs |= DB_Unreset
13660 56 69 65 77 73 3b 0a 20 20 69 66 28 20 64 62 2d  Views;.  if( db-
13670 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
13680 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
13690 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62  teColumnNames(db
136a0 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  , pTable);.    p
136b0 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b  Table->aCol = 0;
136c0 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  .    pTable->nCo
136d0 6c 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  l = 0;.  }.#endi
136e0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
136f0 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72  _VIEW */.  retur
13700 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64  n nErr;  .}.#end
13710 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
13720 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
13730 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
13740 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
13750 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64  TABLE) */..#ifnd
13760 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
13770 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  IEW./*.** Clear 
13780 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
13790 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57   from every VIEW
137a0 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78   in database idx
137b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
137c0 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
137d0 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  All(sqlite3 *db,
137e0 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73   int idx){.  Has
137f0 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65  hElem *i;.  asse
13800 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
13810 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
13820 64 78 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20  dx, 0) );.  if( 
13830 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64  !DbHasProperty(d
13840 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73  b, idx, DB_Unres
13850 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72  etViews) ) retur
13860 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  n;.  for(i=sqlit
13870 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
13880 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61  aDb[idx].pSchema
13890 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d  ->tblHash); i;i=
138a0 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
138b0 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
138c0 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
138d0 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28  Data(i);.    if(
138e0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
138f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
13900 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
13910 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
13920 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30    pTab->aCol = 0
13930 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43  ;.      pTab->nC
13940 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ol = 0;.    }.  
13950 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65  }.  DbClearPrope
13960 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
13970 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d  UnresetViews);.}
13980 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
13990 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
139a0 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f  ll(A,B).#endif /
139b0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
139c0 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  EW */../*.** Thi
139d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
139e0 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45  lled by the VDBE
139f0 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69   to adjust the i
13a00 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
13a10 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65  * used by SQLite
13a20 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20   when the btree 
13a30 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61  layer moves a ta
13a40 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54  ble root page. T
13a50 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20  he.** root-page 
13a60 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
13a70 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20  dex in database 
13a80 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20  iDb has changed 
13a90 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f  from iFrom.** to
13aa0 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b   iTo..**.** Tick
13ab0 65 74 20 23 31 37 32 38 3a 20 20 54 68 65 20 73  et #1728:  The s
13ac0 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68  ymbol table migh
13ad0 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  t still contain 
13ae0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f  information.** o
13af0 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20  n tables and/or 
13b00 69 6e 64 69 63 65 73 20 74 68 61 74 20 61 72 65  indices that are
13b10 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20   the process of 
13b20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a  being deleted..*
13b30 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c  * If you are unl
13b40 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f  ucky, one of tho
13b50 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  se deleted indic
13b60 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67  es or tables mig
13b70 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73  ht.** have the s
13b80 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d  ame rootpage num
13b90 62 65 72 20 61 73 20 74 68 65 20 72 65 61 6c 20  ber as the real 
13ba0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
13bb0 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20  hat is.** being 
13bc0 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61  moved.  So we ca
13bd0 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68  nnot stop search
13be0 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 66 69  ing after the fi
13bf0 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65  rst match .** be
13c00 63 61 75 73 65 20 74 68 65 20 66 69 72 73 74 20  cause the first 
13c10 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65 20 66  match might be f
13c20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65  or one of the de
13c30 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a  leted indices.**
13c40 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e   or tables and n
13c50 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64  ot the table/ind
13c60 65 78 20 74 68 61 74 20 69 73 20 61 63 74 75 61  ex that is actua
13c70 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e  lly being moved.
13c80 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74  .** We must cont
13c90 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74  inue looping unt
13ca0 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e  il all tables an
13cb0 64 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a  d indices with.*
13cc0 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f  * rootpage==iFro
13cd0 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76  m have been conv
13ce0 65 72 74 65 64 20 74 6f 20 68 61 76 65 20 61 20  erted to have a 
13cf0 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a  rootpage of iTo.
13d00 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ** in order to b
13d10 65 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 77  e certain that w
13d20 65 20 67 6f 74 20 74 68 65 20 72 69 67 68 74 20  e got the right 
13d30 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  one..*/.#ifndef 
13d40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
13d50 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69  VACUUM.void sqli
13d60 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64  te3RootPageMoved
13d70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
13d80 74 20 69 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d  t iDb, int iFrom
13d90 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61  , int iTo){.  Ha
13da0 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20  shElem *pElem;. 
13db0 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20   Hash *pHash;.  
13dc0 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65  Db *pDb;..  asse
13dd0 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
13de0 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
13df0 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 44 62 20  Db, 0) );.  pDb 
13e00 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
13e10 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d  .  pHash = &pDb-
13e20 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
13e30 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  h;.  for(pElem=s
13e40 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
13e50 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
13e60 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
13e70 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
13e80 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
13e90 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
13ea0 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  em);.    if( pTa
13eb0 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  b->tnum==iFrom )
13ec0 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e  {.      pTab->tn
13ed0 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a  um = iTo;.    }.
13ee0 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70    }.  pHash = &p
13ef0 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db->pSchema->idx
13f00 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65  Hash;.  for(pEle
13f10 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
13f20 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  t(pHash); pElem;
13f30 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
13f40 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
13f50 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
13f60 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
13f70 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  pElem);.    if( 
13f80 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f  pIdx->tnum==iFro
13f90 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  m ){.      pIdx-
13fa0 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20  >tnum = iTo;.   
13fb0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
13fc0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64  ./*.** Write cod
13fd0 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74  e to erase the t
13fe0 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
13ff0 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20  age iTable from 
14000 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a  database iDb..**
14010 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65   Also write code
14020 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73   to modify the s
14030 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
14040 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  le and internal 
14050 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72  schema.** if a r
14060 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74  oot-page of anot
14070 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
14080 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d  ed by the btree-
14090 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20  layer whilst.** 
140a0 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28  erasing iTable (
140b0 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
140c0 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63  with an auto-vac
140d0 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  uum database)..*
140e0 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  / .static void d
140f0 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50  estroyRootPage(P
14100 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
14110 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44  t iTable, int iD
14120 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
14130 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
14140 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31  Parse);.  int r1
14150 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
14160 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
14170 69 66 28 20 69 54 61 62 6c 65 3c 32 20 29 20 73  if( iTable<2 ) s
14180 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14190 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74 20  Parse, "corrupt 
141a0 73 63 68 65 6d 61 22 29 3b 0a 20 20 73 71 6c 69  schema");.  sqli
141b0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
141c0 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61   OP_Destroy, iTa
141d0 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20  ble, r1, iDb);. 
141e0 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
141f0 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
14200 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
14210 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50  TOVACUUM.  /* OP
14220 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20  _Destroy stores 
14230 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31  an in integer r1
14240 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65  . If this intege
14250 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  r.  ** is non-ze
14260 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
14270 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
14280 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d  ber of a table m
14290 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63  oved to.  ** loc
142a0 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68  ation iTable. Th
142b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
142c0 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71   modifies the sq
142d0 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
142e0 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63  e to.  ** reflec
142f0 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a  t this..  **.  *
14300 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20  * The "#NNN" in 
14310 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65  the SQL is a spe
14320 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68  cial constant th
14330 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65  at means whateve
14340 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20  r value.  ** is 
14350 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e  in register NNN.
14360 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75    See grammar ru
14370 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  les associated w
14380 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53  ith the TK_REGIS
14390 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66  TER.  ** token f
143a0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
143b0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  formation..  */.
143c0 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
143d0 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
143e0 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
143f0 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64   SET rootpage=%d
14400 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72   WHERE #%d AND r
14410 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20  ootpage=#%d",.  
14420 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61     pParse->db->a
14430 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
14440 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 69  , MASTER_NAME, i
14450 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a  Table, r1, r1);.
14460 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
14470 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
14480 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f  Parse, r1);.}../
14490 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20  *.** Write VDBE 
144a0 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61  code to erase ta
144b0 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c  ble pTab and all
144c0 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69   associated indi
144d0 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20  ces on disk..** 
144e0 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74  Code to update t
144f0 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
14500 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65   tables and inte
14510 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69  rnal schema defi
14520 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61  nitions.** in ca
14530 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62  se a root-page b
14540 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74  elonging to anot
14550 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
14560 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20  ed by the btree 
14570 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f  layer.** is also
14580 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e   added (this can
14590 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
145a0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
145b0 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  base)..*/.static
145c0 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62   void destroyTab
145d0 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
145e0 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  , Table *pTab){.
145f0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
14600 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f  base may be auto
14610 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20  -vacuum capable 
14620 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  (if SQLITE_OMIT_
14630 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20  AUTOVACUUM.  ** 
14640 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c  is not defined),
14650 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f   then it is impo
14660 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50  rtant to call OP
14670 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a  _Destroy on the.
14680 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69    ** table and i
14690 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20  ndex root-pages 
146a0 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69  in order, starti
146b0 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65  ng with the nume
146c0 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61  rically .  ** la
146d0 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
146e0 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61  number. This gua
146f0 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e  rantees that non
14700 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61  e of the root-pa
14710 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64  ges.  ** to be d
14720 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f  estroyed is relo
14730 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c  cated by an earl
14740 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20  ier OP_Destroy. 
14750 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a  i.e. if the.  **
14760 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20   following were 
14770 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  coded:.  **.  **
14780 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a   OP_Destroy 4 0.
14790 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50    ** ....  ** OP
147a0 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a  _Destroy 5 0.  *
147b0 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20  *.  ** and root 
147c0 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20  page 5 happened 
147d0 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73  to be the larges
147e0 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
147f0 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64  er in the.  ** d
14800 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f  atabase, then ro
14810 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20  ot page 5 would 
14820 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65  be moved to page
14830 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20   4 by the .  ** 
14840 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22  "OP_Destroy 4 0"
14850 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62   opcode. The sub
14860 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74  sequent "OP_Dest
14870 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68  roy 5 0" would h
14880 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c  it.  ** a free-l
14890 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  ist page..  */. 
148a0 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62   int iTab = pTab
148b0 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44  ->tnum;.  int iD
148c0 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20  estroyed = 0;.. 
148d0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
148e0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
148f0 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d    int iLargest =
14900 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65   0;..    if( iDe
14910 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54  stroyed==0 || iT
14920 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b  ab<iDestroyed ){
14930 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20  .      iLargest 
14940 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20  = iTab;.    }.  
14950 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
14960 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
14970 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
14980 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78  {.      int iIdx
14990 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20   = pIdx->tnum;. 
149a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
149b0 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
149c0 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
149d0 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79     if( (iDestroy
149e0 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69  ed==0 || (iIdx<i
149f0 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69  Destroyed)) && i
14a00 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a  Idx>iLargest ){.
14a10 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74          iLargest
14a20 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d   = iIdx;.      }
14a30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
14a40 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20  Largest==0 ){.  
14a50 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
14a60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
14a70 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
14a80 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
14a90 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
14aa0 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 61 73  chema);.      as
14ab0 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
14ac0 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e  iDb<pParse->db->
14ad0 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 64 65 73  nDb );.      des
14ae0 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
14af0 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69  rse, iLargest, i
14b00 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74  Db);.      iDest
14b10 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74  royed = iLargest
14b20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
14b30 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74 72  *.** Remove entr
14b40 69 65 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  ies from the sql
14b50 69 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73  ite_statN tables
14b60 20 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32 2c   (for N in (1,2,
14b70 33 29 29 0a 2a 2a 20 61 66 74 65 72 20 61 20 44  3)).** after a D
14b80 52 4f 50 20 49 4e 44 45 58 20 6f 72 20 44 52 4f  ROP INDEX or DRO
14b90 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e  P TABLE command.
14ba0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14bb0 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74  sqlite3ClearStat
14bc0 54 61 62 6c 65 73 28 0a 20 20 50 61 72 73 65 20  Tables(.  Parse 
14bd0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
14be0 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
14bf0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
14c00 20 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 20   iDb,           
14c10 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
14c20 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
14c30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
14c40 65 2c 20 20 20 20 20 2f 2a 20 22 69 64 78 22 20  e,     /* "idx" 
14c50 6f 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63 6f  or "tbl" */.  co
14c60 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
14c70 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
14c80 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 2a  index or table *
14c90 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
14ca0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
14cb0 61 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ame = pParse->db
14cc0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
14cd0 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  ame;.  for(i=1; 
14ce0 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<=4; i++){.    
14cf0 63 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a 20  char zTab[24];. 
14d00 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
14d10 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 62 29  ntf(sizeof(zTab)
14d20 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f 73 74  ,zTab,"sqlite_st
14d30 61 74 25 64 22 2c 69 29 3b 0a 20 20 20 20 69 66  at%d",i);.    if
14d40 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
14d50 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  le(pParse->db, z
14d60 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29 7b  Tab, zDbName) ){
14d70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65  .      sqlite3Ne
14d80 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
14d90 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54  ,.        "DELET
14da0 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
14db0 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20 20  RE %s=%Q",.     
14dc0 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62     zDbName, zTab
14dd0 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20  , zType, zName. 
14de0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
14df0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
14e00 61 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f 70  ate code to drop
14e10 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69   a table..*/.voi
14e20 64 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f  d sqlite3CodeDro
14e30 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
14e40 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
14e50 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  b, int iDb, int 
14e60 69 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65 20  isView){.  Vdbe 
14e70 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
14e80 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
14e90 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
14ea0 67 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20 3d  ger;.  Db *pDb =
14eb0 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
14ec0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
14ed0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
14ee0 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
14ef0 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  .  sqlite3BeginW
14f00 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
14f10 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a  arse, 1, iDb);..
14f20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14f30 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
14f40 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
14f50 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  (pTab) ){.    sq
14f60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
14f70 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20  v, OP_VBegin);. 
14f80 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
14f90 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72  Drop all trigger
14fa0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
14fb0 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  h the table bein
14fc0 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a  g dropped. Code.
14fd0 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65    ** is generate
14fe0 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72  d to remove entr
14ff0 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  ies from sqlite_
15000 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20  master and/or.  
15010 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  ** sqlite_temp_m
15020 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65  aster if require
15030 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67 67  d..  */.  pTrigg
15040 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67  er = sqlite3Trig
15050 67 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  gerList(pParse, 
15060 70 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28 20  pTab);.  while( 
15070 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
15080 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
15090 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
150a0 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20  >pSchema || .   
150b0 20 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70       pTrigger->p
150c0 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b  Schema==db->aDb[
150d0 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  1].pSchema );.  
150e0 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69    sqlite3DropTri
150f0 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20  ggerPtr(pParse, 
15100 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 70  pTrigger);.    p
15110 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67  Trigger = pTrigg
15120 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a  er->pNext;.  }..
15130 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15140 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
15150 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e  T.  /* Remove an
15160 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65  y entries of the
15170 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
15180 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   table associate
15190 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
151a0 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
151b0 70 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  ped. This is don
151c0 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62  e before the tab
151d0 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20  le is dropped.  
151e0 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20  ** at the btree 
151f0 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74  level, in case t
15200 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
15210 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74  ce table needs t
15220 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61  o.  ** move as a
15230 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64   result of the d
15240 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20  rop (can happen 
15250 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
15260 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ode)..  */.  if(
15270 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
15280 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
15290 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nt ){.    sqlite
152a0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
152b0 72 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c 45  rse,.      "DELE
152c0 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  TE FROM %Q.sqlit
152d0 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45  e_sequence WHERE
152e0 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20   name=%Q",.     
152f0 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20   pDb->zDbSName, 
15300 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pTab->zName.    
15310 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
15320 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c   /* Drop all SQL
15330 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
15340 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69   and index entri
15350 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  es that refer to
15360 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e   the.  ** table.
15370 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d   The program nam
15380 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  e loops through 
15390 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
153a0 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 2a   and deletes.  *
153b0 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74  * every row that
153c0 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
153d0 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  le of the same n
153e0 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62  ame as the one b
153f0 65 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65  eing.  ** droppe
15400 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20  d. Triggers are 
15410 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65  handled separate
15420 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69  ly because a tri
15430 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a  gger can be.  **
15440 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
15450 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68  temp database th
15460 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  at refers to a t
15470 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a  able in another.
15480 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
15490 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73   */.  sqlite3Nes
154a0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
154b0 20 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20   .      "DELETE 
154c0 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
154d0 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64   tbl_name=%Q and
154e0 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27   type!='trigger'
154f0 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44  ",.      pDb->zD
15500 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e  bSName, MASTER_N
15510 41 4d 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  AME, pTab->zName
15520 29 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65 77  );.  if( !isView
15530 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70   && !IsVirtual(p
15540 54 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73 74  Tab) ){.    dest
15550 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c  royTable(pParse,
15560 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f   pTab);.  }..  /
15570 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62  * Remove the tab
15580 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51  le entry from SQ
15590 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20  Lite's internal 
155a0 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66  schema and modif
155b0 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d  y.  ** the schem
155c0 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20  a cookie..  */. 
155d0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
155e0 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Tab) ){.    sqli
155f0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
15600 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44   OP_VDestroy, iD
15610 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  b, 0, 0, pTab->z
15620 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
15630 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
15640 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  arse);.  }.  sql
15650 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
15660 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20  , OP_DropTable, 
15670 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  iDb, 0, 0, pTab-
15680 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71  >zName, 0);.  sq
15690 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
156a0 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
156b0 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65    sqliteViewRese
156c0 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d  tAll(db, iDb);.}
156d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
156e0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
156f0 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
15700 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74   a DROP TABLE st
15710 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d  atement..** pNam
15720 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
15730 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
15740 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69   dropped..*/.voi
15750 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62  d sqlite3DropTab
15760 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
15770 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
15780 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e  , int isView, in
15790 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c  t noErr){.  Tabl
157a0 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20  e *pTab;.  Vdbe 
157b0 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
157c0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
157d0 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66    int iDb;..  if
157e0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
157f0 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
15800 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
15810 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
15820 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
15830 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
15840 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69  ->nSrc==1 );.  i
15850 66 28 20 73 71 6c 69 74 65 33 52 65 61 64 53 63  f( sqlite3ReadSc
15860 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67  hema(pParse) ) g
15870 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
15880 62 6c 65 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72  ble;.  if( noErr
15890 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45   ) db->suppressE
158a0 72 72 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20  rr++;.  assert( 
158b0 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56  isView==0 || isV
158c0 69 65 77 3d 3d 4c 4f 43 41 54 45 5f 56 49 45 57  iew==LOCATE_VIEW
158d0 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   );.  pTab = sql
158e0 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
158f0 74 65 6d 28 70 50 61 72 73 65 2c 20 69 73 56 69  tem(pParse, isVi
15900 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ew, &pName->a[0]
15910 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29  );.  if( noErr )
15920 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72   db->suppressErr
15930 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  --;..  if( pTab=
15940 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f  =0 ){.    if( no
15950 45 72 72 20 29 20 73 71 6c 69 74 65 33 43 6f 64  Err ) sqlite3Cod
15960 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
15970 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  ma(pParse, pName
15980 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
15990 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
159a0 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
159b0 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
159c0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
159d0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
159e0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
159f0 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
15a00 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54  b );..  /* If pT
15a10 61 62 20 69 73 20 61 20 76 69 72 74 75 61 6c 20  ab is a virtual 
15a20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77  table, call View
15a30 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29  GetColumnNames()
15a40 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20   to ensure.  ** 
15a50 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  it is initialize
15a60 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73  d..  */.  if( Is
15a70 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26  Virtual(pTab) &&
15a80 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
15a90 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
15aa0 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20  e, pTab) ){.    
15ab0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
15ac0 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  able;.  }.#ifnde
15ad0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
15ae0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
15af0 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
15b00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
15b10 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
15b20 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73  E(iDb);.    cons
15b30 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
15b40 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
15b50 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
15b60 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a  har *zArg2 = 0;.
15b70 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
15b80 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
15b90 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
15ba0 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a  zTab, 0, zDb)){.
15bb0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
15bc0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
15bd0 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
15be0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f   ){.      if( !O
15bf0 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
15c00 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
15c10 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
15c20 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  OP_TEMP_VIEW;.  
15c30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15c40 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
15c50 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20  _DROP_VIEW;.    
15c60 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
15c70 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
15c80 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69  ABLE.    }else i
15c90 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
15ca0 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65  b) ){.      code
15cb0 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
15cc0 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72  TABLE;.      zAr
15cd0 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  g2 = sqlite3GetV
15ce0 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 2d  Table(db, pTab)-
15cf0 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65  >pMod->zName;.#e
15d00 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
15d10 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
15d20 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
15d30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
15d40 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
15d50 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
15d60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15d70 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
15d80 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  OP_TABLE;.      
15d90 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
15da0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
15db0 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
15dc0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67  Tab->zName, zArg
15dd0 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  2, zDb) ){.     
15de0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
15df0 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
15e00 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
15e10 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
15e20 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61  LITE_DELETE, pTa
15e30 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  b->zName, 0, zDb
15e40 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
15e50 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
15e60 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
15e70 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  f.  if( sqlite3S
15e80 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e  trNICmp(pTab->zN
15e90 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
15ea0 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 20 73 71  7)==0 .    && sq
15eb0 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54  lite3StrNICmp(pT
15ec0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ab->zName, "sqli
15ed0 74 65 5f 73 74 61 74 22 2c 20 31 31 29 21 3d 30  te_stat", 11)!=0
15ee0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
15ef0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15f00 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f  "table %s may no
15f10 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70  t be dropped", p
15f20 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
15f30 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
15f40 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e  table;.  }..#ifn
15f50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15f60 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65  VIEW.  /* Ensure
15f70 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e   DROP TABLE is n
15f80 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65  ot used on a vie
15f90 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57  w, and DROP VIEW
15fa0 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a   is not used.  *
15fb0 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20  * on a table..  
15fc0 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77 20  */.  if( isView 
15fd0 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
15fe0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
15ff0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
16000 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42  e, "use DROP TAB
16010 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62  LE to delete tab
16020 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  le %s", pTab->zN
16030 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
16040 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
16050 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65    }.  if( !isVie
16060 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
16070 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
16080 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
16090 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57  , "use DROP VIEW
160a0 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20   to delete view 
160b0 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
160c0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
160d0 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
160e0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
160f0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
16100 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
16110 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
16120 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69  table.  ** on di
16130 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  sk..  */.  v = s
16140 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
16150 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
16160 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
16170 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
16180 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
16190 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65  ;.    if( !isVie
161a0 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  w ){.      sqlit
161b0 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65  e3ClearStatTable
161c0 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  s(pParse, iDb, "
161d0 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  tbl", pTab->zNam
161e0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
161f0 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50 61  3FkDropTable(pPa
16200 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62  rse, pName, pTab
16210 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
16220 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c  ite3CodeDropTabl
16230 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
16240 69 44 62 2c 20 69 73 56 69 65 77 29 3b 0a 20 20  iDb, isView);.  
16250 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  }..exit_drop_tab
16260 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  le:.  sqlite3Src
16270 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
16280 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
16290 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
162a0 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
162b0 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b   a new foreign k
162c0 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a  ey on the table.
162d0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  ** currently und
162e0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
162f0 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72    pFromCol deter
16300 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75  mines which colu
16310 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75  mns.** in the cu
16320 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e  rrent table poin
16330 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e  t to the foreign
16340 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43   key.  If pFromC
16350 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f  ol==0 then.** co
16360 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f  nnect the key to
16370 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
16380 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20   inserted.  pTo 
16390 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a  is the name of.*
163a0 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65  * the table refe
163b0 72 72 65 64 20 74 6f 20 28 61 2e 6b 2e 61 20 74  rred to (a.k.a t
163c0 68 65 20 22 70 61 72 65 6e 74 22 20 74 61 62 6c  he "parent" tabl
163d0 65 29 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61  e).  pToCol is a
163e0 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 74 61 62 6c   list.** of tabl
163f0 65 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  es in the parent
16400 20 70 54 6f 20 74 61 62 6c 65 2e 20 20 66 6c 61   pTo table.  fla
16410 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  gs contains all.
16420 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** information a
16430 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63  bout the conflic
16440 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
16450 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65  orithms specifie
16460 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44  d.** in the ON D
16470 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45  ELETE, ON UPDATE
16480 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63   and ON INSERT c
16490 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  lauses..**.** An
164a0 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20   FKey structure 
164b0 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61  is created and a
164c0 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
164d0 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75  e currently.** u
164e0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
164f0 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d  n in the pParse-
16500 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64  >pNewTable field
16510 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65  ..**.** The fore
16520 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66  ign key is set f
16530 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f  or IMMEDIATE pro
16540 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73  cessing.  A subs
16550 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74  equent call.** t
16560 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f  o sqlite3DeferFo
16570 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74  reignKey() might
16580 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20   change this to 
16590 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69  DEFERRED..*/.voi
165a0 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  d sqlite3CreateF
165b0 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72  oreignKey(.  Par
165c0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
165d0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
165e0 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
165f0 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f  st *pFromCol,  /
16600 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69  * Columns in thi
16610 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69  s table that poi
16620 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c  nt to other tabl
16630 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  e */.  Token *pT
16640 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  o,          /* N
16650 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72  ame of the other
16660 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
16670 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20  List *pToCol,   
16680 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
16690 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
166a0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
166b0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
166c0 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
166d0 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29  algorithms. */.)
166e0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
166f0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69  = pParse->db;.#i
16700 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16710 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
16720 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b  FKey *pFKey = 0;
16730 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f  .  FKey *pNextTo
16740 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70  ;.  Table *p = p
16750 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
16760 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
16770 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43   int i;.  int nC
16780 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a  ol;.  char *z;..
16790 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30    assert( pTo!=0
167a0 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c   );.  if( p==0 |
167b0 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41  | IN_DECLARE_VTA
167c0 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  B ) goto fk_end;
167d0 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
167e0 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  =0 ){.    int iC
167f0 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  ol = p->nCol-1;.
16800 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 69 43      if( NEVER(iC
16810 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f  ol<0) ) goto fk_
16820 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f  end;.    if( pTo
16830 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
16840 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
16850 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16860 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67  (pParse, "foreig
16870 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20  n key on %s".   
16880 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72        " should r
16890 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e  eference only on
168a0 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  e column of tabl
168b0 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20  e %T",.         
168c0 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  p->aCol[iCol].zN
168d0 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20  ame, pTo);.     
168e0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
168f0 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31    }.    nCol = 1
16900 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  ;.  }else if( pT
16910 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
16920 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d  nExpr!=pFromCol-
16930 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  >nExpr ){.    sq
16940 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
16950 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e  arse,.        "n
16960 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
16970 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
16980 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
16990 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20  he number of ". 
169a0 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20         "columns 
169b0 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  in the reference
169c0 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67  d table");.    g
169d0 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65  oto fk_end;.  }e
169e0 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
169f0 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b  pFromCol->nExpr;
16a00 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73  .  }.  nByte = s
16a10 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20  izeof(*pFKey) + 
16a20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28  (nCol-1)*sizeof(
16a30 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20  pFKey->aCol[0]) 
16a40 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20  + pTo->n + 1;.  
16a50 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
16a60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f    for(i=0; i<pTo
16a70 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  Col->nExpr; i++)
16a80 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
16a90 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
16aa0 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
16ab0 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a  ame) + 1;.    }.
16ac0 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71    }.  pFKey = sq
16ad0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
16ae0 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20  o(db, nByte );. 
16af0 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b   if( pFKey==0 ){
16b00 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
16b10 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70  ;.  }.  pFKey->p
16b20 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65  From = p;.  pFKe
16b30 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70  y->pNextFrom = p
16b40 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28  ->pFKey;.  z = (
16b50 63 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43  char*)&pFKey->aC
16b60 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65  ol[nCol];.  pFKe
16b70 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 69 66  y->zTo = z;.  if
16b80 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
16b90 43 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  CT ){.    sqlite
16ba0 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28  3RenameTokenMap(
16bb0 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a  pParse, (void*)z
16bc0 2c 20 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 6d 65  , pTo);.  }.  me
16bd0 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20  mcpy(z, pTo->z, 
16be0 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f  pTo->n);.  z[pTo
16bf0 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ->n] = 0;.  sqli
16c00 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20  te3Dequote(z);. 
16c10 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a   z += pTo->n+1;.
16c20 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20    pFKey->nCol = 
16c30 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f  nCol;.  if( pFro
16c40 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70  mCol==0 ){.    p
16c50 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46  FKey->aCol[0].iF
16c60 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  rom = p->nCol-1;
16c70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
16c80 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
16c90 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
16ca0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
16cb0 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29   j<p->nCol; j++)
16cc0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
16cd0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e  lite3StrICmp(p->
16ce0 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70  aCol[j].zName, p
16cf0 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
16d00 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
16d10 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
16d20 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20  [i].iFrom = j;. 
16d30 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
16d40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16d50 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70  }.      if( j>=p
16d60 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
16d70 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16d80 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
16d90 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f       "unknown co
16da0 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66  lumn \"%s\" in f
16db0 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
16dc0 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20  ition", .       
16dd0 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69     pFromCol->a[i
16de0 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
16df0 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
16e00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16e10 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
16e20 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  T ){.        sql
16e30 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52  ite3RenameTokenR
16e40 65 6d 61 70 28 70 50 61 72 73 65 2c 20 26 70 46  emap(pParse, &pF
16e50 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2c 20 70 46  Key->aCol[i], pF
16e60 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
16e70 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
16e80 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f   }.  }.  if( pTo
16e90 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
16ea0 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
16eb0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
16ec0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
16ed0 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
16ee0 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79  me);.      pFKey
16ef0 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d  ->aCol[i].zCol =
16f00 20 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 49 4e   z;.      if( IN
16f10 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
16f20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
16f30 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61  3RenameTokenRema
16f40 70 28 70 50 61 72 73 65 2c 20 7a 2c 20 70 54 6f  p(pParse, z, pTo
16f50 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
16f60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16f70 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c  memcpy(z, pToCol
16f80 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29  ->a[i].zName, n)
16f90 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30  ;.      z[n] = 0
16fa0 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31  ;.      z += n+1
16fb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
16fc0 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
16fd0 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41  = 0;.  pFKey->aA
16fe0 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28  ction[0] = (u8)(
16ff0 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20 20  flags & 0xff);  
17000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20            /* ON 
17010 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f  DELETE action */
17020 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f  .  pFKey->aActio
17030 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61  n[1] = (u8)((fla
17040 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66  gs >> 8 ) & 0xff
17050 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41  );    /* ON UPDA
17060 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  TE action */..  
17070 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
17080 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
17090 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61  b, 0, p->pSchema
170a0 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d  ) );.  pNextTo =
170b0 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33   (FKey *)sqlite3
170c0 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70  HashInsert(&p->p
170d0 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68  Schema->fkeyHash
170e0 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  , .      pFKey->
170f0 7a 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b  zTo, (void *)pFK
17100 65 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e  ey.  );.  if( pN
17110 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a  extTo==pFKey ){.
17120 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
17130 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 67 6f 74  ult(db);.    got
17140 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  o fk_end;.  }.  
17150 69 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20  if( pNextTo ){. 
17160 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 78 74     assert( pNext
17170 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29  To->pPrevTo==0 )
17180 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65  ;.    pFKey->pNe
17190 78 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a  xtTo = pNextTo;.
171a0 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72      pNextTo->pPr
171b0 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20  evTo = pFKey;.  
171c0 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  }..  /* Link the
171d0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20   foreign key to 
171e0 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65  the table as the
171f0 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f   last step..  */
17200 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46  .  p->pFKey = pF
17210 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30  Key;.  pFKey = 0
17220 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c  ;..fk_end:.  sql
17230 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
17240 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  FKey);.#endif /*
17250 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
17260 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
17270 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  Y) */.  sqlite3E
17280 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
17290 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73  , pFromCol);.  s
172a0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
172b0 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29  lete(db, pToCol)
172c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
172d0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
172e0 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41  d when an INITIA
172f0 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72  LLY IMMEDIATE or
17300 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
17310 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73  RED.** clause is
17320 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66   seen as part of
17330 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64   a foreign key d
17340 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20  efinition.  The 
17350 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61  isDeferred.** pa
17360 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72  rameter is 1 for
17370 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
17380 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e  RED and 0 for IN
17390 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
173a0 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69  E..** The behavi
173b0 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  or of the most r
173c0 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
173d0 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61  foreign key is a
173e0 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72  djusted.** accor
173f0 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  dingly..*/.void 
17400 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
17410 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50  ignKey(Parse *pP
17420 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65  arse, int isDefe
17430 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53  rred){.#ifndef S
17440 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
17450 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a  GN_KEY.  Table *
17460 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46  pTab;.  FKey *pF
17470 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62  Key;.  if( (pTab
17480 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
17490 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b  able)==0 || (pFK
174a0 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79  ey = pTab->pFKey
174b0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
174c0 20 61 73 73 65 72 74 28 20 69 73 44 65 66 65 72   assert( isDefer
174d0 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65  red==0 || isDefe
174e0 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56  rred==1 ); /* EV
174f0 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20  : R-30323-21917 
17500 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65  */.  pFKey->isDe
17510 66 65 72 72 65 64 20 3d 20 28 75 38 29 69 73 44  ferred = (u8)isD
17520 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a  eferred;.#endif.
17530 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
17540 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
17550 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c   erase and refil
17560 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20  l index *pIdx.  
17570 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20  This is.** used 
17580 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  to initialize a 
17590 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e  newly created in
175a0 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70  dex or to recomp
175b0 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ute the.** conte
175c0 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69  nt of an index i
175d0 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20  n response to a 
175e0 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e  REINDEX command.
175f0 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f  .**.** if memRoo
17600 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67  tPage is not neg
17610 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20  ative, it means 
17620 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69  that the index i
17630 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74  s newly.** creat
17640 65 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65  ed.  The registe
17650 72 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d  r specified by m
17660 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61  emRootPage conta
17670 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20  ins the.** root 
17680 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
17690 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65  he index.  If me
176a0 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67  mRootPage is neg
176b0 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  ative, then.** t
176c0 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  he index already
176d0 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74   exists and must
176e0 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f   be cleared befo
176f0 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65  re being refille
17700 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f  d and.** the roo
17710 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
17720 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61   the index is ta
17730 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d  ken from pIndex-
17740 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  >tnum..*/.static
17750 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66   void sqlite3Ref
17760 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a  illIndex(Parse *
17770 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
17780 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f  Index, int memRo
17790 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65  otPage){.  Table
177a0 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
177b0 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65  >pTable;  /* The
177c0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69   table that is i
177d0 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
177e0 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iTab = pParse->n
177f0 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74  Tab++;     /* Bt
17800 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  ree cursor used 
17810 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e  for pTab */.  in
17820 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d  t iIdx = pParse-
17830 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20  >nTab++;     /* 
17840 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65  Btree cursor use
17850 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a  d for pIndex */.
17860 20 20 69 6e 74 20 69 53 6f 72 74 65 72 3b 20 20    int iSorter;  
17870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17880 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 65   /* Cursor opene
17890 64 20 62 79 20 4f 70 65 6e 53 6f 72 74 65 72 20  d by OpenSorter 
178a0 28 69 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20  (if in use) */. 
178b0 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
178c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178d0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f  /* Address of to
178e0 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  p of loop */.  i
178f0 6e 74 20 61 64 64 72 32 3b 20 20 20 20 20 20 20  nt addr2;       
17900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17910 20 41 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70   Address to jump
17920 20 74 6f 20 66 6f 72 20 6e 65 78 74 20 69 74 65   to for next ite
17930 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
17940 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  tnum;           
17950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
17960 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78  ot page of index
17970 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 74 49   */.  int iPartI
17980 64 78 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20  dxLabel;        
17990 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20       /* Jump to 
179a0 74 68 69 73 20 6c 61 62 65 6c 20 74 6f 20 73 6b  this label to sk
179b0 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20 56 64  ip a row */.  Vd
179c0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
179e0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
179f0 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  to this virtual 
17a00 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79  machine */.  Key
17a10 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20  Info *pKey;     
17a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
17a30 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78  eyInfo for index
17a40 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
17a50 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ord;            
17a60 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
17a70 20 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c   holding assembl
17a80 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  ed index record 
17a90 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
17aa0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
17ab0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
17ac0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
17ad0 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71  /.  int iDb = sq
17ae0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
17af0 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70  ex(db, pIndex->p
17b00 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65  Schema);..#ifnde
17b10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
17b20 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66  THORIZATION.  if
17b30 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
17b40 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
17b50 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65  E_REINDEX, pInde
17b60 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20  x->zName, 0,.   
17b70 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
17b80 7a 44 62 53 4e 61 6d 65 20 29 20 29 7b 0a 20 20  zDbSName ) ){.  
17b90 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
17ba0 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69  ndif..  /* Requi
17bb0 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  re a write-lock 
17bc0 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  on the table to 
17bd0 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70 65  perform this ope
17be0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  ration */.  sqli
17bf0 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
17c00 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
17c10 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a  tnum, 1, pTab->z
17c20 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71  Name);..  v = sq
17c30 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
17c40 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
17c50 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
17c60 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20   memRootPage>=0 
17c70 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65  ){.    tnum = me
17c80 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c  mRootPage;.  }el
17c90 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70  se{.    tnum = p
17ca0 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d  Index->tnum;.  }
17cb0 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  .  pKey = sqlite
17cc0 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
17cd0 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b  pParse, pIndex);
17ce0 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 21  .  assert( pKey!
17cf0 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
17d00 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
17d10 2d 3e 6e 45 72 72 20 29 3b 0a 0a 20 20 2f 2a 20  ->nErr );..  /* 
17d20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20  Open the sorter 
17d30 63 75 72 73 6f 72 20 69 66 20 77 65 20 61 72 65  cursor if we are
17d40 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a   to use one. */.
17d50 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72    iSorter = pPar
17d60 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71  se->nTab++;.  sq
17d70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
17d80 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  v, OP_SorterOpen
17d90 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70 49  , iSorter, 0, pI
17da0 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28  ndex->nKeyCol, (
17db0 63 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20 20  char*).         
17dc0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17dd0 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
17de0 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  y), P4_KEYINFO);
17df0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
17e00 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f  table. Loop thro
17e10 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20  ugh all rows of 
17e20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65 72  the table, inser
17e30 74 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20  ting index.  ** 
17e40 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65  records into the
17e50 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71   sorter. */.  sq
17e60 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
17e70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62  Parse, iTab, iDb
17e80 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
17e90 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  ead);.  addr1 = 
17ea0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17eb0 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
17ec0 69 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43 6f  iTab, 0); VdbeCo
17ed0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65 67  verage(v);.  reg
17ee0 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
17ef0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
17f00 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 75 6c  e);.  sqlite3Mul
17f10 74 69 57 72 69 74 65 28 70 50 61 72 73 65 29 3b  tiWrite(pParse);
17f20 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72  ..  sqlite3Gener
17f30 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72  ateIndexKey(pPar
17f40 73 65 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c 72  se,pIndex,iTab,r
17f50 65 67 52 65 63 6f 72 64 2c 30 2c 26 69 50 61 72  egRecord,0,&iPar
17f60 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a  tIdxLabel,0,0);.
17f70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17f80 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
17f90 49 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72 2c  Insert, iSorter,
17fa0 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
17fb0 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72  qlite3ResolvePar
17fc0 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65  tIdxLabel(pParse
17fd0 2c 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 29  , iPartIdxLabel)
17fe0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
17ff0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
18000 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29  , iTab, addr1+1)
18010 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
18020 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
18030 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
18040 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f  1);.  if( memRoo
18050 74 50 61 67 65 3c 30 20 29 20 73 71 6c 69 74 65  tPage<0 ) sqlite
18060 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18070 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69  P_Clear, tnum, i
18080 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Db);.  sqlite3Vd
18090 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
180a0 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20  penWrite, iIdx, 
180b0 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20  tnum, iDb, .    
180c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180d0 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34  (char *)pKey, P4
180e0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c  _KEYINFO);.  sql
180f0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
18100 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43  (v, OPFLAG_BULKC
18110 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67 65  SR|((memRootPage
18120 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49 53  >=0)?OPFLAG_P2IS
18130 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64 72  REG:0));..  addr
18140 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
18150 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
18160 65 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c  erSort, iSorter,
18170 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   0); VdbeCoverag
18180 65 28 76 29 3b 0a 20 20 69 66 28 20 49 73 55 6e  e(v);.  if( IsUn
18190 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78  iqueIndex(pIndex
181a0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20  ) ){.    int j2 
181b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74  = sqlite3VdbeGot
181c0 6f 28 76 2c 20 31 29 3b 0a 20 20 20 20 61 64 64  o(v, 1);.    add
181d0 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
181e0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
181f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56      sqlite3VdbeV
18200 65 72 69 66 79 41 62 6f 72 74 61 62 6c 65 28 76  erifyAbortable(v
18210 2c 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20 20  , OE_Abort);.   
18220 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18230 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 6f 72 74  p4Int(v, OP_Sort
18240 65 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74  erCompare, iSort
18250 65 72 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f 72  er, j2, regRecor
18260 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
18270 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64              pInd
18280 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64  ex->nKeyCol); Vd
18290 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
182a0 20 20 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65     sqlite3Unique
182b0 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
182c0 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 70 49 6e  e, OE_Abort, pIn
182d0 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dex);.    sqlite
182e0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
182f0 20 6a 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   j2);.  }else{. 
18300 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
18310 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
18320 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  r(v);.  }.  sqli
18330 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
18340 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20   OP_SorterData, 
18350 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f  iSorter, regReco
18360 72 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c  rd, iIdx);.  sql
18370 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
18380 2c 20 4f 50 5f 53 65 65 6b 45 6e 64 2c 20 69 49  , OP_SeekEnd, iI
18390 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dx);.  sqlite3Vd
183a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
183b0 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20  dxInsert, iIdx, 
183c0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
183d0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
183e0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
183f0 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71  EEKRESULT);.  sq
18400 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
18410 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
18420 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
18430 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18440 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 53  P_SorterNext, iS
18450 6f 72 74 65 72 2c 20 61 64 64 72 32 29 3b 20 56  orter, addr2); V
18460 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
18470 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
18480 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
18490 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ..  sqlite3VdbeA
184a0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
184b0 65 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69  e, iTab);.  sqli
184c0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
184d0 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29   OP_Close, iIdx)
184e0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
184f0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
18500 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a  e, iSorter);.}..
18510 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68  /*.** Allocate h
18520 65 61 70 20 73 70 61 63 65 20 74 6f 20 68 6f 6c  eap space to hol
18530 64 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63  d an Index objec
18540 74 20 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75  t with nCol colu
18550 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65  mns..**.** Incre
18560 61 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  ase the allocati
18570 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72 6f 76 69  on size to provi
18580 64 65 20 61 6e 20 65 78 74 72 61 20 6e 45 78 74  de an extra nExt
18590 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38  ra bytes.** of 8
185a0 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 73 70  -byte aligned sp
185b0 61 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e  ace after the In
185c0 64 65 78 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  dex object and r
185d0 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74  eturn a.** point
185e0 65 72 20 74 6f 20 74 68 69 73 20 65 78 74 72 61  er to this extra
185f0 20 73 70 61 63 65 20 69 6e 20 2a 70 70 45 78 74   space in *ppExt
18600 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71  ra..*/.Index *sq
18610 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64  lite3AllocateInd
18620 65 78 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c 69  exObject(.  sqli
18630 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
18640 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
18650 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36  nection */.  i16
18660 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   nCol,          
18670 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
18680 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
18690 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  the index */.  i
186a0 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
186b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
186c0 20 62 79 74 65 73 20 6f 66 20 65 78 74 72 61 20   bytes of extra 
186d0 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a  space to alloc *
186e0 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 45 78 74  /.  char **ppExt
186f0 72 61 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ra       /* Poin
18700 74 65 72 20 74 6f 20 74 68 65 20 22 65 78 74 72  ter to the "extr
18710 61 22 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20  a" space */.){. 
18720 20 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20   Index *p;      
18730 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
18740 65 64 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ed index object 
18750 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
18760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
18770 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
18780 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2b 20 61  Index object + a
18790 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74  rrays */..  nByt
187a0 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e = ROUND8(sizeo
187b0 66 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20  f(Index)) +     
187c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
187d0 78 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a  x structure  */.
187e0 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38            ROUND8
187f0 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e  (sizeof(char*)*n
18800 43 6f 6c 29 20 2b 20 20 20 20 20 20 20 20 20 2f  Col) +         /
18810 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20  * Index.azColl  
18820 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
18830 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4c 6f  ROUND8(sizeof(Lo
18840 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b  gEst)*(nCol+1) +
18850 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
18860 52 6f 77 4c 6f 67 45 73 74 20 20 20 2a 2f 0a 20  RowLogEst   */. 
18870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18880 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c  sizeof(i16)*nCol
18890 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   +            /*
188a0 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20   Index.aiColumn 
188b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
188c0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29        sizeof(u8)
188d0 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20 20 20  *nCol);         
188e0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f      /* Index.aSo
188f0 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d  rtOrder */.  p =
18900 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
18910 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b  Zero(db, nByte +
18920 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20   nExtra);.  if( 
18930 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70  p ){.    char *p
18940 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29  Extra = ((char*)
18950 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)+ROUND8(sizeof
18960 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70 2d  (Index));.    p-
18970 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74  >azColl = (const
18980 20 63 68 61 72 2a 2a 29 70 45 78 74 72 61 3b 20   char**)pExtra; 
18990 70 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38  pExtra += ROUND8
189a0 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e  (sizeof(char*)*n
189b0 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52  Col);.    p->aiR
189c0 6f 77 4c 6f 67 45 73 74 20 3d 20 28 4c 6f 67 45  owLogEst = (LogE
189d0 73 74 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74  st*)pExtra; pExt
189e0 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67  ra += sizeof(Log
189f0 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20  Est)*(nCol+1);. 
18a00 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d     p->aiColumn =
18a10 20 28 69 31 36 2a 29 70 45 78 74 72 61 3b 20 20   (i16*)pExtra;  
18a20 20 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20 73       pExtra += s
18a30 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b  izeof(i16)*nCol;
18a40 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64  .    p->aSortOrd
18a50 65 72 20 3d 20 28 75 38 2a 29 70 45 78 74 72 61  er = (u8*)pExtra
18a60 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e  ;.    p->nColumn
18a70 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e   = nCol;.    p->
18a80 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d  nKeyCol = nCol -
18a90 20 31 3b 0a 20 20 20 20 2a 70 70 45 78 74 72 61   1;.    *ppExtra
18aa0 20 3d 20 28 28 63 68 61 72 2a 29 70 29 20 2b 20   = ((char*)p) + 
18ab0 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74  nByte;.  }.  ret
18ac0 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
18ad0 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64  Create a new ind
18ae0 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61  ex for an SQL ta
18af0 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61  ble.  pName1.pNa
18b00 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20  me2 is the name 
18b10 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a  of the index .**
18b20 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73   and pTblList is
18b30 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
18b40 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
18b50 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42  o be indexed.  B
18b60 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20  oth will .** be 
18b70 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61  NULL for a prima
18b80 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64  ry key or an ind
18b90 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74  ex that is creat
18ba0 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a  ed to satisfy a.
18bb0 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ** UNIQUE constr
18bc0 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65  aint.  If pTable
18bd0 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20   and pIndex are 
18be0 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65  NULL, use pParse
18bf0 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61  ->pNewTable.** a
18c00 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  s the table to b
18c10 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72  e indexed.  pPar
18c20 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73  se->pNewTable is
18c30 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73   a table that is
18c40 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65  .** currently be
18c50 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
18c60 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  by a CREATE TABL
18c70 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
18c80 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  ** pList is a li
18c90 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
18ca0 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c   be indexed.  pL
18cb0 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ist will be NULL
18cc0 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61   if this.** is a
18cd0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
18ce0 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e  unique-constrain
18cf0 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
18d00 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  cent column adde
18d10 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c  d.** to the tabl
18d20 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
18d30 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
18d40 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
18d50 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20  3CreateIndex(.  
18d60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
18d70 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d     /* All inform
18d80 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73  ation about this
18d90 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65   parse */.  Toke
18da0 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
18db0 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20  * First part of 
18dc0 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20  index name. May 
18dd0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b  be NULL */.  Tok
18de0 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
18df0 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f  /* Second part o
18e00 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
18e10 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53  y be NULL */.  S
18e20 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65  rcList *pTblName
18e30 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e  , /* Table to in
18e40 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d  dex. Use pParse-
18e50 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20  >pNewTable if 0 
18e60 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
18e70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73  List,   /* A lis
18e80 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
18e90 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
18ea0 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
18eb0 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20     /* OE_Abort, 
18ec0 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65  OE_Ignore, OE_Re
18ed0 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e  place, or OE_Non
18ee0 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53  e */.  Token *pS
18ef0 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  tart,     /* The
18f00 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
18f10 61 74 20 62 65 67 69 6e 73 20 74 68 69 73 20 73  at begins this s
18f20 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  tatement */.  Ex
18f30 70 72 20 2a 70 50 49 57 68 65 72 65 2c 20 20 20  pr *pPIWhere,   
18f40 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
18f50 20 66 6f 72 20 70 61 72 74 69 61 6c 20 69 6e 64   for partial ind
18f60 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  ices */.  int so
18f70 72 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20  rtOrder,     /* 
18f80 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72  Sort order of pr
18f90 69 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70  imary key when p
18fa0 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20  List==NULL */.  
18fb0 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 2c 20  int ifNotExist, 
18fc0 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72     /* Omit error
18fd0 20 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64   if index alread
18fe0 79 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 75 38  y exists */.  u8
18ff0 20 69 64 78 54 79 70 65 20 20 20 20 20 20 20 20   idxType        
19000 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 79   /* The index ty
19010 70 65 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  pe */.){.  Table
19020 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
19030 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69  /* Table to be i
19040 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ndexed */.  Inde
19050 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20  x *pIndex = 0;  
19060 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
19070 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20   be created */. 
19080 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
19090 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
190a0 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
190b0 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
190c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
190d0 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
190e0 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69  zName */.  int i
190f0 2c 20 6a 3b 0a 20 20 44 62 46 69 78 65 72 20 73  , j;.  DbFixer s
19100 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  Fix;        /* F
19110 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74  or assigning dat
19120 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70  abase names to p
19130 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73  Table */.  int s
19140 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20  ortOrderMask;   
19150 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45  /* 1 to honor DE
19160 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20  SC in index.  0 
19170 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20  to ignore. */.  
19180 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
19190 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a  arse->db;.  Db *
191a0 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
191b0 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63   /* The specific
191c0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
191d0 67 20 74 68 65 20 69 6e 64 65 78 65 64 20 64 61  g the indexed da
191e0 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
191f0 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
19200 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
19210 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69   database that i
19220 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  s being written 
19230 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
19240 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71  e = 0;    /* Unq
19250 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
19260 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72   the index to cr
19270 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  eate */.  struct
19280 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
19290 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f  pListItem; /* Fo
192a0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
192b0 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  List */.  int nE
192c0 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20  xtra = 0;       
192d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
192e0 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
192f0 72 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20  r zExtra[] */.  
19300 69 6e 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20  int nExtraCol;  
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19320 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
19330 74 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64  tra columns need
19340 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45  ed */.  char *zE
19350 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20  xtra = 0;       
19360 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
19370 61 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68  a space after th
19380 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  e Index object *
19390 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d  /.  Index *pPk =
193a0 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 52 49 4d   0;      /* PRIM
193b0 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f  ARY KEY index fo
193c0 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
193d0 74 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 69 66 28  tables */..  if(
193e0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
193f0 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
19400 72 3e 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  r>0 ){.    goto 
19410 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
19420 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e 5f  x;.  }.  if( IN_
19430 44 45 43 4c 41 52 45 5f 56 54 41 42 20 26 26 20  DECLARE_VTAB && 
19440 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  idxType!=SQLITE_
19450 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b  IDXTYPE_PRIMARYK
19460 45 59 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  EY ){.    goto e
19470 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19480 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49  ;.  }.  if( SQLI
19490 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
194a0 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
194b0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
194c0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
194d0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
194e0 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68  ind the table th
194f0 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
19500 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72  xed.  Return ear
19510 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ly if not found.
19520 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c  .  */.  if( pTbl
19530 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20  Name!=0 ){..    
19540 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70  /* Use the two-p
19550 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74  art index name t
19560 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
19570 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
19580 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74   to search for t
19590 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20  he table. 'Fix' 
195a0 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  the table name t
195b0 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a  o this db.    **
195c0 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20   before looking 
195d0 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  up the table..  
195e0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
195f0 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65   pName1 && pName
19600 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  2 );.    iDb = s
19610 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
19620 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
19630 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
19640 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
19650 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
19660 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61  ate_index;.    a
19670 73 73 65 72 74 28 20 70 4e 61 6d 65 20 26 26 20  ssert( pName && 
19680 70 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66  pName->z );..#if
19690 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
196a0 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49  _TEMPDB.    /* I
196b0 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
196c0 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64   was unqualified
196d0 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74  , check if the t
196e0 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61  able.    ** is a
196f0 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20   temp table. If 
19700 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  so, set the data
19710 62 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f  base to 1. Do no
19720 74 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a  t do this.    **
19730 20 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67   if initialising
19740 20 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65   a database sche
19750 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ma..    */.    i
19760 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
19770 79 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  y ){.      pTab 
19780 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
19790 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
197a0 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TblName);.      
197b0 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30  if( pName2->n==0
197c0 20 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62   && pTab && pTab
197d0 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61  ->pSchema==db->a
197e0 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b  Db[1].pSchema ){
197f0 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31  .        iDb = 1
19800 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19810 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69  #endif..    sqli
19820 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
19830 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
19840 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a  index", pName);.
19850 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
19860 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c  ixSrcList(&sFix,
19870 20 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20   pTblName) ){.  
19880 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74      /* Because t
19890 68 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72  he parser constr
198a0 75 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72  ucts pTblName fr
198b0 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e  om a single iden
198c0 74 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a  tifier,.      **
198d0 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
198e0 73 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69  st can never fai
198f0 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  l. */.      asse
19900 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rt(0);.    }.   
19910 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
19920 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70  ocateTableItem(p
19930 50 61 72 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e  Parse, 0, &pTblN
19940 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20  ame->a[0]);.    
19950 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
19960 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70  ocFailed==0 || p
19970 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab==0 );.    if
19980 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f  ( pTab==0 ) goto
19990 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
199a0 65 78 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d  ex;.    if( iDb=
199b0 3d 31 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 44  =1 && db->aDb[iD
199c0 62 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54 61 62  b].pSchema!=pTab
199d0 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
199e0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
199f0 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
19a00 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63         "cannot c
19a10 72 65 61 74 65 20 61 20 54 45 4d 50 20 69 6e 64  reate a TEMP ind
19a20 65 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74  ex on non-TEMP t
19a30 61 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20  able \"%s\"",.  
19a40 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a           pTab->z
19a50 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
19a60 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
19a70 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
19a80 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
19a90 62 29 20 29 20 70 50 6b 20 3d 20 73 71 6c 69 74  b) ) pPk = sqlit
19aa0 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
19ab0 78 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65  x(pTab);.  }else
19ac0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
19ad0 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ame==0 );.    as
19ae0 73 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20  sert( pStart==0 
19af0 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50  );.    pTab = pP
19b00 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
19b10 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29  .    if( !pTab )
19b20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
19b30 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62  e_index;.    iDb
19b40 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
19b50 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
19b60 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a  ->pSchema);.  }.
19b70 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
19b80 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74  [iDb];..  assert
19b90 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61  ( pTab!=0 );.  a
19ba0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
19bb0 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Err==0 );.  if( 
19bc0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
19bd0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
19be0 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20  lite_", 7)==0 . 
19bf0 20 20 20 20 20 20 26 26 20 64 62 2d 3e 69 6e 69        && db->ini
19c00 74 2e 62 75 73 79 3d 3d 30 0a 20 20 20 20 20 20  t.busy==0.      
19c10 20 26 26 20 70 54 62 6c 4e 61 6d 65 21 3d 30 0a   && pTblName!=0.
19c20 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
19c30 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
19c40 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
19c50 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 70 54  UserAuthTable(pT
19c60 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23 65  ab->zName)==0.#e
19c70 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
19c80 54 45 5f 41 4c 4c 4f 57 5f 53 51 4c 49 54 45 5f  TE_ALLOW_SQLITE_
19c90 4d 41 53 54 45 52 5f 49 4e 44 45 58 0a 20 20 20  MASTER_INDEX.   
19ca0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
19cb0 72 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61  rICmp(&pTab->zNa
19cc0 6d 65 5b 37 5d 2c 22 6d 61 73 74 65 72 22 29 21  me[7],"master")!
19cd0 3d 30 0a 23 65 6e 64 69 66 0a 20 29 7b 0a 20 20  =0.#endif. ){.  
19ce0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
19cf0 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
19d00 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69   %s may not be i
19d10 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a  ndexed", pTab->z
19d20 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
19d30 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
19d40 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  x;.  }.#ifndef S
19d50 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
19d60 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
19d70 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
19d80 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
19d90 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f  e, "views may no
19da0 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a  t be indexed");.
19db0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
19dc0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
19dd0 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
19de0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
19df0 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73  ALTABLE.  if( Is
19e00 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
19e10 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
19e20 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
19e30 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79  rtual tables may
19e40 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
19e50 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
19e60 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
19e70 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a   }.#endif..  /*.
19e80 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61    ** Find the na
19e90 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  me of the index.
19ea0 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72    Make sure ther
19eb0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
19ec0 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e   another.  ** in
19ed0 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74  dex or table wit
19ee0 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
19ef0 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63    .  **.  ** Exc
19f00 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61  eption:  If we a
19f10 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e  re reading the n
19f20 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e  ames of permanen
19f30 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74  t indices from t
19f40 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d  he.  ** sqlite_m
19f50 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63  aster table (bec
19f60 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  ause some other 
19f70 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20  process changed 
19f80 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a  the schema) and.
19f90 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20    ** one of the 
19fa0 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c  index names coll
19fb0 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61  ides with the na
19fc0 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72  me of a temporar
19fd0 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20  y table or.  ** 
19fe0 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77  index, then we w
19ff0 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
1a000 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64  process this ind
1a010 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ex..  **.  ** If
1a020 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61   pName==0 it mea
1a030 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20  ns that we are. 
1a040 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68   ** dealing with
1a050 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
1a060 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
1a070 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f  int.  We have to
1a080 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a   invent our.  **
1a090 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   own name..  */.
1a0a0 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
1a0b0 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
1a0c0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1a0d0 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  db, pName);.    
1a0e0 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67  if( zName==0 ) g
1a0f0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1a100 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72  index;.    asser
1a110 74 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29  t( pName->z!=0 )
1a120 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
1a130 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63  _OK!=sqlite3Chec
1a140 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72  kObjectName(pPar
1a150 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  se, zName) ){.  
1a160 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1a170 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1a180 7d 0a 20 20 20 20 69 66 28 20 21 49 4e 5f 52 45  }.    if( !IN_RE
1a190 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  NAME_OBJECT ){. 
1a1a0 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e       if( !db->in
1a1b0 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
1a1c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
1a1d0 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
1a1e0 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20  e, 0)!=0 ){.    
1a1f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1a200 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
1a210 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
1a220 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73  a table named %s
1a230 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
1a240 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1a250 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1a260 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1a270 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1a280 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
1a290 61 6d 65 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61  ame, pDb->zDbSNa
1a2a0 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
1a2b0 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73    if( !ifNotExis
1a2c0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
1a2d0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a2e0 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73  Parse, "index %s
1a2f0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
1a300 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
1a310 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a320 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
1a330 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20  init.busy );.   
1a340 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
1a350 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
1a360 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
1a370 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
1a380 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1a390 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
1a3a0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1a3b0 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64    int n;.    Ind
1a3c0 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66  ex *pLoop;.    f
1a3d0 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70  or(pLoop=pTab->p
1a3e0 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f  Index, n=1; pLoo
1a3f0 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
1a400 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  pNext, n++){}.  
1a410 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
1a420 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71  3MPrintf(db, "sq
1a430 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25  lite_autoindex_%
1a440 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s_%d", pTab->zNa
1a450 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20  me, n);.    if( 
1a460 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
1a470 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1a480 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
1a490 0a 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69  .    /* Automati
1a4a0 63 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 67 65  c index names ge
1a4b0 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 77 69 74  nerated from wit
1a4c0 68 69 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c  hin sqlite3_decl
1a4d0 61 72 65 5f 76 74 61 62 28 29 0a 20 20 20 20 2a  are_vtab().    *
1a4e0 2a 20 6d 75 73 74 20 68 61 76 65 20 6e 61 6d 65  * must have name
1a4f0 73 20 74 68 61 74 20 61 72 65 20 64 69 73 74 69  s that are disti
1a500 6e 63 74 20 66 72 6f 6d 20 6e 6f 72 6d 61 6c 20  nct from normal 
1a510 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
1a520 6e 61 6d 65 73 2e 0a 20 20 20 20 2a 2a 20 54 68  names..    ** Th
1a530 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74  e following stat
1a540 65 6d 65 6e 74 20 63 6f 6e 76 65 72 74 73 20 22  ement converts "
1a550 73 71 6c 69 74 65 33 5f 61 75 74 6f 69 6e 64 65  sqlite3_autoinde
1a560 78 2e 2e 2e 22 20 69 6e 74 6f 0a 20 20 20 20 2a  x..." into.    *
1a570 2a 20 22 73 71 6c 69 74 65 33 5f 62 75 74 6f 69  * "sqlite3_butoi
1a580 6e 64 65 78 2e 2e 2e 22 20 69 6e 20 6f 72 64 65  ndex..." in orde
1a590 72 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61  r to make the na
1a5a0 6d 65 73 20 64 69 73 74 69 6e 63 74 2e 0a 20 20  mes distinct..  
1a5b0 20 20 2a 2a 20 54 68 65 20 22 76 74 61 62 5f 65    ** The "vtab_e
1a5c0 72 72 2e 74 65 73 74 22 20 74 65 73 74 20 64 65  rr.test" test de
1a5d0 6d 6f 6e 73 74 72 61 74 65 73 20 74 68 65 20 6e  monstrates the n
1a5e0 65 65 64 20 6f 66 20 74 68 69 73 20 73 74 61 74  eed of this stat
1a5f0 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66  ement. */.    if
1a600 28 20 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52  ( IN_SPECIAL_PAR
1a610 53 45 20 29 20 7a 4e 61 6d 65 5b 37 5d 2b 2b 3b  SE ) zName[7]++;
1a620 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
1a630 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69   for authorizati
1a640 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  on to create an 
1a650 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e  index..  */.#ifn
1a660 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a670 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
1a680 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f  if( !IN_RENAME_O
1a690 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 63 6f 6e  BJECT ){.    con
1a6a0 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70  st char *zDb = p
1a6b0 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db->zDbSName;.  
1a6c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1a6d0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1a6e0 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
1a6f0 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
1a700 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
1a710 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1a720 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
1a730 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43      i = SQLITE_C
1a740 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20  REATE_INDEX;.   
1a750 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
1a760 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20  B && iDb==1 ) i 
1a770 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
1a780 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
1a790 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1a7a0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20  heck(pParse, i, 
1a7b0 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
1a7c0 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
1a7d0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1a7e0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
1a7f0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1a800 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74   If pList==0, it
1a810 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74   means this rout
1a820 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ine was called t
1a830 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79  o make a primary
1a840 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66  .  ** key out of
1a850 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
1a860 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
1a870 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
1a880 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  uction..  ** So 
1a890 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69  create a fake li
1a8a0 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74  st to simulate t
1a8b0 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  his..  */.  if( 
1a8c0 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
1a8d0 54 6f 6b 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20  Token prevCol;. 
1a8e0 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20     Column *pCol 
1a8f0 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54  = &pTab->aCol[pT
1a900 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 20  ab->nCol-1];.   
1a910 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
1a920 7c 3d 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55  |= COLFLAG_UNIQU
1a930 45 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f  E;.    sqlite3To
1a940 6b 65 6e 49 6e 69 74 28 26 70 72 65 76 43 6f 6c  kenInit(&prevCol
1a950 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCol->zName);.
1a960 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
1a970 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
1a980 64 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20  d(pParse, 0,.   
1a990 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1a9a0 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
1a9b0 54 4b 5f 49 44 2c 20 26 70 72 65 76 43 6f 6c 2c  TK_ID, &prevCol,
1a9c0 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c   0));.    if( pL
1a9d0 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ist==0 ) goto ex
1a9e0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1a9f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
1aa00 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a  st->nExpr==1 );.
1aa10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
1aa20 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28  istSetSortOrder(
1aa30 70 4c 69 73 74 2c 20 73 6f 72 74 4f 72 64 65 72  pList, sortOrder
1aa40 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1aa50 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
1aa60 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72 73  heckLength(pPars
1aa70 65 2c 20 70 4c 69 73 74 2c 20 22 69 6e 64 65 78  e, pList, "index
1aa80 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  ");.  }..  /* Fi
1aa90 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
1aaa0 79 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  y bytes of space
1aab0 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
1aac0 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c   store explicitl
1aad0 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64  y.  ** specified
1aae0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1aaf0 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a  nce names..  */.
1ab00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
1ab10 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
1ab20 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
1ab30 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
1ab40 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
1ab50 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ( pExpr!=0 );.  
1ab60 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
1ab70 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20  =TK_COLLATE ){. 
1ab80 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28       nExtra += (
1ab90 31 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65  1 + sqlite3Strle
1aba0 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  n30(pExpr->u.zTo
1abb0 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ken));.    }.  }
1abc0 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c  ..  /* .  ** All
1abd0 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
1abe0 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f  structure. .  */
1abf0 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  nName = sqlit
1ac00 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
1ac10 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20 3d  );.  nExtraCol =
1ac20 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79   pPk ? pPk->nKey
1ac30 43 6f 6c 20 3a 20 31 3b 0a 20 20 70 49 6e 64 65  Col : 1;.  pInde
1ac40 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63  x = sqlite3Alloc
1ac50 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64  ateIndexObject(d
1ac60 62 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  b, pList->nExpr 
1ac70 2b 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20  + nExtraCol,.   
1ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aca0 20 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72     nName + nExtr
1acb0 61 20 2b 20 31 2c 20 26 7a 45 78 74 72 61 29 3b  a + 1, &zExtra);
1acc0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1acd0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
1ace0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1acf0 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73  index;.  }.  ass
1ad00 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
1ad10 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78  ALIGNMENT(pIndex
1ad20 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 29 20 29  ->aiRowLogEst) )
1ad30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
1ad40 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
1ad50 28 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29  (pIndex->azColl)
1ad60 20 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e   );.  pIndex->zN
1ad70 61 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20  ame = zExtra;.  
1ad80 7a 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20  zExtra += nName 
1ad90 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49  + 1;.  memcpy(pI
1ada0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  ndex->zName, zNa
1adb0 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20  me, nName+1);.  
1adc0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d  pIndex->pTable =
1add0 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d   pTab;.  pIndex-
1ade0 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f  >onError = (u8)o
1adf0 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78  nError;.  pIndex
1ae00 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20  ->uniqNotNull = 
1ae10 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
1ae20 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 64 78 54  ;.  pIndex->idxT
1ae30 79 70 65 20 3d 20 69 64 78 54 79 70 65 3b 0a 20  ype = idxType;. 
1ae40 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
1ae50 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
1ae60 70 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e 64 65  pSchema;.  pInde
1ae70 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c 69  x->nKeyCol = pLi
1ae80 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28  st->nExpr;.  if(
1ae90 20 70 50 49 57 68 65 72 65 20 29 7b 0a 20 20 20   pPIWhere ){.   
1aea0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
1aeb0 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61  elfReference(pPa
1aec0 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 50 61  rse, pTab, NC_Pa
1aed0 72 74 49 64 78 2c 20 70 50 49 57 68 65 72 65 2c  rtIdx, pPIWhere,
1aee0 20 30 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d   0);.    pIndex-
1aef0 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 20 3d  >pPartIdxWhere =
1af00 20 70 50 49 57 68 65 72 65 3b 0a 20 20 20 20 70   pPIWhere;.    p
1af10 50 49 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d  PIWhere = 0;.  }
1af20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1af30 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
1af40 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
1af50 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
1af60 73 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64  see if we should
1af70 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75   honor DESC requ
1af80 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f  ests on index co
1af90 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28  lumns.  */.  if(
1afa0 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66   pDb->pSchema->f
1afb0 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b  ile_format>=4 ){
1afc0 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61  .    sortOrderMa
1afd0 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f  sk = -1;   /* Ho
1afe0 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65  nor DESC */.  }e
1aff0 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64  lse{.    sortOrd
1b000 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f  erMask = 0;    /
1b010 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f  * Ignore DESC */
1b020 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79  .  }..  /* Analy
1b030 7a 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65  ze the list of e
1b040 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
1b050 66 6f 72 6d 20 74 68 65 20 74 65 72 6d 73 20 6f  form the terms o
1b060 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 0a  f the index and.
1b070 20 20 2a 2a 20 72 65 70 6f 72 74 20 61 6e 79 20    ** report any 
1b080 65 72 72 6f 72 73 2e 20 20 49 6e 20 74 68 65 20  errors.  In the 
1b090 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
1b0a0 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
1b0b0 20 69 73 20 65 78 61 63 74 6c 79 0a 20 20 2a 2a   is exactly.  **
1b0c0 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c   a table column,
1b0d0 20 73 74 6f 72 65 20 74 68 61 74 20 63 6f 6c 75   store that colu
1b0e0 6d 6e 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d  mn in aiColumn[]
1b0f0 2e 20 20 46 6f 72 20 67 65 6e 65 72 61 6c 20 65  .  For general e
1b100 78 70 72 65 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a  xpressions,.  **
1b110 20 70 6f 70 75 6c 61 74 65 20 70 49 6e 64 65 78   populate pIndex
1b120 2d 3e 61 43 6f 6c 45 78 70 72 20 61 6e 64 20 73  ->aColExpr and s
1b130 74 6f 72 65 20 58 4e 5f 45 58 50 52 20 28 2d 32  tore XN_EXPR (-2
1b140 29 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e  ) in aiColumn[].
1b150 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a  .  **.  ** TODO:
1b160 20 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67   Issue a warning
1b170 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   if two or more 
1b180 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
1b190 6e 64 65 78 20 61 72 65 20 69 64 65 6e 74 69 63  ndex are identic
1b1a0 61 6c 2e 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49  al..  ** TODO: I
1b1b0 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69  ssue a warning i
1b1c0 66 20 74 68 65 20 74 61 62 6c 65 20 70 72 69 6d  f the table prim
1b1d0 61 72 79 20 6b 65 79 20 69 73 20 75 73 65 64 20  ary key is used 
1b1e0 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20  as part of the. 
1b1f0 20 2a 2a 20 69 6e 64 65 78 20 6b 65 79 2e 0a 20   ** index key.. 
1b200 20 2a 2f 0a 20 20 70 4c 69 73 74 49 74 65 6d 20   */.  pListItem 
1b210 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 69 66  = pList->a;.  if
1b220 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
1b230 43 54 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78  CT ){.    pIndex
1b240 2d 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70 4c 69  ->aColExpr = pLi
1b250 73 74 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  st;.    pList = 
1b260 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  0;.  }.  for(i=0
1b270 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  ; i<pIndex->nKey
1b280 43 6f 6c 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49  Col; i++, pListI
1b290 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
1b2a0 20 2a 70 43 45 78 70 72 3b 20 20 20 20 20 20 20   *pCExpr;       
1b2b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b2c0 65 20 69 2d 74 68 20 69 6e 64 65 78 20 65 78 70  e i-th index exp
1b2d0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  ression */.    i
1b2e0 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74  nt requestedSort
1b2f0 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20 2f 2a  Order;        /*
1b300 20 41 53 43 20 6f 72 20 44 45 53 43 20 6f 6e 20   ASC or DESC on 
1b310 74 68 65 20 69 2d 74 68 20 65 78 70 72 65 73 73  the i-th express
1b320 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ion */.    const
1b330 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20   char *zColl;   
1b340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
1b350 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1b360 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 73 71 6c  name */..    sql
1b370 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70  ite3StringToId(p
1b380 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29  ListItem->pExpr)
1b390 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  ;.    sqlite3Res
1b3a0 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63  olveSelfReferenc
1b3b0 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
1b3c0 4e 43 5f 49 64 78 45 78 70 72 2c 20 70 4c 69 73  NC_IdxExpr, pLis
1b3d0 74 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 30 29  tItem->pExpr, 0)
1b3e0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
1b3f0 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78  ->nErr ) goto ex
1b400 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1b410 0a 20 20 20 20 70 43 45 78 70 72 20 3d 20 73 71  .    pCExpr = sq
1b420 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
1b430 6c 61 74 65 28 70 4c 69 73 74 49 74 65 6d 2d 3e  late(pListItem->
1b440 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
1b450 70 43 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  pCExpr->op!=TK_C
1b460 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69  OLUMN ){.      i
1b470 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d  f( pTab==pParse-
1b480 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20  >pNewTable ){.  
1b490 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1b4a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65  orMsg(pParse, "e
1b4b0 78 70 72 65 73 73 69 6f 6e 73 20 70 72 6f 68 69  xpressions prohi
1b4c0 62 69 74 65 64 20 69 6e 20 50 52 49 4d 41 52 59  bited in PRIMARY
1b4d0 20 4b 45 59 20 61 6e 64 20 22 0a 20 20 20 20 20   KEY and ".     
1b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4f0 20 20 20 20 20 20 20 20 20 20 20 22 55 4e 49 51             "UNIQ
1b500 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29  UE constraints")
1b510 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
1b520 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1b530 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b540 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c  if( pIndex->aCol
1b550 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Expr==0 ){.     
1b560 20 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45     pIndex->aColE
1b570 78 70 72 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20  xpr = pList;.   
1b580 20 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a       pList = 0;.
1b590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20        }.      j 
1b5a0 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20  = XN_EXPR;.     
1b5b0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
1b5c0 6e 5b 69 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a  n[i] = XN_EXPR;.
1b5d0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e        pIndex->un
1b5e0 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20  iqNotNull = 0;. 
1b5f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b600 6a 20 3d 20 70 43 45 78 70 72 2d 3e 69 43 6f 6c  j = pCExpr->iCol
1b610 75 6d 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  umn;.      asser
1b620 74 28 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a  t( j<=0x7fff );.
1b630 20 20 20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b        if( j<0 ){
1b640 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 54 61  .        j = pTa
1b650 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
1b660 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e  }else if( pTab->
1b670 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d  aCol[j].notNull=
1b680 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =0 ){.        pI
1b690 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  ndex->uniqNotNul
1b6a0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 0;.      }. 
1b6b0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43       pIndex->aiC
1b6c0 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29  olumn[i] = (i16)
1b6d0 6a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f  j;.    }.    zCo
1b6e0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ll = 0;.    if( 
1b6f0 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
1b700 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
1b710 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43   ){.      int nC
1b720 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  oll;.      zColl
1b730 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45   = pListItem->pE
1b740 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
1b750 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c       nColl = sql
1b760 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f  ite3Strlen30(zCo
1b770 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 61  ll) + 1;.      a
1b780 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e  ssert( nExtra>=n
1b790 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65  Coll );.      me
1b7a0 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f  mcpy(zExtra, zCo
1b7b0 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20  ll, nColl);.    
1b7c0 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61    zColl = zExtra
1b7d0 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b  ;.      zExtra +
1b7e0 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e  = nColl;.      n
1b7f0 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a  Extra -= nColl;.
1b800 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 3e      }else if( j>
1b810 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6c  =0 ){.      zCol
1b820 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  l = pTab->aCol[j
1b830 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ].zColl;.    }. 
1b840 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20     if( !zColl ) 
1b850 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53  zColl = sqlite3S
1b860 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 69 66  trBINARY;.    if
1b870 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
1b880 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61   && !sqlite3Loca
1b890 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
1b8a0 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
1b8b0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1b8c0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
1b8d0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
1b8e0 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20  ll[i] = zColl;. 
1b8f0 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72 74     requestedSort
1b900 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65  Order = pListIte
1b910 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73  m->sortOrder & s
1b920 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20  ortOrderMask;.  
1b930 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f    pIndex->aSortO
1b940 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72 65  rder[i] = (u8)re
1b950 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
1b960 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65  ;.  }..  /* Appe
1b970 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6b 65 79  nd the table key
1b980 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1b990 68 65 20 69 6e 64 65 78 2e 20 20 46 6f 72 20 57  he index.  For W
1b9a0 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 2a  ITHOUT ROWID.  *
1b9b0 2a 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70  * tables (when p
1b9c0 50 6b 21 3d 30 29 20 74 68 69 73 20 77 69 6c 6c  Pk!=0) this will
1b9d0 20 62 65 20 74 68 65 20 64 65 63 6c 61 72 65 64   be the declared
1b9e0 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46   PRIMARY KEY.  F
1b9f0 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 74  or.  ** normal t
1ba00 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 3d  ables (when pPk=
1ba10 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65  =0) this will be
1ba20 20 74 68 65 20 72 6f 77 69 64 2e 0a 20 20 2a 2f   the rowid..  */
1ba30 0a 20 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20  .  if( pPk ){.  
1ba40 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b    for(j=0; j<pPk
1ba50 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b  ->nKeyCol; j++){
1ba60 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70  .      int x = p
1ba70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  Pk->aiColumn[j];
1ba80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78  .      assert( x
1ba90 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
1baa0 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65   hasColumn(pInde
1bab0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e  x->aiColumn, pIn
1bac0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29  dex->nKeyCol, x)
1bad0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   ){.        pInd
1bae0 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a  ex->nColumn--; .
1baf0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1bb00 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43       pIndex->aiC
1bb10 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20  olumn[i] = x;.  
1bb20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a        pIndex->az
1bb30 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61  Coll[i] = pPk->a
1bb40 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  zColl[j];.      
1bb50 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f    pIndex->aSortO
1bb60 72 64 65 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61  rder[i] = pPk->a
1bb70 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20  SortOrder[j];.  
1bb80 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
1bb90 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
1bba0 65 72 74 28 20 69 3d 3d 70 49 6e 64 65 78 2d 3e  ert( i==pIndex->
1bbb0 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c  nColumn );.  }el
1bbc0 73 65 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  se{.    pIndex->
1bbd0 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e  aiColumn[i] = XN
1bbe0 5f 52 4f 57 49 44 3b 0a 20 20 20 20 70 49 6e 64  _ROWID;.    pInd
1bbf0 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20  ex->azColl[i] = 
1bc00 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
1bc10 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
1bc20 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e  efaultRowEst(pIn
1bc30 64 65 78 29 3b 0a 20 20 69 66 28 20 70 50 61 72  dex);.  if( pPar
1bc40 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30  se->pNewTable==0
1bc50 20 29 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78   ) estimateIndex
1bc60 57 69 64 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a  Width(pIndex);..
1bc70 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64    /* If this ind
1bc80 65 78 20 63 6f 6e 74 61 69 6e 73 20 65 76 65 72  ex contains ever
1bc90 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 74 73 20  y column of its 
1bca0 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 72 6b  table, then mark
1bcb0 0a 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 6f  .  ** it as a co
1bcc0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  vering index */.
1bcd0 20 20 61 73 73 65 72 74 28 20 48 61 73 52 6f 77    assert( HasRow
1bce0 69 64 28 70 54 61 62 29 20 0a 20 20 20 20 20 20  id(pTab) .      
1bcf0 7c 7c 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30  || pTab->iPKey<0
1bd00 20 7c 7c 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d   || sqlite3Colum
1bd10 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65 78 2c  nOfIndex(pIndex,
1bd20 20 70 54 61 62 2d 3e 69 50 4b 65 79 29 3e 3d 30   pTab->iPKey)>=0
1bd30 20 29 3b 0a 20 20 72 65 63 6f 6d 70 75 74 65 43   );.  recomputeC
1bd40 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65 78 65 64  olumnsNotIndexed
1bd50 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28 20  (pIndex);.  if( 
1bd60 70 54 62 6c 4e 61 6d 65 21 3d 30 20 26 26 20 70  pTblName!=0 && p
1bd70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d  Index->nColumn>=
1bd80 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
1bd90 20 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65    pIndex->isCove
1bda0 72 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f  ring = 1;.    fo
1bdb0 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
1bdc0 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
1bdd0 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50   if( j==pTab->iP
1bde0 4b 65 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Key ) continue;.
1bdf0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1be00 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70  3ColumnOfIndex(p
1be10 49 6e 64 65 78 2c 6a 29 3e 3d 30 20 29 20 63 6f  Index,j)>=0 ) co
1be20 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 49  ntinue;.      pI
1be30 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67  ndex->isCovering
1be40 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
1be50 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
1be60 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65  if( pTab==pParse
1be70 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20  ->pNewTable ){. 
1be80 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69     /* This routi
1be90 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  ne has been call
1bea0 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
1beb0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
1bec0 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75  as a.    ** resu
1bed0 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20  lt of a PRIMARY 
1bee0 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c  KEY or UNIQUE cl
1bef0 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  ause on a column
1bf00 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a   definition, or.
1bf10 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59      ** a PRIMARY
1bf20 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
1bf30 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  lause following 
1bf40 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  the column defin
1bf50 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69  itions..    ** i
1bf60 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20  .e. one of:.    
1bf70 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  **.    ** CREATE
1bf80 20 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41   TABLE t(x PRIMA
1bf90 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20  RY KEY, y);.    
1bfa0 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
1bfb0 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78  t(x, y, UNIQUE(x
1bfc0 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  , y));.    **.  
1bfd0 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c    ** Either way,
1bfe0 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
1bff0 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
1c000 64 79 20 68 61 73 20 73 75 63 68 20 61 6e 20 69  dy has such an i
1c010 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20  ndex. If.    ** 
1c020 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  so, don't bother
1c030 20 63 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f   creating this o
1c040 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70  ne. This only ap
1c050 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20  plies to.    ** 
1c060 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72  automatically cr
1c070 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55  eated indices. U
1c080 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74  sers can do as t
1c090 68 65 79 20 77 69 73 68 20 77 69 74 68 0a 20 20  hey wish with.  
1c0a0 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e    ** explicit in
1c0b0 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20  dices..    **.  
1c0c0 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20    ** Two UNIQUE 
1c0d0 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
1c0e0 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63  onstraints are c
1c0f0 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69 76 61  onsidered equiva
1c100 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64  lent.    ** (and
1c110 20 74 68 75 73 20 73 75 70 70 72 65 73 73 69 6e   thus suppressin
1c120 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65  g the second one
1c130 29 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 68  ) even if they h
1c140 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20  ave different.  
1c150 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73    ** sort orders
1c160 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1c170 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66  If there are dif
1c180 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67  ferent collating
1c190 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66   sequences or if
1c1a0 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a   the columns of.
1c1b0 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74      ** the const
1c1c0 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64  raint occur in d
1c1d0 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c  ifferent orders,
1c1e0 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72   then the constr
1c1f0 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a  aints are.    **
1c200 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74   considered dist
1c210 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65  inct and both re
1c220 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65  sult in separate
1c230 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f   indices..    */
1c240 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
1c250 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
1c260 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
1c270 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
1c280 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
1c290 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
1c2a0 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
1c2b0 49 64 78 29 20 29 3b 0a 20 20 20 20 20 20 61 73  Idx) );.      as
1c2c0 73 65 72 74 28 20 70 49 64 78 2d 3e 69 64 78 54  sert( pIdx->idxT
1c2d0 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54  ype!=SQLITE_IDXT
1c2e0 59 50 45 5f 41 50 50 44 45 46 20 29 3b 0a 20 20  YPE_APPDEF );.  
1c2f0 20 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e      assert( IsUn
1c300 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78  iqueIndex(pIndex
1c310 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ) );..      if( 
1c320 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70  pIdx->nKeyCol!=p
1c330 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  Index->nKeyCol )
1c340 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1c350 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78   for(k=0; k<pIdx
1c360 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b  ->nKeyCol; k++){
1c370 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
1c380 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20  har *z1;.       
1c390 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b   const char *z2;
1c3a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1c3b0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
1c3c0 6b 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  k]>=0 );.       
1c3d0 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
1c3e0 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e  umn[k]!=pIndex->
1c3f0 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72  aiColumn[k] ) br
1c400 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31 20  eak;.        z1 
1c410 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b  = pIdx->azColl[k
1c420 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20  ];.        z2 = 
1c430 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b  pIndex->azColl[k
1c440 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ];.        if( s
1c450 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31  qlite3StrICmp(z1
1c460 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20  , z2) ) break;. 
1c470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1c480 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   k==pIdx->nKeyCo
1c490 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  l ){.        if(
1c4a0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
1c4b0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
1c4c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1c4d0 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  This constraint 
1c4e0 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65  creates the same
1c4f0 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76   index as a prev
1c500 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ious.          *
1c510 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65  * constraint spe
1c520 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65  cified somewhere
1c530 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
1c540 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
1c550 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77            ** How
1c560 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46  ever the ON CONF
1c570 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65  LICT clauses are
1c580 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62   different. If b
1c590 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20  oth this .      
1c5a0 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
1c5b0 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f  t and the previo
1c5c0 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  us equivalent co
1c5d0 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78  nstraint have ex
1c5e0 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20  plicit.         
1c5f0 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20   ** ON CONFLICT 
1c600 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20  clauses this is 
1c610 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77  an error. Otherw
1c620 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20  ise, use the.   
1c630 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63         ** explic
1c640 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62  itly specified b
1c650 65 68 61 76 69 6f 72 20 66 6f 72 20 74 68 65 20  ehavior for the 
1c660 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20  index..         
1c670 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
1c680 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  ( !(pIdx->onErro
1c690 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c  r==OE_Default ||
1c6a0 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
1c6b0 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b  ==OE_Default) ){
1c6c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1c6d0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1c6e0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
1c6f0 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69        "conflicti
1c700 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ng ON CONFLICT c
1c710 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64  lauses specified
1c720 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 0);.         
1c730 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
1c740 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d   pIdx->onError==
1c750 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
1c760 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
1c770 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78  onError = pIndex
1c780 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20  ->onError;.     
1c790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1c7a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78  .        if( idx
1c7b0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58  Type==SQLITE_IDX
1c7c0 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 20  TYPE_PRIMARYKEY 
1c7d0 29 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 20  ) pIdx->idxType 
1c7e0 3d 20 69 64 78 54 79 70 65 3b 0a 20 20 20 20 20  = idxType;.     
1c7f0 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45     if( IN_RENAME
1c800 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20  _OBJECT ){.     
1c810 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
1c820 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  xt = pParse->pNe
1c830 77 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20  wIndex;.        
1c840 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e    pParse->pNewIn
1c850 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
1c860 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d          pIndex =
1c870 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
1c880 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1c890 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1c8a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c8b0 0a 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d  .  if( !IN_RENAM
1c8c0 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 0a 20 20 20  E_OBJECT ){..   
1c8d0 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77   /* Link the new
1c8e0 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
1c8f0 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e   to its table an
1c900 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20  d to the other. 
1c910 20 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20     ** in-memory 
1c920 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
1c930 72 65 73 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  res. .    */.   
1c940 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1c950 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20  >nErr==0 );.    
1c960 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
1c970 79 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  y ){.      Index
1c980 20 2a 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72   *p;.      asser
1c990 74 28 20 21 49 4e 5f 53 50 45 43 49 41 4c 5f 50  t( !IN_SPECIAL_P
1c9a0 41 52 53 45 20 29 3b 0a 20 20 20 20 20 20 61 73  ARSE );.      as
1c9b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
1c9c0 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
1c9d0 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68   0, pIndex->pSch
1c9e0 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ema) );.      if
1c9f0 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
1ca00 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1ca10 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
1ca20 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 20 20  .newTnum;.      
1ca30 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64    if( sqlite3Ind
1ca40 65 78 48 61 73 44 75 70 6c 69 63 61 74 65 52 6f  exHasDuplicateRo
1ca50 6f 74 50 61 67 65 28 70 49 6e 64 65 78 29 20 29  otPage(pIndex) )
1ca60 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1ca70 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1ca80 73 65 2c 20 22 69 6e 76 61 6c 69 64 20 72 6f 6f  se, "invalid roo
1ca90 74 70 61 67 65 22 29 3b 0a 20 20 20 20 20 20 20  tpage");.       
1caa0 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
1cab0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1cac0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
1cad0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1cae0 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 7d  index;.        }
1caf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1cb00 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
1cb10 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53  sert(&pIndex->pS
1cb20 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
1cb30 0a 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65  .          pInde
1cb40 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78  x->zName, pIndex
1cb50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 20 29  );.      if( p )
1cb60 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1cb70 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20  ( p==pIndex );  
1cb80 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
1cb90 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
1cba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d        sqlite3Oom
1cbb0 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20  Fault(db);.     
1cbc0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1cbd0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
1cbe0 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6d 44 62   }.      db->mDb
1cbf0 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f  Flags |= DBFLAG_
1cc00 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20  SchemaChange;.  
1cc10 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1cc20 68 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69  his is the initi
1cc30 61 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  al CREATE INDEX 
1cc40 73 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 43 52  statement (or CR
1cc50 45 41 54 45 20 54 41 42 4c 45 20 69 66 20 74 68  EATE TABLE if th
1cc60 65 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 69  e.    ** index i
1cc70 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64  s an implied ind
1cc80 65 78 20 66 6f 72 20 61 20 55 4e 49 51 55 45 20  ex for a UNIQUE 
1cc90 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
1cca0 6f 6e 73 74 72 61 69 6e 74 29 20 74 68 65 6e 0a  onstraint) then.
1ccb0 20 20 20 20 2a 2a 20 65 6d 69 74 20 63 6f 64 65      ** emit code
1ccc0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   to allocate the
1ccd0 20 69 6e 64 65 78 20 72 6f 6f 74 70 61 67 65 20   index rootpage 
1cce0 6f 6e 20 64 69 73 6b 20 61 6e 64 20 6d 61 6b 65  on disk and make
1ccf0 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 0a 20 20   an entry for.  
1cd00 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
1cd10 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
1cd20 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 70 6f  ter table and po
1cd30 70 75 6c 61 74 65 20 74 68 65 20 69 6e 64 65 78  pulate the index
1cd40 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 63 6f 6e   with.    ** con
1cd50 74 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e  tent.  But, do n
1cd60 6f 74 20 64 6f 20 74 68 69 73 20 69 66 20 77 65  ot do this if we
1cd70 20 61 72 65 20 73 69 6d 70 6c 79 20 72 65 61 64   are simply read
1cd80 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
1cd90 61 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 61 62  aster.    ** tab
1cda0 6c 65 20 74 6f 20 70 61 72 73 65 20 74 68 65 20  le to parse the 
1cdb0 73 63 68 65 6d 61 2c 20 6f 72 20 69 66 20 74 68  schema, or if th
1cdc0 69 73 20 69 6e 64 65 78 20 69 73 20 74 68 65 20  is index is the 
1cdd0 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
1cde0 78 0a 20 20 20 20 2a 2a 20 6f 66 20 61 20 57 49  x.    ** of a WI
1cdf0 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
1ce00 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
1ce10 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20   If pTblName==0 
1ce20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e  it means this in
1ce30 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64  dex is generated
1ce40 20 61 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 50   as an implied P
1ce50 52 49 4d 41 52 59 20 4b 45 59 0a 20 20 20 20 2a  RIMARY KEY.    *
1ce60 2a 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65  * or UNIQUE inde
1ce70 78 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  x in a CREATE TA
1ce80 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
1ce90 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a  Since the table.
1cea0 20 20 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20      ** has just 
1ceb0 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74  been created, it
1cec0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
1ced0 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  a and the index 
1cee0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
1cef0 20 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62     ** step can b
1cf00 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a  e skipped..    *
1cf10 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 48  /.    else if( H
1cf20 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c  asRowid(pTab) ||
1cf30 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
1cf40 20 20 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20        Vdbe *v;. 
1cf50 20 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74       char *zStmt
1cf60 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d  ;.      int iMem
1cf70 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1cf80 6d 3b 0a 0a 20 20 20 20 20 20 76 20 3d 20 73 71  m;..      v = sq
1cf90 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1cfa0 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rse);.      if( 
1cfb0 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  v==0 ) goto exit
1cfc0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
1cfd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
1cfe0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
1cff0 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
1d000 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  ;..      /* Crea
1d010 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20  te the rootpage 
1d020 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 75 73  for the index us
1d030 69 6e 67 20 43 72 65 61 74 65 49 6e 64 65 78 2e  ing CreateIndex.
1d040 20 42 75 74 20 62 65 66 6f 72 65 0a 20 20 20 20   But before.    
1d050 20 20 2a 2a 20 64 6f 69 6e 67 20 73 6f 2c 20 63    ** doing so, c
1d060 6f 64 65 20 61 20 4e 6f 6f 70 20 69 6e 73 74 72  ode a Noop instr
1d070 75 63 74 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65  uction and store
1d080 20 69 74 73 20 61 64 64 72 65 73 73 20 69 6e 20   its address in 
1d090 0a 20 20 20 20 20 20 2a 2a 20 49 6e 64 65 78 2e  .      ** Index.
1d0a0 74 6e 75 6d 2e 20 54 68 69 73 20 69 73 20 72 65  tnum. This is re
1d0b0 71 75 69 72 65 64 20 69 6e 20 63 61 73 65 20 74  quired in case t
1d0c0 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 63 74  his index is act
1d0d0 75 61 6c 6c 79 20 61 20 0a 20 20 20 20 20 20 2a  ually a .      *
1d0e0 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e  * PRIMARY KEY an
1d0f0 64 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61  d the table is a
1d100 63 74 75 61 6c 6c 79 20 61 20 57 49 54 48 4f 55  ctually a WITHOU
1d110 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 49  T ROWID table. I
1d120 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  n .      ** that
1d130 20 63 61 73 65 20 74 68 65 20 63 6f 6e 76 65 72   case the conver
1d140 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54  tToWithoutRowidT
1d150 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 20 77  able() routine w
1d160 69 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20 20 20  ill replace.    
1d170 20 20 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69    ** the Noop wi
1d180 74 68 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d  th a Goto to jum
1d190 70 20 6f 76 65 72 20 74 68 65 20 56 44 42 45 20  p over the VDBE 
1d1a0 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
1d1b0 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 70  elow. */.      p
1d1c0 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71  Index->tnum = sq
1d1d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
1d1e0 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20  v, OP_Noop);.   
1d1f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d200 64 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74  dOp3(v, OP_Creat
1d210 65 42 74 72 65 65 2c 20 69 44 62 2c 20 69 4d 65  eBtree, iDb, iMe
1d220 6d 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59  m, BTREE_BLOBKEY
1d230 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 61 74  );..      /* Gat
1d240 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  her the complete
1d250 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
1d260 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
1d270 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a  ent into.      *
1d280 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69  * the zStmt vari
1d290 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20  able.      */.  
1d2a0 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29      if( pStart )
1d2b0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  {.        int n 
1d2c0 3d 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e  = (int)(pParse->
1d2d0 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70  sLastToken.z - p
1d2e0 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73  Name->z) + pPars
1d2f0 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b  e->sLastToken.n;
1d300 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 61  .        if( pNa
1d310 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20  me->z[n-1]==';' 
1d320 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 2f  ) n--;.        /
1d330 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  * A named index 
1d340 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74  with an explicit
1d350 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
1d360 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20  atement */.     
1d370 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
1d380 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43  e3MPrintf(db, "C
1d390 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e  REATE%s INDEX %.
1d3a0 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  *s",.           
1d3b0 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e   onError==OE_Non
1d3c0 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55  e ? "" : " UNIQU
1d3d0 45 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29  E", n, pName->z)
1d3e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1d3f0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74         /* An aut
1d400 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72 65  omatic index cre
1d410 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41 52  ated by a PRIMAR
1d420 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
1d430 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
1d440 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d        /* zStmt =
1d450 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1d460 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20  ""); */.        
1d470 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  zStmt = 0;.     
1d480 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 64 64   }..      /* Add
1d490 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c   an entry in sql
1d4a0 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74  ite_master for t
1d4b0 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 20 20  his index.      
1d4c0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1d4d0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
1d4e0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
1d4f0 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25  INSERT INTO %Q.%
1d500 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27  s VALUES('index'
1d510 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22  ,%Q,%Q,#%d,%Q);"
1d520 2c 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ,.          db->
1d530 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
1d540 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a  e, MASTER_NAME,.
1d550 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78            pIndex
1d560 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
1d570 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a     pTab->zName,.
1d580 20 20 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a            iMem,.
1d590 20 20 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a            zStmt.
1d5a0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
1d5b0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1d5c0 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20  (db, zStmt);..  
1d5d0 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20      /* Fill the 
1d5e0 69 6e 64 65 78 20 77 69 74 68 20 64 61 74 61 20  index with data 
1d5f0 61 6e 64 20 72 65 70 61 72 73 65 20 74 68 65 20  and reparse the 
1d600 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20  schema. Code an 
1d610 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20 20 20  OP_Expire.      
1d620 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ** to invalidate
1d630 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65   all pre-compile
1d640 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
1d650 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1d660 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20   pTblName ){.   
1d670 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
1d680 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
1d690 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20  pIndex, iMem);. 
1d6a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68         sqlite3Ch
1d6b0 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
1d6c0 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  e, iDb);.       
1d6d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
1d6e0 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20  arseSchemaOp(v, 
1d6f0 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
1d700 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1d710 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20 41  db, "name='%q' A
1d720 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22  ND type='index'"
1d730 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  , pIndex->zName)
1d740 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1d750 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d760 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c 20 31 29  OP_Expire, 0, 1)
1d770 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1d780 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1d790 48 65 72 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e  Here(v, pIndex->
1d7a0 74 6e 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  tnum);.    }.  }
1d7b0 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69  ..  /* When addi
1d7c0 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74  ng an index to t
1d7d0 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63  he list of indic
1d7e0 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20  es for a table, 
1d7f0 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61  make.  ** sure a
1d800 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c  ll indices label
1d810 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f  ed OE_Replace co
1d820 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f  me after all tho
1d830 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20  se labeled.  ** 
1d840 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73  OE_Ignore.  This
1d850 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
1d860 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f  r the correct co
1d870 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a 20  nstraint check. 
1d880 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 28   ** processing (
1d890 69 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  in sqlite3Genera
1d8a0 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63  teConstraintChec
1d8b0 6b 73 28 29 29 20 61 73 20 70 61 72 74 20 6f 66  ks()) as part of
1d8c0 0a 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e 64  .  ** UPDATE and
1d8d0 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
1d8e0 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28  ts.  .  */.  if(
1d8f0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c   db->init.busy |
1d900 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b  | pTblName==0 ){
1d910 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72  .    if( onError
1d920 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20  !=OE_Replace || 
1d930 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a  pTab->pIndex==0.
1d940 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62           || pTab
1d950 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ->pIndex->onErro
1d960 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a  r==OE_Replace){.
1d970 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
1d980 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  ext = pTab->pInd
1d990 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  ex;.      pTab->
1d9a0 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b  pIndex = pIndex;
1d9b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d9c0 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20    Index *pOther 
1d9d0 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
1d9e0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74        while( pOt
1d9f0 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f  her->pNext && pO
1da00 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45  ther->pNext->onE
1da10 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
1da20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68   ){.        pOth
1da30 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  er = pOther->pNe
1da40 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
1da50 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
1da60 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
1da70 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70  .      pOther->p
1da80 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20  Next = pIndex;. 
1da90 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20     }.    pIndex 
1daa0 3d 20 30 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20  = 0;.  }.  else 
1dab0 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
1dac0 4a 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65  JECT ){.    asse
1dad0 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  rt( pParse->pNew
1dae0 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20  Index==0 );.    
1daf0 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65  pParse->pNewInde
1db00 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  x = pIndex;.    
1db10 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  pIndex = 0;.  }.
1db20 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62  .  /* Clean up b
1db30 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
1db40 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64  .exit_create_ind
1db50 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  ex:.  if( pIndex
1db60 20 29 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e   ) sqlite3FreeIn
1db70 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
1db80 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
1db90 6c 65 74 65 28 64 62 2c 20 70 50 49 57 68 65 72  lete(db, pPIWher
1dba0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
1dbb0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
1dbc0 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  pList);.  sqlite
1dbd0 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
1dbe0 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  b, pTblName);.  
1dbf0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1dc00 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , zName);.}../*.
1dc10 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65  ** Fill the Inde
1dc20 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72  x.aiRowEst[] arr
1dc30 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20  ay with default 
1dc40 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e  information - in
1dc50 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20  formation.** to 
1dc60 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20  be used when we 
1dc70 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65  have not run the
1dc80 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64   ANALYZE command
1dc90 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74  ..**.** aiRowEst
1dca0 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 64 20  [0] is supposed 
1dcb0 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
1dcc0 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
1dcd0 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  s in the index..
1dce0 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e  ** Since we do n
1dcf0 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31  ot know, guess 1
1dd00 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77   million.  aiRow
1dd10 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74  Est[1] is an est
1dd20 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  imate of the.** 
1dd30 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
1dd40 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
1dd50 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69   match any parti
1dd60 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74  cular value of t
1dd70 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75  he.** first colu
1dd80 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  mn of the index.
1dd90 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73    aiRowEst[2] is
1dda0 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
1ddb0 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
1ddc0 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68   rows that match
1ddd0 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
1dde0 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74  combination of t
1ddf0 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d  he first 2 colum
1de00 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64  ns.** of the ind
1de10 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74  ex.  And so fort
1de20 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61  h.  It must alwa
1de30 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ys be the case t
1de40 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  hat.*.**        
1de50 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d     aiRowEst[N]<=
1de60 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a  aiRowEst[N-1].**
1de70 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77             aiRow
1de80 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20  Est[N]>=1.**.** 
1de90 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c  Apart from that,
1dea0 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20   we have little 
1deb0 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73  to go on besides
1dec0 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f   intuition as to
1ded0 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74  .** how aiRowEst
1dee0 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69  [] should be ini
1def0 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e  tialized.  The n
1df00 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64  umbers generated
1df10 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73   here.** are bas
1df20 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61  ed on typical va
1df30 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63  lues found in ac
1df40 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f  tual indices..*/
1df50 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
1df60 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78  aultRowEst(Index
1df70 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20   *pIdx){.  /*   
1df80 20 20 20 20 20 20 20 20 20 20 20 20 20 31 30 2c               10,
1df90 20 20 39 2c 20 20 38 2c 20 20 37 2c 20 20 36 20    9,  8,  7,  6 
1dfa0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56 61 6c  */.  LogEst aVal
1dfb0 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33  [] = { 33, 32, 3
1dfc0 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c  0, 28, 26 };.  L
1dfd0 6f 67 45 73 74 20 2a 61 20 3d 20 70 49 64 78 2d  ogEst *a = pIdx-
1dfe0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20  >aiRowLogEst;.  
1dff0 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28  int nCopy = MIN(
1e000 41 72 72 61 79 53 69 7a 65 28 61 56 61 6c 29 2c  ArraySize(aVal),
1e010 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b   pIdx->nKeyCol);
1e020 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
1e030 49 6e 64 65 78 65 73 20 77 69 74 68 20 64 65 66  Indexes with def
1e040 61 75 6c 74 20 72 6f 77 20 65 73 74 69 6d 61 74  ault row estimat
1e050 65 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61  es should not ha
1e060 76 65 20 73 74 61 74 31 20 64 61 74 61 20 2a 2f  ve stat1 data */
1e070 0a 20 20 61 73 73 65 72 74 28 20 21 70 49 64 78  .  assert( !pIdx
1e080 2d 3e 68 61 73 53 74 61 74 31 20 29 3b 0a 0a 20  ->hasStat1 );.. 
1e090 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72 73   /* Set the firs
1e0a0 74 20 65 6e 74 72 79 20 28 6e 75 6d 62 65 72 20  t entry (number 
1e0b0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69  of rows in the i
1e0c0 6e 64 65 78 29 20 74 6f 20 74 68 65 20 65 73 74  ndex) to the est
1e0d0 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e 75 6d  imated .  ** num
1e0e0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1e0f0 68 65 20 74 61 62 6c 65 2c 20 6f 72 20 68 61 6c  he table, or hal
1e100 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
1e110 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
1e120 65 0a 20 20 2a 2a 20 66 6f 72 20 61 20 70 61 72  e.  ** for a par
1e130 74 69 61 6c 20 69 6e 64 65 78 2e 20 20 20 42 75  tial index.   Bu
1e140 74 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65  t do not let the
1e150 20 65 73 74 69 6d 61 74 65 20 64 72 6f 70 20 62   estimate drop b
1e160 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a 20 20 61 5b  elow 10. */.  a[
1e170 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  0] = pIdx->pTabl
1e180 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  e->nRowLogEst;. 
1e190 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74   if( pIdx->pPart
1e1a0 49 64 78 57 68 65 72 65 21 3d 30 20 29 20 61 5b  IdxWhere!=0 ) a[
1e1b0 30 5d 20 2d 3d 20 31 30 3b 20 20 61 73 73 65 72  0] -= 10;  asser
1e1c0 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 10==sqlite3Lo
1e1d0 67 45 73 74 28 32 29 20 29 3b 0a 20 20 69 66 28  gEst(2) );.  if(
1e1e0 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20   a[0]<33 ) a[0] 
1e1f0 3d 20 33 33 3b 20 20 20 20 20 20 20 20 20 20 20  = 33;           
1e200 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 33         assert( 3
1e210 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
1e220 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 73  (10) );..  /* Es
1e230 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b 31 5d  timate that a[1]
1e240 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69 73 20   is 10, a[2] is 
1e250 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20 61 5b  9, a[3] is 8, a[
1e260 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20 69 73  4] is 7, a[5] is
1e270 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61 63 68  .  ** 6 and each
1e280 20 73 75 62 73 65 71 75 65 6e 74 20 76 61 6c 75   subsequent valu
1e290 65 20 28 69 66 20 61 6e 79 29 20 69 73 20 35 2e  e (if any) is 5.
1e2a0 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 61    */.  memcpy(&a
1e2b0 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70 79  [1], aVal, nCopy
1e2c0 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 29  *sizeof(LogEst))
1e2d0 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79 2b  ;.  for(i=nCopy+
1e2e0 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79  1; i<=pIdx->nKey
1e2f0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  Col; i++){.    a
1e300 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20 20 20  [i] = 23;       
1e310 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
1e320 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74 65 33  ert( 23==sqlite3
1e330 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20 20 7d  LogEst(5) );.  }
1e340 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73  ..  assert( 0==s
1e350 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20  qlite3LogEst(1) 
1e360 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75  );.  if( IsUniqu
1e370 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 61  eIndex(pIdx) ) a
1e380 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20  [pIdx->nKeyCol] 
1e390 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
1e3a0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
1e3b0 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67  drop an existing
1e3c0 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54   named index.  T
1e3d0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
1e3e0 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52  mplements the DR
1e3f0 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  OP INDEX stateme
1e400 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
1e410 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72  te3DropIndex(Par
1e420 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
1e430 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ist *pName, int 
1e440 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64  ifExists){.  Ind
1e450 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64  ex *pIndex;.  Vd
1e460 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
1e470 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1e480 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
1e490 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1e4a0 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a  >nErr==0 );   /*
1e4b0 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   Never called wi
1e4c0 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20  th prior errors 
1e4d0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
1e4e0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1e4f0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1e500 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73  index;.  }.  ass
1e510 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
1e520 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ==1 );.  if( SQL
1e530 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
1e540 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
1e550 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
1e560 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1e570 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
1e580 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
1e590 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  b, pName->a[0].z
1e5a0 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
1e5b0 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
1e5c0 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
1e5d0 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73  .    if( !ifExis
1e5e0 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts ){.      sqli
1e5f0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1e600 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
1e610 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20  ex: %S", pName, 
1e620 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
1e630 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
1e640 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d  VerifyNamedSchem
1e650 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d  a(pParse, pName-
1e660 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
1e670 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
1e680 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
1e690 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  = 1;.    goto ex
1e6a0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1e6b0 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d   }.  if( pIndex-
1e6c0 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45  >idxType!=SQLITE
1e6d0 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20  _IDXTYPE_APPDEF 
1e6e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1e6f0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1e700 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
1e710 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20   with UNIQUE ". 
1e720 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59       "or PRIMARY
1e730 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
1e740 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  cannot be droppe
1e750 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f  d", 0);.    goto
1e760 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1e770 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
1e780 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
1e790 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70  ex(db, pIndex->p
1e7a0 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66  Schema);.#ifndef
1e7b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1e7c0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
1e7d0 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51     int code = SQ
1e7e0 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b  LITE_DROP_INDEX;
1e7f0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
1e800 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
1e810 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
1e820 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
1e830 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  [iDb].zDbSName;.
1e840 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1e850 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
1e860 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66  BLE(iDb);.    if
1e870 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1e880 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1e890 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20  E_DELETE, zTab, 
1e8a0 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
1e8b0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1e8c0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
1e8d0 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
1e8e0 42 20 26 26 20 69 44 62 20 29 20 63 6f 64 65 20  B && iDb ) code 
1e8f0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
1e900 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
1e910 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1e920 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
1e930 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
1e940 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
1e950 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
1e960 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1e970 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1e980 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
1e990 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
1e9a0 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72  the index and fr
1e9b0 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
1e9c0 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ble */.  v = sql
1e9d0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1e9e0 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
1e9f0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
1ea00 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
1ea10 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
1ea20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
1ea30 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
1ea40 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
1ea50 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e  OM %Q.%s WHERE n
1ea60 61 6d 65 3d 25 51 20 41 4e 44 20 74 79 70 65 3d  ame=%Q AND type=
1ea70 27 69 6e 64 65 78 27 22 2c 0a 20 20 20 20 20 20  'index'",.      
1ea80 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
1ea90 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e  bSName, MASTER_N
1eaa0 41 4d 45 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  AME, pIndex->zNa
1eab0 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  me.    );.    sq
1eac0 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61  lite3ClearStatTa
1ead0 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62  bles(pParse, iDb
1eae0 2c 20 22 69 64 78 22 2c 20 70 49 6e 64 65 78 2d  , "idx", pIndex-
1eaf0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
1eb00 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
1eb10 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
1eb20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61     destroyRootPa
1eb30 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ge(pParse, pInde
1eb40 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
1eb50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1eb60 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49  dOp4(v, OP_DropI
1eb70 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c  ndex, iDb, 0, 0,
1eb80 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
1eb90 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72  0);.  }..exit_dr
1eba0 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69  op_index:.  sqli
1ebb0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1ebc0 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, pName);.}..
1ebd0 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20  /*.** pArray is 
1ebe0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
1ebf0 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73  array of objects
1ec00 2e 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e  . Each object in
1ec10 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73   the.** array is
1ec20 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69   szEntry bytes i
1ec30 6e 20 73 69 7a 65 2e 20 54 68 69 73 20 72 6f 75  n size. This rou
1ec40 74 69 6e 65 20 75 73 65 73 20 73 71 6c 69 74 65  tine uses sqlite
1ec50 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20  3DbRealloc().** 
1ec60 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 61 72  to extend the ar
1ec70 72 61 79 20 73 6f 20 74 68 61 74 20 74 68 65 72  ray so that ther
1ec80 65 20 69 73 20 73 70 61 63 65 20 66 6f 72 20 61  e is space for a
1ec90 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 74 20 74   new object at t
1eca0 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68  he end..**.** Wh
1ecb0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1ecc0 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45   is called, *pnE
1ecd0 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 74 68  ntry contains th
1ece0 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
1ecf0 66 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20 28  f.** the array (
1ed00 69 6e 20 65 6e 74 72 69 65 73 20 2d 20 73 6f 20  in entries - so 
1ed10 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  the allocation i
1ed20 73 20 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20  s ((*pnEntry) * 
1ed30 73 7a 45 6e 74 72 79 29 20 62 79 74 65 73 0a 2a  szEntry) bytes.*
1ed40 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a  * in total)..**.
1ed50 2a 2a 20 49 66 20 74 68 65 20 72 65 61 6c 6c 6f  ** If the reallo
1ed60 63 28 29 20 69 73 20 73 75 63 63 65 73 73 66 75  c() is successfu
1ed70 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f  l (i.e. if no OO
1ed80 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75  M condition occu
1ed90 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63  rs), the.** spac
1eda0 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
1edb0 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69  the new object i
1edc0 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74  s zeroed, *pnEnt
1edd0 72 79 20 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a  ry updated to.**
1ede0 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77   reflect the new
1edf0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
1ee00 61 79 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  ay and a pointer
1ee10 20 74 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f   to the new allo
1ee20 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e  cation.** return
1ee30 65 64 2e 20 2a 70 49 64 78 20 69 73 20 73 65 74  ed. *pIdx is set
1ee40 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
1ee50 20 74 68 65 20 6e 65 77 20 61 72 72 61 79 20 65   the new array e
1ee60 6e 74 72 79 20 69 6e 20 74 68 69 73 20 63 61 73  ntry in this cas
1ee70 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  e..**.** Otherwi
1ee80 73 65 2c 20 69 66 20 74 68 65 20 72 65 61 6c 6c  se, if the reall
1ee90 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a 70 49 64  oc() fails, *pId
1eea0 78 20 69 73 20 73 65 74 20 74 6f 20 2d 31 2c 20  x is set to -1, 
1eeb0 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e 73  *pnEntry remains
1eec0 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  .** unchanged an
1eed0 64 20 61 20 63 6f 70 79 20 6f 66 20 70 41 72 72  d a copy of pArr
1eee0 61 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ay returned..*/.
1eef0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72  void *sqlite3Arr
1ef00 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71  ayAllocate(.  sq
1ef10 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1ef20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  /* Connection to
1ef30 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f   notify of mallo
1ef40 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20  c failures */.  
1ef50 76 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20  void *pArray,   
1ef60 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62    /* Array of ob
1ef70 6a 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65  jects.  Might be
1ef80 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a   reallocated */.
1ef90 20 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20    int szEntry,  
1efa0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65      /* Size of e
1efb0 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  ach object in th
1efc0 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  e array */.  int
1efd0 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f   *pnEntry,     /
1efe0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65  * Number of obje
1eff0 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  cts currently in
1f000 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   use */.  int *p
1f010 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57  Idx         /* W
1f020 72 69 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f  rite the index o
1f030 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72  f a new slot her
1f040 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  e */.){.  char *
1f050 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 2a 70 6e  z;.  int n = *pn
1f060 45 6e 74 72 79 3b 0a 20 20 69 66 28 20 28 6e 20  Entry;.  if( (n 
1f070 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a 20  & (n-1))==0 ){. 
1f080 20 20 20 69 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d     int sz = (n==
1f090 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20 20  0) ? 1 : 2*n;.  
1f0a0 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 73    void *pNew = s
1f0b0 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
1f0c0 64 62 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a 73  db, pArray, sz*s
1f0d0 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28  zEntry);.    if(
1f0e0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
1f0f0 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20    *pIdx = -1;.  
1f100 20 20 20 20 72 65 74 75 72 6e 20 70 41 72 72 61      return pArra
1f110 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72  y;.    }.    pAr
1f120 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ray = pNew;.  }.
1f130 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72    z = (char*)pAr
1f140 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a  ray;.  memset(&z
1f150 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30  [n * szEntry], 0
1f160 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70  , szEntry);.  *p
1f170 49 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e  Idx = n;.  ++*pn
1f180 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20  Entry;.  return 
1f190 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pArray;.}../*.**
1f1a0 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
1f1b0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
1f1c0 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
1f1d0 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
1f1e0 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
1f1f0 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
1f200 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
1f210 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
1f220 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
1f230 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
1f240 73 74 41 70 70 65 6e 64 28 50 61 72 73 65 20 2a  stAppend(Parse *
1f250 70 50 61 72 73 65 2c 20 49 64 4c 69 73 74 20 2a  pParse, IdList *
1f260 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
1f270 6f 6b 65 6e 29 7b 0a 20 20 73 71 6c 69 74 65 33  oken){.  sqlite3
1f280 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1f290 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  b;.  int i;.  if
1f2a0 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
1f2b0 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1f2c0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
1f2d0 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29  , sizeof(IdList)
1f2e0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
1f2f0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
1f300 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20  .  }.  pList->a 
1f310 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
1f320 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 64 62  locate(.      db
1f330 2c 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  ,.      pList->a
1f340 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  ,.      sizeof(p
1f350 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20  List->a[0]),.   
1f360 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a     &pList->nId,.
1f370 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
1f380 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73  if( i<0 ){.    s
1f390 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1f3a0 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
1f3b0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1f3c0 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  .  pList->a[i].z
1f3d0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1f3e0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1f3f0 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 49  pToken);.  if( I
1f400 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
1f410 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  && pList->a[i].z
1f420 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Name ){.    sqli
1f430 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61  te3RenameTokenMa
1f440 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a  p(pParse, (void*
1f450 29 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  )pList->a[i].zNa
1f460 6d 65 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d  me, pToken);.  }
1f470 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
1f480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
1f490 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76   an IdList..*/.v
1f4a0 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73  oid sqlite3IdLis
1f4b0 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
1f4c0 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69  *db, IdList *pLi
1f4d0 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
1f4e0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1f4f0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
1f500 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
1f510 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1f520 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
1f530 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
1f540 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
1f550 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
1f560 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1f570 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b  eeNN(db, pList);
1f580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1f590 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c   the index in pL
1f5a0 69 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74  ist of the ident
1f5b0 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e  ifier named zId.
1f5c0 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69    Return -1.** i
1f5d0 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
1f5e0 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73  int sqlite3IdLis
1f5f0 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70  tIndex(IdList *p
1f600 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  List, const char
1f610 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
1f620 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1f630 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  0 ) return -1;. 
1f640 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1f650 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
1f660 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1f670 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
1f680 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
1f690 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
1f6a0 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
1f6b0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
1f6c0 73 69 7a 65 20 6f 66 20 61 20 53 72 63 4c 69 73  size of a SrcLis
1f6d0 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 54 68 65  t object..** The
1f6e0 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20   SrcList object 
1f6f0 69 73 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  is used to repre
1f700 73 65 6e 74 20 74 68 65 20 46 52 4f 4d 20 63 6c  sent the FROM cl
1f710 61 75 73 65 20 6f 66 20 61 0a 2a 2a 20 53 45 4c  ause of a.** SEL
1f720 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 61  ECT statement, a
1f730 6e 64 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  nd the query pla
1f740 6e 6e 65 72 20 63 61 6e 6e 6f 74 20 64 65 61 6c  nner cannot deal
1f750 20 77 69 74 68 20 6d 6f 72 65 0a 2a 2a 20 74 68   with more.** th
1f760 61 6e 20 36 34 20 74 61 62 6c 65 73 20 69 6e 20  an 64 tables in 
1f770 61 20 6a 6f 69 6e 2e 20 20 53 6f 20 61 6e 79 20  a join.  So any 
1f780 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74 68 61  value larger tha
1f790 6e 20 36 34 20 68 65 72 65 0a 2a 2a 20 69 73 20  n 64 here.** is 
1f7a0 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 6d  sufficient for m
1f7b0 6f 73 74 20 75 73 65 73 2e 20 20 53 6d 61 6c 6c  ost uses.  Small
1f7c0 65 72 20 76 61 6c 75 65 73 2c 20 6c 69 6b 65 20  er values, like 
1f7d0 73 61 79 20 31 30 2c 20 61 72 65 0a 2a 2a 20 61  say 10, are.** a
1f7e0 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 73  ppropriate for s
1f7f0 6d 61 6c 6c 20 61 6e 64 20 6d 65 6d 6f 72 79 2d  mall and memory-
1f800 6c 69 6d 69 74 65 64 20 61 70 70 6c 69 63 61 74  limited applicat
1f810 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ions..*/.#ifndef
1f820 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c   SQLITE_MAX_SRCL
1f830 49 53 54 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  IST.# define SQL
1f840 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 20  ITE_MAX_SRCLIST 
1f850 32 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  200.#endif../*.*
1f860 2a 20 45 78 70 61 6e 64 20 74 68 65 20 73 70 61  * Expand the spa
1f870 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
1f880 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
1f890 73 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20  st object by.** 
1f8a0 63 72 65 61 74 69 6e 67 20 6e 45 78 74 72 61 20  creating nExtra 
1f8b0 6e 65 77 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e  new slots beginn
1f8c0 69 6e 67 20 61 74 20 69 53 74 61 72 74 2e 20 20  ing at iStart.  
1f8d0 69 53 74 61 72 74 20 69 73 20 7a 65 72 6f 20 62  iStart is zero b
1f8e0 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f  ased..** New slo
1f8f0 74 73 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  ts are zeroed..*
1f900 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
1f910 2c 20 73 75 70 70 6f 73 65 20 61 20 53 72 63 4c  , suppose a SrcL
1f920 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f  ist initially co
1f930 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e 74 72 69  ntains two entri
1f940 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61  es: A,B..** To a
1f950 70 70 65 6e 64 20 33 20 6e 65 77 20 65 6e 74 72  ppend 3 new entr
1f960 69 65 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ies onto the end
1f970 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  , do this:.**.**
1f980 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
1f990 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
1f9a0 72 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a  rclist, 3, 2);.*
1f9b0 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 63  *.** After the c
1f9c0 61 6c 6c 20 61 62 6f 76 65 20 69 74 20 77 6f 75  all above it wou
1f9d0 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20  ld contain:  A, 
1f9e0 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c  B, nil, nil, nil
1f9f0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 53 74 61  ..** If the iSta
1fa00 72 74 20 61 72 67 75 6d 65 6e 74 20 68 61 64 20  rt argument had 
1fa10 62 65 65 6e 20 31 20 69 6e 73 74 65 61 64 20 6f  been 1 instead o
1fa20 66 20 32 2c 20 74 68 65 6e 20 74 68 65 20 72 65  f 2, then the re
1fa30 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61  sult.** would ha
1fa40 76 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c  ve been:  A, nil
1fa50 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20  , nil, nil, B.  
1fa60 54 6f 20 70 72 65 70 65 6e 64 20 74 68 65 20 6e  To prepend the n
1fa70 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65  ew slots,.** the
1fa80 20 69 53 74 61 72 74 20 76 61 6c 75 65 20 77 6f   iStart value wo
1fa90 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 72  uld be 0.  The r
1faa0 65 73 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64  esult then would
1fab0 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c  .** be: nil, nil
1fac0 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a  , nil, A, B..**.
1fad0 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
1fae0 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 20  llocation fails 
1faf0 6f 72 20 74 68 65 20 53 72 63 4c 69 73 74 20 62  or the SrcList b
1fb00 65 63 6f 6d 65 73 20 74 6f 6f 20 6c 61 72 67 65  ecomes too large
1fb10 2c 20 6c 65 61 76 65 0a 2a 2a 20 74 68 65 20 6f  , leave.** the o
1fb20 72 69 67 69 6e 61 6c 20 53 72 63 4c 69 73 74 20  riginal SrcList 
1fb30 75 6e 63 68 61 6e 67 65 64 2c 20 72 65 74 75 72  unchanged, retur
1fb40 6e 20 4e 55 4c 4c 2c 20 61 6e 64 20 6c 65 61 76  n NULL, and leav
1fb50 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
1fb60 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 2e  ge.** in pParse.
1fb70 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
1fb80 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
1fb90 67 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ge(.  Parse *pPa
1fba0 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
1fbb0 69 6e 67 20 63 6f 6e 74 65 78 74 20 69 6e 74 6f  ing context into
1fbc0 20 77 68 69 63 68 20 65 72 72 6f 72 73 20 61 72   which errors ar
1fbd0 65 20 72 65 70 6f 72 74 65 64 20 2a 2f 0a 20 20  e reported */.  
1fbe0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
1fbf0 20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c 69 73     /* The SrcLis
1fc00 74 20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65 64  t to be enlarged
1fc10 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
1fc20 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ,        /* Numb
1fc30 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20  er of new slots 
1fc40 74 6f 20 61 64 64 20 74 6f 20 70 53 72 63 2d 3e  to add to pSrc->
1fc50 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74  a[] */.  int iSt
1fc60 61 72 74 20 20 20 20 20 20 20 20 20 2f 2a 20 49  art         /* I
1fc70 6e 64 65 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b  ndex in pSrc->a[
1fc80 5d 20 6f 66 20 66 69 72 73 74 20 6e 65 77 20 73  ] of first new s
1fc90 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lot */.){.  int 
1fca0 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  i;..  /* Sanity 
1fcb0 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c  checking on call
1fcc0 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ing parameters *
1fcd0 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  /.  assert( iSta
1fce0 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  rt>=0 );.  asser
1fcf0 74 28 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a  t( nExtra>=1 );.
1fd00 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d    assert( pSrc!=
1fd10 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1fd20 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72  Start<=pSrc->nSr
1fd30 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  c );..  /* Alloc
1fd40 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ate additional s
1fd50 70 61 63 65 20 69 66 20 6e 65 65 64 65 64 20 2a  pace if needed *
1fd60 2f 0a 20 20 69 66 28 20 28 75 33 32 29 70 53 72  /.  if( (u32)pSr
1fd70 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70  c->nSrc+nExtra>p
1fd80 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  Src->nAlloc ){. 
1fd90 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77     SrcList *pNew
1fda0 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63  ;.    int nAlloc
1fdb0 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2a 32 2b   = pSrc->nSrc*2+
1fdc0 6e 45 78 74 72 61 3b 0a 20 20 20 20 73 71 6c 69  nExtra;.    sqli
1fdd0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1fde0 2d 3e 64 62 3b 0a 0a 20 20 20 20 69 66 28 20 70  ->db;..    if( p
1fdf0 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61  Src->nSrc+nExtra
1fe00 3e 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43  >=SQLITE_MAX_SRC
1fe10 4c 49 53 54 20 29 7b 0a 20 20 20 20 20 20 73 71  LIST ){.      sq
1fe20 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1fe30 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
1fe40 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
1fe50 73 2c 20 6d 61 78 3a 20 25 64 22 2c 0a 20 20 20  s, max: %d",.   
1fe60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe70 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52     SQLITE_MAX_SR
1fe80 43 4c 49 53 54 29 3b 0a 20 20 20 20 20 20 72 65  CLIST);.      re
1fe90 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1fea0 20 20 69 66 28 20 6e 41 6c 6c 6f 63 3e 53 51 4c    if( nAlloc>SQL
1feb0 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 20  ITE_MAX_SRCLIST 
1fec0 29 20 6e 41 6c 6c 6f 63 20 3d 20 53 51 4c 49 54  ) nAlloc = SQLIT
1fed0 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 3b 0a 20  E_MAX_SRCLIST;. 
1fee0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
1fef0 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
1ff00 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Src,.           
1ff10 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63      sizeof(*pSrc
1ff20 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73  ) + (nAlloc-1)*s
1ff30 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d  izeof(pSrc->a[0]
1ff40 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ) );.    if( pNe
1ff50 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  w==0 ){.      as
1ff60 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
1ff70 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
1ff80 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1ff90 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77 3b      pSrc = pNew;
1ffa0 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f  .    pSrc->nAllo
1ffb0 63 20 3d 20 6e 41 6c 6c 6f 63 3b 0a 20 20 7d 0a  c = nAlloc;.  }.
1ffc0 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74  .  /* Move exist
1ffd0 69 6e 67 20 73 6c 6f 74 73 20 74 68 61 74 20 63  ing slots that c
1ffe0 6f 6d 65 20 61 66 74 65 72 20 74 68 65 20 6e 65  ome after the ne
1fff0 77 6c 79 20 69 6e 73 65 72 74 65 64 20 73 6c 6f  wly inserted slo
20000 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74  ts.  ** out of t
20010 68 65 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28  he way */.  for(
20020 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20  i=pSrc->nSrc-1; 
20030 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b  i>=iStart; i--){
20040 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e  .    pSrc->a[i+n
20050 45 78 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61  Extra] = pSrc->a
20060 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d  [i];.  }.  pSrc-
20070 3e 6e 53 72 63 20 2b 3d 20 6e 45 78 74 72 61 3b  >nSrc += nExtra;
20080 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20  ..  /* Zero the 
20090 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  newly allocated 
200a0 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65  slots */.  memse
200b0 74 28 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72  t(&pSrc->a[iStar
200c0 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  t], 0, sizeof(pS
200d0 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61  rc->a[0])*nExtra
200e0 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72  );.  for(i=iStar
200f0 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74  t; i<iStart+nExt
20100 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53  ra; i++){.    pS
20110 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
20120 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
20130 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
20140 72 20 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65  r to the enlarge
20150 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72  d SrcList */.  r
20160 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a  eturn pSrc;.}...
20170 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
20180 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  ew table name to
20190 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
201a0 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
201b0 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20  w SrcList if.** 
201c0 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20  need be.  A new 
201d0 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64  entry is created
201e0 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
201f0 65 76 65 6e 20 69 66 20 70 54 61 62 6c 65 20 69  even if pTable i
20200 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20  s NULL..**.** A 
20210 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72  SrcList is retur
20220 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
20230 74 68 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20  there is an OOM 
20240 65 72 72 6f 72 20 6f 72 20 69 66 20 74 68 65 0a  error or if the.
20250 2a 2a 20 53 72 63 4c 69 73 74 20 67 72 6f 77 73  ** SrcList grows
20260 20 74 6f 20 6c 61 72 67 65 2e 20 20 54 68 65 20   to large.  The 
20270 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c  returned.** SrcL
20280 69 73 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ist might be the
20290 20 73 61 6d 65 20 61 73 20 74 68 65 20 53 72 63   same as the Src
202a0 4c 69 73 74 20 74 68 61 74 20 77 61 73 20 69 6e  List that was in
202b0 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20  put or it might 
202c0 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e  be.** a new one.
202d0 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f    If an OOM erro
202e0 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74  r does occurs, t
202f0 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61  hen the prior va
20300 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20  lue of pList.** 
20310 74 68 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f  that is input to
20320 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
20330 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66   automatically f
20340 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  reed..**.** If p
20350 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  Database is not 
20360 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  null, it means t
20370 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61  hat the table ha
20380 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a  s an optional.**
20390 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70   database name p
203a0 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69  refix.  Like thi
203b0 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61  s:  "database.ta
203c0 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61  ble".  The pData
203d0 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  base.** points t
203e0 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  o the table name
203f0 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20   and the pTable 
20400 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61  points to the da
20410 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20  tabase name..** 
20420 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  The SrcList.a[].
20430 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66  zName field is f
20440 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74  illed with the t
20450 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20  able name which 
20460 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72  might.** come fr
20470 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44  om pTable (if pD
20480 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29  atabase is NULL)
20490 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61   or from pDataba
204a0 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74  se.  .** SrcList
204b0 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69  .a[].zDatabase i
204c0 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
204d0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
204e0 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20  from pTable,.** 
204f0 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20  or with NULL if 
20500 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73  no database is s
20510 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
20520 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
20530 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69  if call like thi
20540 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
20550 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
20560 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a  ppend(D,A,B,0);.
20570 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20  **.** Then B is 
20580 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  a table name and
20590 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
205a0 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65  me is unspecifie
205b0 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a  d.  If called.**
205c0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
205d0 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
205e0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
205f0 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54  ,A,B,C);.**.** T
20600 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62  hen C is the tab
20610 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73  le name and B is
20620 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
20630 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64 65 66  me.  If C is def
20640 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20  ined.** then so 
20650 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72 20  is B.  In other 
20660 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72 20  words, we never 
20670 68 61 76 65 20 61 20 63 61 73 65 20 77 68 65 72  have a case wher
20680 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
20690 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
206a0 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a  ppend(D,A,0,C);.
206b0 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c  **.** Both pTabl
206c0 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 20  e and pDatabase 
206d0 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62  are assumed to b
206e0 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79 20  e quoted.  They 
206f0 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20  are dequoted.** 
20700 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64 64  before being add
20710 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73  ed to the SrcLis
20720 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  t..*/.SrcList *s
20730 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
20740 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  end(.  Parse *pP
20750 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
20760 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2c 20 69  rsing context, i
20770 6e 20 77 68 69 63 68 20 65 72 72 6f 72 73 20 61  n which errors a
20780 72 65 20 72 65 70 6f 72 74 65 64 20 2a 2f 0a 20  re reported */. 
20790 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c   SrcList *pList,
207a0 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74       /* Append t
207b0 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20  o this SrcList. 
207c0 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e  NULL creates a n
207d0 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  ew SrcList */.  
207e0 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
207f0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
20800 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65  append */.  Toke
20810 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20 20 20  n *pDatabase    
20820 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20 74  /* Database of t
20830 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  he table */.){. 
20840 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
20850 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
20860 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73  qlite3 *db;.  as
20870 73 65 72 74 28 20 70 44 61 74 61 62 61 73 65 3d  sert( pDatabase=
20880 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20  =0 || pTable!=0 
20890 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61  );  /* Cannot ha
208a0 76 65 20 43 20 77 69 74 68 6f 75 74 20 42 20 2a  ve C without B *
208b0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  /.  assert( pPar
208c0 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  se!=0 );.  asser
208d0 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30  t( pParse->db!=0
208e0 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
208f0 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69  e->db;.  if( pLi
20900 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
20910 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
20920 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73 65  llocRawNN(pParse
20930 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 53 72 63  ->db, sizeof(Src
20940 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
20950 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
20960 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
20970 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 20  >nAlloc = 1;.   
20980 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 3d 20 31   pList->nSrc = 1
20990 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4c  ;.    memset(&pL
209a0 69 73 74 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73 69  ist->a[0], 0, si
209b0 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
209c0 29 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  ));.    pList->a
209d0 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [0].iCursor = -1
209e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53  ;.  }else{.    S
209f0 72 63 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 73  rcList *pNew = s
20a00 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
20a10 61 72 67 65 28 70 50 61 72 73 65 2c 20 70 4c 69  arge(pParse, pLi
20a20 73 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53  st, 1, pList->nS
20a30 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  rc);.    if( pNe
20a40 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  w==0 ){.      sq
20a50 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
20a60 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
20a70 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
20a80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20a90 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pList = pNew;.  
20aa0 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20    }.  }.  pItem 
20ab0 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
20ac0 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66  t->nSrc-1];.  if
20ad0 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70  ( pDatabase && p
20ae0 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29  Database->z==0 )
20af0 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  {.    pDatabase 
20b00 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
20b10 44 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20  Database ){.    
20b20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
20b30 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
20b40 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73  ken(db, pDatabas
20b50 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  e);.    pItem->z
20b60 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
20b70 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
20b80 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d  db, pTable);.  }
20b90 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 6d 2d  else{.    pItem-
20ba0 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
20bb0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
20bc0 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  , pTable);.    p
20bd0 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
20be0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
20bf0 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
20c00 2a 20 41 73 73 69 67 6e 20 56 64 62 65 43 75 72  * Assign VdbeCur
20c10 73 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  sor index number
20c20 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20  s to all tables 
20c30 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a  in a SrcList.*/.
20c40 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
20c50 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
20c60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
20c70 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
20c80 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
20c90 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
20ca0 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74  *pItem;.  assert
20cb0 28 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73 65  (pList || pParse
20cc0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
20cd0 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  ed );.  if( pLis
20ce0 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
20cf0 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
20d00 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
20d10 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
20d20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
20d30 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72  >iCursor>=0 ) br
20d40 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  eak;.      pItem
20d50 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72  ->iCursor = pPar
20d60 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
20d70 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
20d80 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
20d90 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
20da0 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
20db0 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  se, pItem->pSele
20dc0 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20  ct->pSrc);.     
20dd0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
20de0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
20df0 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69  entire SrcList i
20e00 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73  ncluding all its
20e10 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a   substructure..*
20e20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
20e30 63 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  cListDelete(sqli
20e40 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74  te3 *db, SrcList
20e50 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
20e60 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  i;.  struct SrcL
20e70 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
20e80 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
20e90 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
20ea0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
20eb0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  i=0; i<pList->nS
20ec0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
20ed0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
20ee0 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
20ef0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
20f00 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
20f10 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
20f20 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
20f30 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41  ee(db, pItem->zA
20f40 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lias);.    if( p
20f50 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
20f60 65 64 42 79 20 29 20 73 71 6c 69 74 65 33 44 62  edBy ) sqlite3Db
20f70 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
20f80 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a  u1.zIndexedBy);.
20f90 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
20fa0 67 2e 69 73 54 61 62 46 75 6e 63 20 29 20 73 71  g.isTabFunc ) sq
20fb0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
20fc0 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75  ete(db, pItem->u
20fd0 31 2e 70 46 75 6e 63 41 72 67 29 3b 0a 20 20 20  1.pFuncArg);.   
20fe0 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
20ff0 62 6c 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ble(db, pItem->p
21000 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Tab);.    sqlite
21010 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
21020 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
21030 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
21040 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  prDelete(db, pIt
21050 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71  em->pOn);.    sq
21060 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
21070 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73  e(db, pItem->pUs
21080 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ing);.  }.  sqli
21090 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
210a0 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
210b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
210c0 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
210d0 61 72 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e  arser to add a n
210e0 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a  ew term to the.*
210f0 2a 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69  * end of a growi
21100 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ng FROM clause. 
21110 20 54 68 65 20 22 70 22 20 70 61 72 61 6d 65 74   The "p" paramet
21120 65 72 20 69 73 20 74 68 65 20 70 61 72 74 20 6f  er is the part o
21130 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c  f.** the FROM cl
21140 61 75 73 65 20 74 68 61 74 20 68 61 73 20 61 6c  ause that has al
21150 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74  ready been const
21160 72 75 63 74 65 64 2e 20 20 22 70 22 20 69 73 20  ructed.  "p" is 
21170 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20  NULL.** if this 
21180 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72  is the first ter
21190 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  m of the FROM cl
211a0 61 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e  ause.  pTable an
211b0 64 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61  d pDatabase.** a
211c0 72 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  re the name of t
211d0 68 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74  he table and dat
211e0 61 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74  abase named in t
211f0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
21200 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73  erm..** pDatabas
21210 65 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  e is NULL if the
21220 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71   database name q
21230 75 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73  ualifier is miss
21240 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75  ing - the.** usu
21250 61 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68 65  al case.  If the
21260 20 74 65 72 6d 20 68 61 73 20 61 6e 20 61 6c 69   term has an ali
21270 61 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20  as, then pAlias 
21280 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
21290 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49   alias token.  I
212a0 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20  f the term is a 
212b0 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70  subquery, then p
212c0 53 75 62 71 75 65 72 79 20 69 73 20 74 68 65 0a  Subquery is the.
212d0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
212e0 65 6e 74 20 74 68 61 74 20 74 68 65 20 73 75 62  ent that the sub
212f0 71 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20  query encodes.  
21300 54 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a  The pTable and.*
21310 2a 20 70 44 61 74 61 62 61 73 65 20 70 61 72 61  * pDatabase para
21320 6d 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20  meters are NULL 
21330 66 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e 20  for subqueries. 
21340 20 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73   The pOn and pUs
21350 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ing.** parameter
21360 73 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  s are the conten
21370 74 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20  t of the ON and 
21380 55 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a  USING clauses..*
21390 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65  *.** Return a ne
213a0 77 20 53 72 63 4c 69 73 74 20 77 68 69 63 68 20  w SrcList which 
213b0 65 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20 46  encodes is the F
213c0 52 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77  ROM with the new
213d0 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a  .** term added..
213e0 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
213f0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
21400 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73  FromTerm(.  Pars
21410 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
21420 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
21430 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
21440 69 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ist *p,         
21450 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
21460 70 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  part of the FROM
21470 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20   clause already 
21480 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  seen */.  Token 
21490 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20  *pTable,        
214a0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
214b0 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f   table to add to
214c0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
214d0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
214e0 74 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a  tabase,       /*
214f0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
21500 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
21510 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b   pTable */.  Tok
21520 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20  en *pAlias,     
21530 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
21540 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
21550 68 65 20 41 53 20 73 75 62 65 78 70 72 65 73 73  he AS subexpress
21560 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
21570 2a 70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20  *pSubquery,     
21580 20 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20 75   /* A subquery u
21590 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  sed in place of 
215a0 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  a table name */.
215b0 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20    Expr *pOn,    
215c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
215d0 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
215e0 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74  join */.  IdList
215f0 20 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20 20   *pUsing        
21600 20 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63    /* The USING c
21610 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20  lause of a join 
21620 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
21630 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
21640 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
21650 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
21660 20 20 69 66 28 20 21 70 20 26 26 20 28 70 4f 6e    if( !p && (pOn
21670 20 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a 20   || pUsing) ){. 
21680 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
21690 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4a 4f  sg(pParse, "a JO
216a0 49 4e 20 63 6c 61 75 73 65 20 69 73 20 72 65 71  IN clause is req
216b0 75 69 72 65 64 20 62 65 66 6f 72 65 20 25 73 22  uired before %s"
216c0 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f 20  , .      (pOn ? 
216d0 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29 0a  "ON" : "USING").
216e0 20 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20      );.    goto 
216f0 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f  append_from_erro
21700 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c  r;.  }.  p = sql
21710 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
21720 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70 54 61  d(pParse, p, pTa
21730 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b  ble, pDatabase);
21740 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
21750 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66     goto append_f
21760 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  rom_error;.  }. 
21770 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 72 63   assert( p->nSrc
21780 3e 30 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20  >0 );.  pItem = 
21790 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d  &p->a[p->nSrc-1]
217a0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 61  ;.  assert( (pTa
217b0 62 6c 65 3d 3d 30 29 3d 3d 28 70 44 61 74 61 62  ble==0)==(pDatab
217c0 61 73 65 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73  ase==0) );.  ass
217d0 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  ert( pItem->zNam
217e0 65 3d 3d 30 20 7c 7c 20 70 44 61 74 61 62 61 73  e==0 || pDatabas
217f0 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 49 4e  e!=0 );.  if( IN
21800 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 26  _RENAME_OBJECT &
21810 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29  & pItem->zName )
21820 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 6f  {.    Token *pTo
21830 6b 65 6e 20 3d 20 28 41 4c 57 41 59 53 28 70 44  ken = (ALWAYS(pD
21840 61 74 61 62 61 73 65 29 20 26 26 20 70 44 61 74  atabase) && pDat
21850 61 62 61 73 65 2d 3e 7a 29 20 3f 20 70 44 61 74  abase->z) ? pDat
21860 61 62 61 73 65 20 3a 20 70 54 61 62 6c 65 3b 0a  abase : pTable;.
21870 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d      sqlite3Renam
21880 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65  eTokenMap(pParse
21890 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20  , pItem->zName, 
218a0 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 61  pToken);.  }.  a
218b0 73 73 65 72 74 28 20 70 41 6c 69 61 73 21 3d 30  ssert( pAlias!=0
218c0 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73   );.  if( pAlias
218d0 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d  ->n ){.    pItem
218e0 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->zAlias = sqlit
218f0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
21900 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d  db, pAlias);.  }
21910 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  .  pItem->pSelec
21920 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20  t = pSubquery;. 
21930 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f   pItem->pOn = pO
21940 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69  n;.  pItem->pUsi
21950 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72  ng = pUsing;.  r
21960 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e  eturn p;.. appen
21970 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20  d_from_error:.  
21980 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
21990 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
219a0 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20  ete(db, pOn);.  
219b0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
219c0 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29 3b  ete(db, pUsing);
219d0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
219e0 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 71  Delete(db, pSubq
219f0 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20  uery);.  return 
21a00 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
21a10 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72  an INDEXED BY or
21a20 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
21a30 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73 74 20  use to the most 
21a40 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 0a  recently added .
21a50 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ** element of th
21a60 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 70 61  e source-list pa
21a70 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
21a80 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
21a90 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
21aa0 69 73 74 49 6e 64 65 78 65 64 42 79 28 50 61 72  istIndexedBy(Par
21ab0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
21ac0 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70  ist *p, Token *p
21ad0 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20 61 73  IndexedBy){.  as
21ae0 73 65 72 74 28 20 70 49 6e 64 65 78 65 64 42 79  sert( pIndexedBy
21af0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 20 26  !=0 );.  if( p &
21b00 26 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3e  & pIndexedBy->n>
21b10 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
21b20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
21b30 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  tem;.    assert(
21b40 20 70 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20   p->nSrc>0 );.  
21b50 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b    pItem = &p->a[
21b60 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  p->nSrc-1];.    
21b70 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66  assert( pItem->f
21b80 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  g.notIndexed==0 
21b90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
21ba0 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
21bb0 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61  edBy==0 );.    a
21bc0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
21bd0 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b  .isTabFunc==0 );
21be0 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 65  .    if( pIndexe
21bf0 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49  dBy->n==1 && !pI
21c00 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20  ndexedBy->z ){. 
21c10 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49       /* A "NOT I
21c20 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65 20 77  NDEXED" clause w
21c30 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65 65  as supplied. See
21c40 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20 20   parse.y .      
21c50 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e  ** construct "in
21c60 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20 64  dexed_opt" for d
21c70 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20  etails. */.     
21c80 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e   pItem->fg.notIn
21c90 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  dexed = 1;.    }
21ca0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
21cb0 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
21cc0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
21cd0 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
21ce0 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b  db, pIndexedBy);
21cf0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
21d00 2e 69 73 49 6e 64 65 78 65 64 42 79 20 3d 20 31  .isIndexedBy = 1
21d10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
21d20 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 6c 69 73  *.** Add the lis
21d30 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  t of function ar
21d40 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 53  guments to the S
21d50 72 63 4c 69 73 74 20 65 6e 74 72 79 20 66 6f 72  rcList entry for
21d60 20 61 0a 2a 2a 20 74 61 62 6c 65 2d 76 61 6c 75   a.** table-valu
21d70 65 64 2d 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ed-function..*/.
21d80 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
21d90 69 73 74 46 75 6e 63 41 72 67 73 28 50 61 72 73  istFuncArgs(Pars
21da0 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
21db0 73 74 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20  st *p, ExprList 
21dc0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70  *pList){.  if( p
21dd0 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53   ){.    struct S
21de0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
21df0 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53  em = &p->a[p->nS
21e00 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  rc-1];.    asser
21e10 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74  t( pItem->fg.not
21e20 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20  Indexed==0 );.  
21e30 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
21e40 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 3d  >fg.isIndexedBy=
21e50 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
21e60 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61  ( pItem->fg.isTa
21e70 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  bFunc==0 );.    
21e80 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  pItem->u1.pFuncA
21e90 72 67 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  rg = pList;.    
21ea0 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pItem->fg.isTabF
21eb0 75 6e 63 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  unc = 1;.  }else
21ec0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
21ed0 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
21ee0 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a  se->db, pList);.
21ef0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
21f00 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20  n building up a 
21f10 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
21f20 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a  he parser, the j
21f30 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  oin operator.** 
21f40 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74  is initially att
21f50 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
21f60 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20  t operand.  But 
21f70 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
21f80 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68  or.** expects th
21f90 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
21fa0 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67  to be on the rig
21fb0 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  ht operand.  Thi
21fc0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69  s routine.** Shi
21fd0 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65  fts all join ope
21fe0 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74  rators from left
21ff0 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e   to right for an
22000 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20   entire FROM.** 
22010 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78  clause..**.** Ex
22020 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74  ample: Suppose t
22030 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20  he join is like 
22040 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
22050 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20        A natural 
22060 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a  cross join B.**.
22070 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  ** The operator 
22080 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73  is "natural cros
22090 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20  s join".  The A 
220a0 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61  and B operands a
220b0 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  re stored.** in 
220c0 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61  p->a[0] and p->a
220d0 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c  [1], respectivel
220e0 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  y.  The parser i
220f0 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20  nitially stores 
22100 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20  the.** operator 
22110 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f  with A.  This ro
22120 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68 61  utine shifts tha
22130 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20  t operator over 
22140 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  to B..*/.void sq
22150 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66  lite3SrcListShif
22160 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73  tJoinType(SrcLis
22170 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  t *p){.  if( p )
22180 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
22190 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31   for(i=p->nSrc-1
221a0 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20  ; i>0; i--){.   
221b0 20 20 20 70 2d 3e 61 5b 69 5d 2e 66 67 2e 6a 6f     p->a[i].fg.jo
221c0 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d  intype = p->a[i-
221d0 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a  1].fg.jointype;.
221e0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30      }.    p->a[0
221f0 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  ].fg.jointype = 
22200 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
22210 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
22220 64 65 20 66 6f 72 20 61 20 42 45 47 49 4e 20 73  de for a BEGIN s
22230 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
22240 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72  d sqlite3BeginTr
22250 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
22260 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70  *pParse, int typ
22270 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
22280 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
22290 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74  int i;..  assert
222a0 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
222b0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
222c0 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
222d0 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
222e0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
222f0 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
22300 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c  ACTION, "BEGIN",
22310 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65   0, 0) ){.    re
22320 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  turn;.  }.  v = 
22330 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
22340 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76  Parse);.  if( !v
22350 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
22360 20 74 79 70 65 3d 3d 54 4b 5f 49 4d 4d 45 44 49   type==TK_IMMEDI
22370 41 54 45 20 7c 7c 20 74 79 70 65 3d 3d 54 4b 5f  ATE || type==TK_
22380 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
22390 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
223a0 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
223b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
223c0 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  p2(v, OP_Transac
223d0 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d  tion, i, (type==
223e0 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29  TK_EXCLUSIVE)+1)
223f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22400 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
22410 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  i);.    }.  }.  
22420 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22430 33 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  3(v, OP_AutoComm
22440 69 74 2c 20 30 2c 20 30 2c 20 28 74 79 70 65 3d  it, 0, 0, (type=
22450 3d 54 4b 5f 43 4f 4e 43 55 52 52 45 4e 54 29 29  =TK_CONCURRENT))
22460 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
22470 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f  ate VDBE code fo
22480 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f  r a COMMIT or RO
22490 4c 4c 42 41 43 4b 20 73 74 61 74 65 6d 65 6e 74  LLBACK statement
224a0 2e 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 52 4f  ..** Code for RO
224b0 4c 4c 42 41 43 4b 20 69 73 20 67 65 6e 65 72 61  LLBACK is genera
224c0 74 65 64 20 69 66 20 65 54 79 70 65 3d 3d 54 4b  ted if eType==TK
224d0 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20 4f 74 68 65  _ROLLBACK.  Othe
224e0 72 77 69 73 65 0a 2a 2a 20 63 6f 64 65 20 69 73  rwise.** code is
224f0 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 61   generated for a
22500 20 43 4f 4d 4d 49 54 2e 0a 2a 2f 0a 76 6f 69 64   COMMIT..*/.void
22510 20 73 71 6c 69 74 65 33 45 6e 64 54 72 61 6e 73   sqlite3EndTrans
22520 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
22530 61 72 73 65 2c 20 69 6e 74 20 65 54 79 70 65 29  arse, int eType)
22540 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  {.  Vdbe *v;.  i
22550 6e 74 20 69 73 52 6f 6c 6c 62 61 63 6b 3b 0a 0a  nt isRollback;..
22560 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
22570 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
22580 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29   pParse->db!=0 )
22590 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ;.  assert( eTyp
225a0 65 3d 3d 54 4b 5f 43 4f 4d 4d 49 54 20 7c 7c 20  e==TK_COMMIT || 
225b0 65 54 79 70 65 3d 3d 54 4b 5f 45 4e 44 20 7c 7c  eType==TK_END ||
225c0 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42   eType==TK_ROLLB
225d0 41 43 4b 20 29 3b 0a 20 20 69 73 52 6f 6c 6c 62  ACK );.  isRollb
225e0 61 63 6b 20 3d 20 65 54 79 70 65 3d 3d 54 4b 5f  ack = eType==TK_
225f0 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 69 66 28 20  ROLLBACK;.  if( 
22600 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
22610 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
22620 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 0a 20 20  TRANSACTION, .  
22630 20 20 20 20 20 69 73 52 6f 6c 6c 62 61 63 6b 20       isRollback 
22640 3f 20 22 52 4f 4c 4c 42 41 43 4b 22 20 3a 20 22  ? "ROLLBACK" : "
22650 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29  COMMIT", 0, 0) )
22660 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
22670 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  }.  v = sqlite3G
22680 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
22690 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
226a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
226b0 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
226c0 74 2c 20 31 2c 20 69 73 52 6f 6c 6c 62 61 63 6b  t, 1, isRollback
226d0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
226e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
226f0 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
22700 61 72 73 65 72 20 77 68 65 6e 20 69 74 20 70 61  arser when it pa
22710 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74  rses a command t
22720 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c  o create,.** rel
22730 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
22740 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69 6e   an SQL savepoin
22750 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  t. .*/.void sqli
22760 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61 72  te3Savepoint(Par
22770 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
22780 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  op, Token *pName
22790 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
227a0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
227b0 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
227c0 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
227d0 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56  ( zName ){.    V
227e0 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
227f0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
22800 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22810 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
22820 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ON.    static co
22830 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  nst char * const
22840 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e   az[] = { "BEGIN
22850 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22 52  ", "RELEASE", "R
22860 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20  OLLBACK" };.    
22870 61 73 73 65 72 74 28 20 21 53 41 56 45 50 4f 49  assert( !SAVEPOI
22880 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56 45  NT_BEGIN && SAVE
22890 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31  POINT_RELEASE==1
228a0 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   && SAVEPOINT_RO
228b0 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e  LLBACK==2 );.#en
228c0 64 69 66 0a 20 20 20 20 69 66 28 20 21 76 20 7c  dif.    if( !v |
228d0 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  | sqlite3AuthChe
228e0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
228f0 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b  E_SAVEPOINT, az[
22900 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29  op], zName, 0) )
22910 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
22920 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
22930 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
22940 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
22950 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22960 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f  Op4(v, OP_Savepo
22970 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a  int, op, 0, 0, z
22980 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Name, P4_DYNAMIC
22990 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
229a0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54 45  Make sure the TE
229b0 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  MP database is o
229c0 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c  pen and availabl
229d0 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75  e for use.  Retu
229e0 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
229f0 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61   of errors.  Lea
22a00 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  ve any error mes
22a10 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50 61  sages in the pPa
22a20 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
22a30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65  /.int sqlite3Ope
22a40 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50 61  nTempDatabase(Pa
22a50 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
22a60 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
22a70 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
22a80 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d  db->aDb[1].pBt==
22a90 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78  0 && !pParse->ex
22aa0 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74  plain ){.    int
22ab0 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65 20 2a   rc;.    Btree *
22ac0 70 42 74 3b 0a 20 20 20 20 73 74 61 74 69 63 20  pBt;.    static 
22ad0 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
22ae0 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  = .          SQL
22af0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
22b00 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  TE |.          S
22b10 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
22b20 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
22b30 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
22b40 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  IVE |.          
22b50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
22b60 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20  TEONCLOSE |.    
22b70 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
22b80 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20  N_TEMP_DB;..    
22b90 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
22ba0 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20  eOpen(db->pVfs, 
22bb0 30 2c 20 64 62 2c 20 26 70 42 74 2c 20 30 2c 20  0, db, &pBt, 0, 
22bc0 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  flags);.    if( 
22bd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22be0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
22bf0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
22c00 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61  unable to open a
22c10 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
22c20 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66  ase ".        "f
22c30 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ile for storing 
22c40 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
22c50 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ");.      pParse
22c60 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
22c70 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
22c80 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  .    db->aDb[1].
22c90 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 61  pBt = pBt;.    a
22ca0 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31  ssert( db->aDb[1
22cb0 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ].pSchema );.   
22cc0 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   if( SQLITE_NOME
22cd0 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53  M==sqlite3BtreeS
22ce0 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20  etPageSize(pBt, 
22cf0 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
22d00 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20 20  , -1, 0) ){.    
22d10 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
22d20 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74  t(db);.      ret
22d30 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
22d40 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
22d50 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  /*.** Record the
22d60 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 73   fact that the s
22d70 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69 6c  chema cookie wil
22d80 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 76 65 72  l need to be ver
22d90 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61 74  ified.** for dat
22da0 61 62 61 73 65 20 69 44 62 2e 20 20 54 68 65 20  abase iDb.  The 
22db0 63 6f 64 65 20 74 6f 20 61 63 74 75 61 6c 6c 79  code to actually
22dc0 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
22dd0 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c  ma cookie.** wil
22de0 6c 20 6f 63 63 75 72 20 61 74 20 74 68 65 20 65  l occur at the e
22df0 6e 64 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65  nd of the top-le
22e00 76 65 6c 20 56 44 42 45 20 61 6e 64 20 77 69 6c  vel VDBE and wil
22e10 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  l be generated.*
22e20 2a 20 6c 61 74 65 72 2c 20 62 79 20 73 71 6c 69  * later, by sqli
22e30 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28  te3FinishCoding(
22e40 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
22e50 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
22e60 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
22e70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61  , int iDb){.  Pa
22e80 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
22e90 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
22ea0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a  level(pParse);..
22eb0 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
22ec0 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e   && iDb<pParse->
22ed0 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
22ee0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
22ef0 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30  >aDb[iDb].pBt!=0
22f00 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20   || iDb==1 );.  
22f10 61 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49  assert( iDb<SQLI
22f20 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b  TE_MAX_ATTACHED+
22f30 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  2 );.  assert( s
22f40 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
22f50 78 48 65 6c 64 28 70 50 61 72 73 65 2d 3e 64 62  xHeld(pParse->db
22f60 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 69  , iDb, 0) );.  i
22f70 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 54  f( DbMaskTest(pT
22f80 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d  oplevel->cookieM
22f90 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20 29 7b 0a  ask, iDb)==0 ){.
22fa0 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54      DbMaskSet(pT
22fb0 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d  oplevel->cookieM
22fc0 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 20 20 69  ask, iDb);.    i
22fd0 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
22fe0 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
22ff0 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65     sqlite3OpenTe
23000 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f 70 6c  mpDatabase(pTopl
23010 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  evel);.    }.  }
23020 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67  .}../*.** If arg
23030 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c  ument zDb is NUL
23040 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c  L, then call sql
23050 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
23060 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63 68 20  hema() for each 
23070 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
23080 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65  abase. Otherwise
23090 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20  , invoke it for 
230a0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
230b0 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ed zDb only..*/.
230c0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
230d0 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d  VerifyNamedSchem
230e0 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  a(Parse *pParse,
230f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
23100 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
23110 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
23120 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
23130 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
23140 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  +){.    Db *pDb 
23150 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
23160 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20     if( pDb->pBt 
23170 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73  && (!zDb || 0==s
23180 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
23190 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65  b, pDb->zDbSName
231a0 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  )) ){.      sqli
231b0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
231c0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a  ema(pParse, i);.
231d0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
231e0 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
231f0 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61   code that prepa
23200 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e  res for doing an
23210 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a   operation that.
23220 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
23230 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
23240 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
23250 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72   starts a new tr
23260 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20  ansaction if we 
23270 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
23280 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e  within.** a tran
23290 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20  saction.  If we 
232a0 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68  are already with
232b0 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
232c0 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f  , then a checkpo
232d0 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66  int.** is set if
232e0 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e   the setStatemen
232f0 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
23300 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69  rue.  A checkpoi
23310 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nt should.** be 
23320 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f  set for operatio
23330 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61  ns that might fa
23340 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e  il (due to a con
23350 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66  straint) part of
23360 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f  .** the way thro
23370 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69  ugh and which wi
23380 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20  ll need to undo 
23390 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68  some writes with
233a0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a  out having to.**
233b0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68   rollback the wh
233c0 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ole transaction.
233d0 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73    For operations
233e0 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74   where all const
233f0 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65  raints.** can be
23400 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   checked before 
23410 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20  any changes are 
23420 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
23430 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65  base, it is neve
23440 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74  r.** necessary t
23450 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61  o undo a write a
23460 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  nd the checkpoin
23470 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
23480 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
23490 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
234a0 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
234b0 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74  Parse, int setSt
234c0 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62  atement, int iDb
234d0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
234e0 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
234f0 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
23500 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  rse);.  sqlite3C
23510 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
23520 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
23530 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65  DbMaskSet(pTople
23540 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c 20  vel->writeMask, 
23550 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  iDb);.  pTopleve
23560 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  l->isMultiWrite 
23570 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b  |= setStatement;
23580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
23590 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  te that the stat
235a0 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20  ement currently 
235b0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
235c0 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a 2a  on might write.*
235d0 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * more than one 
235e0 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a 20  entry (example: 
235f0 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77  deleting one row
23600 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20   then inserting 
23610 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65  another,.** inse
23620 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72  rting multiple r
23630 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c 20  ows in a table, 
23640 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72  or inserting a r
23650 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74  ow and index ent
23660 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20  ries.).** If an 
23670 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66 74  abort occurs aft
23680 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65  er some of these
23690 20 77 72 69 74 65 73 20 68 61 76 65 20 63 6f 6d   writes have com
236a0 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74 20  pleted, then it 
236b0 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73  will.** be neces
236c0 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68 65  sary to undo the
236d0 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74 65   completed write
236e0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
236f0 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61 72  e3MultiWrite(Par
23700 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50  se *pParse){.  P
23710 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
23720 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
23730 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
23740 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d    pToplevel->isM
23750 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d  ultiWrite = 1;.}
23760 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64  ../* .** The cod
23770 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c  e generator call
23780 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
23790 66 20 69 73 20 64 69 73 63 6f 76 65 72 73 20 74  f is discovers t
237a0 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73  hat it is.** pos
237b0 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20 61  sible to abort a
237c0 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f 72   statement prior
237d0 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20   to completion. 
237e0 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a   In order to .**
237f0 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61 62   perform this ab
23800 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72 72  ort without corr
23810 75 70 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  upting the datab
23820 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ase, we need to 
23830 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68 61  make.** sure tha
23840 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
23850 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20  is protected by 
23860 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
23870 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  saction..**.** T
23880 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f  echnically, we o
23890 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74 20  nly need to set 
238a0 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c 61  the mayAbort fla
238b0 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75  g if the.** isMu
238c0 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20 77 61  ltiWrite flag wa
238d0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74  s previously set
238e0 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 74 69  .  There is a ti
238f0 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
23900 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 61   such that the a
23910 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72 20  bort must occur 
23920 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69 77  after the multiw
23930 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b 65  rite.  This make
23940 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d  s.** some statem
23950 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74  ents involving t
23960 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c  he REPLACE confl
23970 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
23980 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61  lgorithm.** go a
23990 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e 20   little faster. 
239a0 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76 61   But taking adva
239b0 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20 74 69  ntage of this ti
239c0 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
239d0 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64   makes it more d
239e0 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f 76  ifficult to prov
239f0 65 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  e that the code 
23a00 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20 0a  is correct (in .
23a10 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69  ** particular, i
23a20 74 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72  t prevents us fr
23a30 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65 66  om writing an ef
23a40 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65  fective.** imple
23a50 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c  mentation of sql
23a60 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
23a70 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65 20  rt()) and so we 
23a80 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74  have chosen.** t
23a90 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66 65 20  o take the safe 
23aa0 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20 74  route and skip t
23ab0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  he optimization.
23ac0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23ad0 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a  MayAbort(Parse *
23ae0 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65  pParse){.  Parse
23af0 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
23b00 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
23b10 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54  el(pParse);.  pT
23b20 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72  oplevel->mayAbor
23b30 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 1;.}../*.** 
23b40 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20  Code an OP_Halt 
23b50 74 68 61 74 20 63 61 75 73 65 73 20 74 68 65 20  that causes the 
23b60 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61  vdbe to return a
23b70 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
23b80 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68  INT.** error. Th
23b90 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65  e onError parame
23ba0 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ter determines w
23bb0 68 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66  hich (if any) of
23bc0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
23bd0 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74  * and/or current
23be0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
23bf0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
23c00 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74  void sqlite3Halt
23c10 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61  Constraint(.  Pa
23c20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
23c30 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
23c40 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  xt */.  int errC
23c50 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20 65 78 74  ode,      /* ext
23c60 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64 65  ended error code
23c70 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
23c80 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74  r,      /* Const
23c90 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20  raint type */.  
23ca0 63 68 61 72 20 2a 70 34 2c 20 20 20 20 20 20 20  char *p4,       
23cb0 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61    /* Error messa
23cc0 67 65 20 2a 2f 0a 20 20 69 38 20 70 34 74 79 70  ge */.  i8 p4typ
23cd0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 34 5f  e,        /* P4_
23ce0 53 54 41 54 49 43 20 6f 72 20 50 34 5f 54 52 41  STATIC or P4_TRA
23cf0 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20 70  NSIENT */.  u8 p
23d00 35 45 72 72 6d 73 67 20 20 20 20 20 20 20 2f 2a  5Errmsg       /*
23d10 20 50 35 5f 45 72 72 4d 73 67 20 74 79 70 65 20   P5_ErrMsg type 
23d20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
23d30 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
23d40 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
23d50 72 74 28 20 28 65 72 72 43 6f 64 65 26 30 78 66  rt( (errCode&0xf
23d60 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  f)==SQLITE_CONST
23d70 52 41 49 4e 54 20 29 3b 0a 20 20 69 66 28 20 6f  RAINT );.  if( o
23d80 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74  nError==OE_Abort
23d90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d   ){.    sqlite3M
23da0 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
23db0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
23dc0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48  beAddOp4(v, OP_H
23dd0 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f 6e  alt, errCode, on
23de0 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34  Error, 0, p4, p4
23df0 74 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  type);.  sqlite3
23e00 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
23e10 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a  p5Errmsg);.}../*
23e20 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48  .** Code an OP_H
23e30 61 6c 74 20 64 75 65 20 74 6f 20 55 4e 49 51 55  alt due to UNIQU
23e40 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
23e50 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c   constraint viol
23e60 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
23e70 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73  qlite3UniqueCons
23e80 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
23e90 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
23ea0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
23eb0 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
23ec0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61        /* Constra
23ed0 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 49 6e  int type */.  In
23ee0 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
23ef0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68 61  /* The index tha
23f00 74 20 74 72 69 67 67 65 72 73 20 74 68 65 20 63  t triggers the c
23f10 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a  onstraint */.){.
23f20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20    char *zErr;.  
23f30 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63 63 75  int j;.  StrAccu
23f40 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54 61 62 6c  m errMsg;.  Tabl
23f50 65 20 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e  e *pTab = pIdx->
23f60 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69 74  pTable;..  sqlit
23f70 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
23f80 65 72 72 4d 73 67 2c 20 70 50 61 72 73 65 2d 3e  errMsg, pParse->
23f90 64 62 2c 20 30 2c 20 30 2c 20 32 30 30 29 3b 0a  db, 0, 0, 200);.
23fa0 20 20 69 66 28 20 70 49 64 78 2d 3e 61 43 6f 6c    if( pIdx->aCol
23fb0 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Expr ){.    sqli
23fc0 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
23fd0 26 65 72 72 4d 73 67 2c 20 22 69 6e 64 65 78 20  &errMsg, "index 
23fe0 27 25 71 27 22 2c 20 70 49 64 78 2d 3e 7a 4e 61  '%q'", pIdx->zNa
23ff0 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
24000 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
24010 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29  x->nKeyCol; j++)
24020 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  {.      char *zC
24030 6f 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ol;.      assert
24040 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
24050 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  [j]>=0 );.      
24060 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
24070 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  l[pIdx->aiColumn
24080 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  [j]].zName;.    
24090 20 20 69 66 28 20 6a 20 29 20 73 71 6c 69 74 65    if( j ) sqlite
240a0 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 65 72  3_str_append(&er
240b0 72 4d 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b 0a  rMsg, ", ", 2);.
240c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
240d0 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 65 72 72  r_appendall(&err
240e0 4d 73 67 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  Msg, pTab->zName
240f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24100 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 65 72 72  _str_append(&err
24110 4d 73 67 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20  Msg, ".", 1);.  
24120 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
24130 61 70 70 65 6e 64 61 6c 6c 28 26 65 72 72 4d 73  appendall(&errMs
24140 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a  g, zCol);.    }.
24150 20 20 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c    }.  zErr = sql
24160 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
24170 73 68 28 26 65 72 72 4d 73 67 29 3b 0a 20 20 73  sh(&errMsg);.  s
24180 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
24190 61 69 6e 74 28 70 50 61 72 73 65 2c 20 0a 20 20  aint(pParse, .  
241a0 20 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e    IsPrimaryKeyIn
241b0 64 65 78 28 70 49 64 78 29 20 3f 20 53 51 4c 49  dex(pIdx) ? SQLI
241c0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52  TE_CONSTRAINT_PR
241d0 49 4d 41 52 59 4b 45 59 20 0a 20 20 20 20 20 20  IMARYKEY .      
241e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241f0 20 20 20 20 20 20 3a 20 53 51 4c 49 54 45 5f 43        : SQLITE_C
24200 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45  ONSTRAINT_UNIQUE
24210 2c 0a 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20 7a  ,.    onError, z
24220 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c  Err, P4_DYNAMIC,
24230 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e   P5_ConstraintUn
24240 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ique);.}.../*.**
24250 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74   Code an OP_Halt
24260 20 64 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69 71   due to non-uniq
24270 75 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69  ue rowid..*/.voi
24280 64 20 73 71 6c 69 74 65 33 52 6f 77 69 64 43 6f  d sqlite3RowidCo
24290 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
242a0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
242b0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
242c0 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
242d0 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c  r,      /* Confl
242e0 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
242f0 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54 61  lgorithm */.  Ta
24300 62 6c 65 20 2a 70 54 61 62 20 20 20 20 20 20 20  ble *pTab       
24310 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 77 69 74  /* The table wit
24320 68 20 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75 65  h the non-unique
24330 20 72 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20 20   rowid */ .){.  
24340 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e  char *zMsg;.  in
24350 74 20 72 63 3b 0a 20 20 69 66 28 20 70 54 61 62  t rc;.  if( pTab
24360 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20  ->iPKey>=0 ){.  
24370 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
24380 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
24390 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61  db, "%s.%s", pTa
243a0 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
243b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243c0 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70      pTab->aCol[p
243d0 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d  Tab->iPKey].zNam
243e0 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  e);.    rc = SQL
243f0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
24400 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65 6c  RIMARYKEY;.  }el
24410 73 65 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73  se{.    zMsg = s
24420 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
24430 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72 6f  arse->db, "%s.ro
24440 77 69 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  wid", pTab->zNam
24450 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  e);.    rc = SQL
24460 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52  ITE_CONSTRAINT_R
24470 4f 57 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  OWID;.  }.  sqli
24480 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
24490 74 28 70 50 61 72 73 65 2c 20 72 63 2c 20 6f 6e  t(pParse, rc, on
244a0 45 72 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34 5f  Error, zMsg, P4_
244b0 44 59 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20 20  DYNAMIC,.       
244c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244d0 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e   P5_ConstraintUn
244e0 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ique);.}../*.** 
244f0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
24500 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65 20  pIndex uses the 
24510 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
24520 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72  ce pColl.  Retur
24530 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20  n.** true if it 
24540 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69  does and false i
24550 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  f it does not..*
24560 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
24570 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
24580 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69  atic int collati
24590 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68  onMatch(const ch
245a0 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78  ar *zColl, Index
245b0 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74   *pIndex){.  int
245c0 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43   i;.  assert( zC
245d0 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  oll!=0 );.  for(
245e0 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e  i=0; i<pIndex->n
245f0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
24600 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
24610 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
24620 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
24630 20 7a 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d   z!=0 || pIndex-
24640 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29  >aiColumn[i]<0 )
24650 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  ;.    if( pIndex
24660 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30  ->aiColumn[i]>=0
24670 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
24680 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20  rICmp(z, zColl) 
24690 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
246a0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
246b0 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
246c0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75  f../*.** Recompu
246d0 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
246e0 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20  f pTab that use 
246f0 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
24700 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a  quence pColl..**
24710 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65   If pColl==0 the
24720 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  n recompute all 
24730 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e  indices of pTab.
24740 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
24750 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
24760 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
24770 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a  dexTable(Parse *
24780 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
24790 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20  Tab, char const 
247a0 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 69 66 28 20 21  *zColl){.  if( !
247b0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
247c0 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
247d0 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
247e0 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61     /* An index a
247f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
24800 54 61 62 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28  Tab */..    for(
24810 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e  pIndex=pTab->pIn
24820 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e  dex; pIndex; pIn
24830 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78  dex=pIndex->pNex
24840 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43  t){.      if( zC
24850 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74  oll==0 || collat
24860 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20  ionMatch(zColl, 
24870 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20  pIndex) ){.     
24880 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
24890 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
248a0 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
248b0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
248c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
248d0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
248e0 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
248f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
24900 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
24910 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29  rse, pIndex, -1)
24920 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24930 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
24940 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c  .** Recompute al
24950 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c  l indices of all
24960 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64   tables in all d
24970 61 74 61 62 61 73 65 73 20 77 68 65 72 65 20 74  atabases where t
24980 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73  he.** indices us
24990 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  e the collating 
249a0 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20  sequence pColl. 
249b0 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65   If pColl==0 the
249c0 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61  n recompute.** a
249d0 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72 79  ll indices every
249e0 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  where..*/.#ifnde
249f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
24a00 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69  INDEX.static voi
24a10 64 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73  d reindexDatabas
24a20 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
24a30 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43  , char const *zC
24a40 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b  oll){.  Db *pDb;
24a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a60 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
24a70 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
24a80 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
24a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
24aa0 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
24ab0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69  number */.  sqli
24ac0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
24ad0 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64  ->db;   /* The d
24ae0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
24af0 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d  on */.  HashElem
24b00 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20   *k;            
24b10 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
24b20 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69  ng over tables i
24b30 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65  n pDb */.  Table
24b40 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
24b50 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c         /* A tabl
24b60 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
24b70 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
24b80 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
24b90 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
24ba0 29 3b 20 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f  );  /* Needed fo
24bb0 72 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 20  r schema access 
24bc0 2a 2f 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20  */.  for(iDb=0, 
24bd0 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62  pDb=db->aDb; iDb
24be0 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c  <db->nDb; iDb++,
24bf0 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73   pDb++){.    ass
24c00 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20  ert( pDb!=0 );. 
24c10 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48     for(k=sqliteH
24c20 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70  ashFirst(&pDb->p
24c30 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
24c40 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61  ;  k; k=sqliteHa
24c50 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20  shNext(k)){.    
24c60 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a    pTab = (Table*
24c70 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
24c80 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65  k);.      reinde
24c90 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
24ca0 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  Tab, zColl);.   
24cb0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
24cc0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
24cd0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45 49  code for the REI
24ce0 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
24cf0 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
24d00 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EX              
24d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
24d20 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   1.**        REI
24d30 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e  NDEX  <collation
24d40 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >               
24d50 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 2.**        R
24d60 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
24d70 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e  se>.?<tablename>
24d80 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20    -- 3.**       
24d90 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
24da0 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d  base>.?<indexnam
24db0 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46  e>  -- 4.**.** F
24dc0 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c  orm 1 causes all
24dd0 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
24de0 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
24df0 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74  es to be rebuilt
24e00 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75  ..** Form 2 rebu
24e10 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  ilds all indices
24e20 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
24e30 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e  s that use the n
24e40 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e  amed.** collatin
24e50 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72  g function.  For
24e60 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75 69  ms 3 and 4 rebui
24e70 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  ld the named ind
24e80 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64  ex or all.** ind
24e90 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
24ea0 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74  with the named t
24eb0 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
24ec0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
24ed0 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65  NDEX.void sqlite
24ee0 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a  3Reindex(Parse *
24ef0 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
24f00 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Name1, Token *pN
24f10 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ame2){.  CollSeq
24f20 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *pColl;        
24f30 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
24f40 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65  g sequence to be
24f50 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e   reindexed, or N
24f60 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ULL */.  char *z
24f70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24f80 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
24f90 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
24fa0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
24fb0 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20   *zDb;          
24fc0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
24fd0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54   database */.  T
24fe0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
24ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
25000 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
25010 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78  abase */.  Index
25020 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
25030 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
25040 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
25050 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  th pTab */.  int
25060 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
25070 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25080 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
25090 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
250a0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
250b0 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
250c0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
250d0 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f  n */.  Token *pO
250e0 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  bjName;         
250f0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
25100 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
25110 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
25120 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   */..  /* Read t
25130 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
25140 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ma. If an error 
25150 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
25160 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
25170 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20   ** and code in 
25180 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
25190 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28  n NULL. */.  if(
251a0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
251b0 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
251c0 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74  arse) ){.    ret
251d0 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  urn;.  }..  if( 
251e0 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20  pName1==0 ){.   
251f0 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
25200 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20  s(pParse, 0);.  
25210 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73    return;.  }els
25220 65 20 69 66 28 20 4e 45 56 45 52 28 70 4e 61 6d  e if( NEVER(pNam
25230 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32  e2==0) || pName2
25240 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68  ->z==0 ){.    ch
25250 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61  ar *zColl;.    a
25260 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a  ssert( pName1->z
25270 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20   );.    zColl = 
25280 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
25290 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
252a0 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66   pName1);.    if
252b0 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72  ( !zColl ) retur
252c0 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  n;.    pColl = s
252d0 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
252e0 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a  q(db, ENC(db), z
252f0 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66  Coll, 0);.    if
25300 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
25310 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
25320 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  s(pParse, zColl)
25330 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
25340 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
25350 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
25360 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
25370 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
25380 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  l);.  }.  iDb = 
25390 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
253a0 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
253b0 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a  1, pName2, &pObj
253c0 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62  Name);.  if( iDb
253d0 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  <0 ) return;.  z
253e0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
253f0 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a  omToken(db, pObj
25400 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  Name);.  if( z==
25410 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44  0 ) return;.  zD
25420 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
25430 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 70 54 61  .zDbSName;.  pTa
25440 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  b = sqlite3FindT
25450 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29  able(db, z, zDb)
25460 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a  ;.  if( pTab ){.
25470 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65      reindexTable
25480 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30  (pParse, pTab, 0
25490 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
254a0 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
254b0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
254c0 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46  Index = sqlite3F
254d0 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20  indIndex(db, z, 
254e0 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  zDb);.  sqlite3D
254f0 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
25500 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
25510 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
25520 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
25530 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
25540 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
25550 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
25560 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  dex, -1);.    re
25570 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
25580 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
25590 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69  se, "unable to i
255a0 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65  dentify the obje
255b0 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ct to be reindex
255c0 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ed");.}.#endif..
255d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 4b  /*.** Return a K
255e0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
255f0 20 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72   that is appropr
25600 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76  iate for the giv
25610 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  en Index..**.** 
25620 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  The caller shoul
25630 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  d invoke sqlite3
25640 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f  KeyInfoUnref() o
25650 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f  n the returned o
25660 62 6a 65 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74  bject.** when it
25670 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 75 73   has finished us
25680 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e  ing it..*/.KeyIn
25690 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e  fo *sqlite3KeyIn
256a0 66 6f 4f 66 49 6e 64 65 78 28 50 61 72 73 65 20  foOfIndex(Parse 
256b0 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
256c0 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pIdx){.  int i;.
256d0 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64    int nCol = pId
256e0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e  x->nColumn;.  in
256f0 74 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e  t nKey = pIdx->n
25700 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66  KeyCol;.  KeyInf
25710 6f 20 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20 70  o *pKey;.  if( p
25720 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
25730 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49  turn 0;.  if( pI
25740 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  dx->uniqNotNull 
25750 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71  ){.    pKey = sq
25760 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
25770 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b  c(pParse->db, nK
25780 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a  ey, nCol-nKey);.
25790 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65    }else{.    pKe
257a0 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  y = sqlite3KeyIn
257b0 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  foAlloc(pParse->
257c0 64 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20  db, nCol, 0);.  
257d0 7d 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  }.  if( pKey ){.
257e0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
257f0 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
25800 65 61 62 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20  eable(pKey) );. 
25810 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
25820 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
25830 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
25840 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  l = pIdx->azColl
25850 5b 69 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d  [i];.      pKey-
25860 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c  >aColl[i] = zCol
25870 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 42 49 4e  l==sqlite3StrBIN
25880 41 52 59 20 3f 20 30 20 3a 0a 20 20 20 20 20 20  ARY ? 0 :.      
25890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258a0 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43    sqlite3LocateC
258b0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
258c0 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65  Coll);.      pKe
258d0 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  y->aSortOrder[i]
258e0 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72   = pIdx->aSortOr
258f0 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  der[i];.    }.  
25900 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
25910 72 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  rr ){.      asse
25920 72 74 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d  rt( pParse->rc==
25930 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f 4d 49 53  SQLITE_ERROR_MIS
25940 53 49 4e 47 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a  SING_COLLSEQ );.
25950 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
25960 62 4e 6f 51 75 65 72 79 3d 3d 30 20 29 7b 0a 20  bNoQuery==0 ){. 
25970 20 20 20 20 20 20 20 2f 2a 20 44 65 61 63 74 69         /* Deacti
25980 76 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 62  vate the index b
25990 65 63 61 75 73 65 20 69 74 20 63 6f 6e 74 61 69  ecause it contai
259a0 6e 73 20 61 6e 20 75 6e 6b 6e 6f 77 6e 20 63 6f  ns an unknown co
259b0 6c 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 20 20  llating.        
259c0 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68  ** sequence.  Th
259d0 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 72 65  e only way to re
259e0 61 63 74 69 76 65 20 74 68 65 20 69 6e 64 65 78  active the index
259f0 20 69 73 20 74 6f 20 72 65 6c 6f 61 64 20 74 68   is to reload th
25a00 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 63 68  e.        ** sch
25a10 65 6d 61 2e 20 20 41 64 64 69 6e 67 20 74 68 65  ema.  Adding the
25a20 20 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69   missing collati
25a30 6e 67 20 73 65 71 75 65 6e 63 65 20 6c 61 74 65  ng sequence late
25a40 72 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20  r does not.     
25a50 20 20 20 2a 2a 20 72 65 61 63 74 69 76 65 20 74     ** reactive t
25a60 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 61  he index.  The a
25a70 70 70 6c 69 63 61 74 69 6f 6e 20 68 61 64 20 74  pplication had t
25a80 68 65 20 63 68 61 6e 63 65 20 74 6f 20 72 65 67  he chance to reg
25a90 69 73 74 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  ister.        **
25aa0 20 74 68 65 20 6d 69 73 73 69 6e 67 20 69 6e 64   the missing ind
25ab0 65 78 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c  ex using the col
25ac0 6c 61 74 69 6f 6e 2d 6e 65 65 64 65 64 20 63 61  lation-needed ca
25ad0 6c 6c 62 61 63 6b 2e 20 20 46 6f 72 0a 20 20 20  llback.  For.   
25ae0 20 20 20 20 20 2a 2a 20 73 69 6d 70 6c 69 63 69       ** simplici
25af0 74 79 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  ty, SQLite will 
25b00 6e 6f 74 20 67 69 76 65 20 74 68 65 20 61 70 70  not give the app
25b10 6c 69 63 61 74 69 6f 6e 20 61 20 73 65 63 6f 6e  lication a secon
25b20 64 20 63 68 61 6e 63 65 2e 0a 20 20 20 20 20 20  d chance..      
25b30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49 64    */.        pId
25b40 78 2d 3e 62 4e 6f 51 75 65 72 79 20 3d 20 31 3b  x->bNoQuery = 1;
25b50 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
25b60 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
25b70 4f 52 5f 52 45 54 52 59 3b 0a 20 20 20 20 20 20  OR_RETRY;.      
25b80 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b  }.      sqlite3K
25b90 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
25ba0 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20  );.      pKey = 
25bb0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
25bc0 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a 23  eturn pKey;.}..#
25bd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
25be0 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68  IT_CTE./* .** Th
25bf0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
25c00 76 6f 6b 65 64 20 6f 6e 63 65 20 70 65 72 20 43  voked once per C
25c10 54 45 20 62 79 20 74 68 65 20 70 61 72 73 65 72  TE by the parser
25c20 20 77 68 69 6c 65 20 70 61 72 73 69 6e 67 20 61   while parsing a
25c30 20 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65   .** WITH clause
25c40 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a 73 71 6c 69  . .*/.With *sqli
25c50 74 65 33 57 69 74 68 41 64 64 28 0a 20 20 50 61  te3WithAdd(.  Pa
25c60 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
25c70 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
25c80 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 69   context */.  Wi
25c90 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20  th *pWith,      
25ca0 20 20 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e        /* Existin
25cb0 67 20 57 49 54 48 20 63 6c 61 75 73 65 2c 20 6f  g WITH clause, o
25cc0 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  r NULL */.  Toke
25cd0 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20  n *pName,       
25ce0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
25cf0 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20  he common-table 
25d00 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
25d10 41 72 67 6c 69 73 74 2c 20 20 20 20 20 2f 2a 20  Arglist,     /* 
25d20 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20  Optional column 
25d30 6e 61 6d 65 20 6c 69 73 74 20 66 6f 72 20 74 68  name list for th
25d40 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c  e table */.  Sel
25d50 65 63 74 20 2a 70 51 75 65 72 79 20 20 20 20 20  ect *pQuery     
25d60 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 75 73       /* Query us
25d70 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
25d80 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b   the table */.){
25d90 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
25da0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 57   pParse->db;.  W
25db0 69 74 68 20 2a 70 4e 65 77 3b 0a 20 20 63 68 61  ith *pNew;.  cha
25dc0 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20  r *zName;..  /* 
25dd0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 43  Check that the C
25de0 54 45 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  TE name is uniqu
25df0 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 57 49  e within this WI
25e00 54 48 20 63 6c 61 75 73 65 2e 20 49 66 0a 20 20  TH clause. If.  
25e10 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72 65 20 61 6e  ** not, store an
25e20 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61   error in the Pa
25e30 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a  rse structure. *
25e40 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  zName = sqli
25e50 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
25e60 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
25e70 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
25e80 20 26 26 20 70 57 69 74 68 20 29 7b 0a 20 20 20   && pWith ){.   
25e90 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
25ea0 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43  i=0; i<pWith->nC
25eb0 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
25ec0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
25ed0 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69 74 68 2d  mp(zName, pWith-
25ee0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
25ef0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
25f00 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
25f10 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 57 49  e, "duplicate WI
25f20 54 48 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25  TH table name: %
25f30 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
25f40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
25f50 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
25f60 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69    int nByte = si
25f70 7a 65 6f 66 28 2a 70 57 69 74 68 29 20 2b 20 28  zeof(*pWith) + (
25f80 73 69 7a 65 6f 66 28 70 57 69 74 68 2d 3e 61 5b  sizeof(pWith->a[
25f90 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e 6e 43 74  1]) * pWith->nCt
25fa0 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73  e);.    pNew = s
25fb0 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
25fc0 64 62 2c 20 70 57 69 74 68 2c 20 6e 42 79 74 65  db, pWith, nByte
25fd0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
25fe0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
25ff0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
26000 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 29 3b 0a  izeof(*pWith));.
26010 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 70    }.  assert( (p
26020 4e 65 77 21 3d 30 20 26 26 20 7a 4e 61 6d 65 21  New!=0 && zName!
26030 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  =0) || db->mallo
26040 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 69 66  cFailed );..  if
26050 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
26060 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
26070 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
26080 64 62 2c 20 70 41 72 67 6c 69 73 74 29 3b 0a 20  db, pArglist);. 
26090 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
260a0 44 65 6c 65 74 65 28 64 62 2c 20 70 51 75 65 72  Delete(db, pQuer
260b0 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  y);.    sqlite3D
260c0 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
260d0 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 70 57 69  ;.    pNew = pWi
260e0 74 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  th;.  }else{.   
260f0 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
26100 43 74 65 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70  Cte].pSelect = p
26110 51 75 65 72 79 3b 0a 20 20 20 20 70 4e 65 77 2d  Query;.    pNew-
26120 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70  >a[pNew->nCte].p
26130 43 6f 6c 73 20 3d 20 70 41 72 67 6c 69 73 74 3b  Cols = pArglist;
26140 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65  .    pNew->a[pNe
26150 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20 3d  w->nCte].zName =
26160 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 70 4e 65 77   zName;.    pNew
26170 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e  ->a[pNew->nCte].
26180 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20  zCteErr = 0;.   
26190 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a 20   pNew->nCte++;. 
261a0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e 65   }..  return pNe
261b0 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  w;.}../*.** Free
261c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
261d0 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74   the With object
261e0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
261f0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
26200 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
26210 69 74 68 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ithDelete(sqlite
26220 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 57 69  3 *db, With *pWi
26230 74 68 29 7b 0a 20 20 69 66 28 20 70 57 69 74 68  th){.  if( pWith
26240 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
26250 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57     for(i=0; i<pW
26260 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b  ith->nCte; i++){
26270 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 43 74  .      struct Ct
26280 65 20 2a 70 43 74 65 20 3d 20 26 70 57 69 74 68  e *pCte = &pWith
26290 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71  ->a[i];.      sq
262a0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
262b0 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 43  ete(db, pCte->pC
262c0 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ols);.      sqli
262d0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
262e0 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63  db, pCte->pSelec
262f0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
26300 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 74 65  3DbFree(db, pCte
26310 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
26320 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
26330 65 28 64 62 2c 20 70 57 69 74 68 29 3b 0a 20 20  e(db, pWith);.  
26340 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  }.}.#endif /* !d
26350 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
26360 49 54 5f 43 54 45 29 20 2a 2f 0a                 IT_CTE) */.