/ Hex Artifact Content
Login

Artifact ba3f389668754c407805bbc5f8ab140f063ba6b04a6a86f63006b63b3c7319a8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  =0 );..#ifdef SQ
07f0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
0800: 52 45 4e 54 0a 20 20 69 66 28 20 69 44 62 3d 3d  RENT.  if( iDb==
0810: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  1 ) return;.  if
0820: 28 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53  ( !sqlite3BtreeS
0830: 68 61 72 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  harable(pParse->
0840: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
0850: 29 20 29 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64  ) ) return;.#end
0860: 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  if.  for(i=0; i<
0870: 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c  pToplevel->nTabl
0880: 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  eLock; i++){.   
0890: 20 70 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d   p = &pToplevel-
08a0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
08b0: 20 20 20 20 69 66 28 20 70 2d 3e 69 44 62 3d 3d      if( p->iDb==
08c0: 69 44 62 20 26 26 20 70 2d 3e 69 54 61 62 3d 3d  iDb && p->iTab==
08d0: 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 2d  iTab ){.      p-
08e0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28  >isWriteLock = (
08f0: 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c  p->isWriteLock |
0900: 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a  | isWriteLock);.
0910: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
0920: 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65    }.  }..  nByte
0930: 73 20 3d 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  s = sizeof(Table
0940: 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70 6c 65 76  Lock) * (pToplev
0950: 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31  el->nTableLock+1
0960: 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
0970: 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a 20 20 20  aTableLock =.   
0980: 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c     sqlite3DbReal
0990: 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f 70 6c 65  locOrFree(pTople
09a0: 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70 6c 65 76  vel->db, pToplev
09b0: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 2c 20  el->aTableLock, 
09c0: 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20 70  nBytes);.  if( p
09d0: 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65  Toplevel->aTable
09e0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 20 3d 20  Lock ){.    p = 
09f0: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0a00: 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65 76 65 6c  leLock[pToplevel
0a10: 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b  ->nTableLock++];
0a20: 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d 20 69 44  .    p->iDb = iD
0a30: 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62 20 3d  b;.    p->iTab =
0a40: 20 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 73   iTab;.    p->is
0a50: 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69 73 57 72  WriteLock = isWr
0a60: 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 2d 3e  iteLock;.    p->
0a70: 7a 4c 6f 63 6b 4e 61 6d 65 20 3d 20 7a 4e 61 6d  zLockName = zNam
0a80: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
0a90: 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c  pToplevel->nTabl
0aa0: 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 73  eLock = 0;.    s
0ab0: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70  qlite3OomFault(p
0ac0: 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 29 3b 0a 20  Toplevel->db);. 
0ad0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0ae0: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0af0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b00: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b10: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b20: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0b30: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0b40: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0b50: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0b60: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0b70: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0b80: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0b90: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0ba0: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0bb0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0bc0: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0bd0: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0be0: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0bf0: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c00: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c10: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c20: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0c30: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0c40: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0c50: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0c60: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0c70: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0c80: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0c90: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0ca0: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0cb0: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cd0: 20 20 20 70 2d 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c     p->zLockName,
0ce0: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d   P4_STATIC);.  }
0cf0: 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69  .}.#else.  #defi
0d00: 6e 65 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ne codeTableLock
0d10: 73 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  s(x).#endif../*.
0d20: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
0d30: 66 20 74 68 65 20 67 69 76 65 6e 20 79 44 62 4d  f the given yDbM
0d40: 61 73 6b 20 6f 62 6a 65 63 74 20 69 73 20 65 6d  ask object is em
0d50: 70 74 79 20 2d 20 69 66 20 69 74 20 63 6f 6e 74  pty - if it cont
0d60: 61 69 6e 73 20 6e 6f 0a 2a 2a 20 31 20 62 69 74  ains no.** 1 bit
0d70: 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
0d80: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
0d90: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 29 20  DbMaskAllZero() 
0da0: 61 6e 64 20 44 62 4d 61 73 6b 4e 6f 74 5a 65 72  and DbMaskNotZer
0db0: 6f 28 29 0a 2a 2a 20 6d 61 63 72 6f 73 20 77 68  o().** macros wh
0dc0: 65 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  en SQLITE_MAX_AT
0dd0: 54 41 43 48 45 44 20 69 73 20 67 72 65 61 74 65  TACHED is greate
0de0: 72 20 74 68 61 6e 20 33 30 2e 0a 2a 2f 0a 23 69  r than 30..*/.#i
0df0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  f SQLITE_MAX_ATT
0e00: 41 43 48 45 44 3e 33 30 0a 69 6e 74 20 73 71 6c  ACHED>30.int sql
0e10: 69 74 65 33 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  ite3DbMaskAllZer
0e20: 6f 28 79 44 62 4d 61 73 6b 20 6d 29 7b 0a 20 20  o(yDbMask m){.  
0e30: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
0e40: 3b 20 69 3c 73 69 7a 65 6f 66 28 79 44 62 4d 61  ; i<sizeof(yDbMa
0e50: 73 6b 29 3b 20 69 2b 2b 29 20 69 66 28 20 6d 5b  sk); i++) if( m[
0e60: 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  i] ) return 0;. 
0e70: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
0e80: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
0e90: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
0ea0: 64 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65  d after a single
0eb0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68   SQL statement h
0ec0: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65  as been.** parse
0ed0: 64 20 61 6e 64 20 61 20 56 44 42 45 20 70 72 6f  d and a VDBE pro
0ee0: 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20  gram to execute 
0ef0: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20 68  that statement h
0f00: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65 70 61  as been.** prepa
0f10: 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  red.  This routi
0f20: 6e 65 20 70 75 74 73 20 74 68 65 20 66 69 6e 69  ne puts the fini
0f30: 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20 6f 6e  shing touches on
0f40: 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f   the.** VDBE pro
0f50: 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74 73 20  gram and resets 
0f60: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
0f70: 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e 65 78  ture for the nex
0f80: 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a  t.** parse..**.*
0f90: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61  * Note that if a
0fa0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
0fb0: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
0fc0: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e  e case that.** n
0fd0: 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20  o VDBE code was 
0fe0: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f  generated..*/.vo
0ff0: 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  id sqlite3Finish
1000: 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a 70 50  Coding(Parse *pP
1010: 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
1020: 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
1030: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1040: 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30  se->pToplevel==0
1050: 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
1060: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61  e->db;.  if( pPa
1070: 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20 72 65  rse->nested ) re
1080: 74 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e  turn;.  if( db->
1090: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
10a0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
10b0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
10c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
10d0: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
10e0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72  ITE_ERROR;.    r
10f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
1100: 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65 72 61   Begin by genera
1110: 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e  ting some termin
1120: 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20 74 68  ation code at th
1130: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a  e end of the.  *
1140: 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d 0a 20  * vdbe program. 
1150: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
1160: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1170: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ;.  assert( !pPa
1180: 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  rse->isMultiWrit
1190: 65 20 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  e .       || sql
11a0: 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61  ite3VdbeAssertMa
11b0: 79 41 62 6f 72 74 28 76 2c 20 70 50 61 72 73 65  yAbort(v, pParse
11c0: 2d 3e 6d 61 79 41 62 6f 72 74 29 29 3b 0a 20 20  ->mayAbort));.  
11d0: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
11e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
11f0: 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a 0a 23 69 66  , OP_Halt);..#if
1200: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
1210: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20  HENTICATION.    
1220: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  if( pParse->nTab
1230: 6c 65 4c 6f 63 6b 3e 30 20 26 26 20 64 62 2d 3e  leLock>0 && db->
1240: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
1250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 55 73 65        sqlite3Use
1260: 72 41 75 74 68 49 6e 69 74 28 64 62 29 3b 0a 20  rAuthInit(db);. 
1270: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74       if( db->aut
1280: 68 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54  h.authLevel<UAUT
1290: 48 5f 55 73 65 72 20 29 7b 0a 20 20 20 20 20 20  H_User ){.      
12a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12b0: 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 72 20  g(pParse, "user 
12c0: 6e 6f 74 20 61 75 74 68 65 6e 74 69 63 61 74 65  not authenticate
12d0: 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  d");.        pPa
12e0: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
12f0: 5f 41 55 54 48 5f 55 53 45 52 3b 0a 20 20 20 20  _AUTH_USER;.    
1300: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1310: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
1320: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f  ..    /* The coo
1330: 6b 69 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e  kie mask contain
1340: 73 20 6f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  s one bit for ea
1350: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
1360: 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42   open..    ** (B
1370: 69 74 20 30 20 69 73 20 66 6f 72 20 6d 61 69 6e  it 0 is for main
1380: 2c 20 62 69 74 20 31 20 69 73 20 66 6f 72 20 74  , bit 1 is for t
1390: 65 6d 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  emp, and so fort
13a0: 68 2e 29 20 20 42 69 74 73 20 61 72 65 0a 20 20  h.)  Bits are.  
13b0: 20 20 2a 2a 20 73 65 74 20 66 6f 72 20 65 61 63    ** set for eac
13c0: 68 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  h database that 
13d0: 69 73 20 75 73 65 64 2e 20 20 47 65 6e 65 72 61  is used.  Genera
13e0: 74 65 20 63 6f 64 65 20 74 6f 20 73 74 61 72 74  te code to start
13f0: 20 61 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61   a.    ** transa
1400: 63 74 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73  ction on each us
1410: 65 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ed database and 
1420: 74 6f 20 76 65 72 69 66 79 20 74 68 65 20 73 63  to verify the sc
1430: 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20  hema cookie.    
1440: 2a 2a 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20  ** on each used 
1450: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
1460: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
1470: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20  locFailed==0 .  
1480: 20 20 20 26 26 20 28 44 62 4d 61 73 6b 4e 6f 6e     && (DbMaskNon
1490: 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 63 6f 6f  Zero(pParse->coo
14a0: 6b 69 65 4d 61 73 6b 29 20 7c 7c 20 70 50 61 72  kieMask) || pPar
14b0: 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 29 0a  se->pConstExpr).
14c0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74      ){.      int
14d0: 20 69 44 62 2c 20 69 3b 0a 20 20 20 20 20 20 61   iDb, i;.      a
14e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
14f0: 62 65 47 65 74 4f 70 28 76 2c 20 30 29 2d 3e 6f  beGetOp(v, 0)->o
1500: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 29  pcode==OP_Init )
1510: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1520: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 30  dbeJumpHere(v, 0
1530: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62  );.      for(iDb
1540: 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  =0; iDb<db->nDb;
1550: 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20   iDb++){.       
1560: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1570: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 44 62  ;.        if( Db
1580: 4d 61 73 6b 54 65 73 74 28 70 50 61 72 73 65 2d  MaskTest(pParse-
1590: 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62  >cookieMask, iDb
15a0: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
15b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15c0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
15d0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 70   iDb);.        p
15e0: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
15f0: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  [iDb].pSchema;. 
1600: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1610: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 0a 20  beAddOp4Int(v,. 
1620: 20 20 20 20 20 20 20 20 20 4f 50 5f 54 72 61 6e           OP_Tran
1630: 73 61 63 74 69 6f 6e 2c 20 20 20 20 20 20 20 20  saction,        
1640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1650: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20  pcode */.       
1660: 20 20 20 69 44 62 2c 20 20 20 20 20 20 20 20 20     iDb,         
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
1690: 20 20 20 20 20 20 20 20 20 44 62 4d 61 73 6b 54           DbMaskT
16a0: 65 73 74 28 70 50 61 72 73 65 2d 3e 77 72 69 74  est(pParse->writ
16b0: 65 4d 61 73 6b 2c 69 44 62 29 2c 20 2f 2a 20 50  eMask,iDb), /* P
16c0: 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  2 */.          p
16d0: 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
16e0: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20 20 20 20  ookie,          
16f0: 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20    /* P3 */.     
1700: 20 20 20 20 20 70 53 63 68 65 6d 61 2d 3e 69 47       pSchema->iG
1710: 65 6e 65 72 61 74 69 6f 6e 20 20 20 20 20 20 20  eneration       
1720: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f          /* P4 */
1730: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
1740: 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74      if( db->init
1750: 2e 62 75 73 79 3d 3d 30 20 29 20 73 71 6c 69 74  .busy==0 ) sqlit
1760: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1770: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64  , 1);.        Vd
1780: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 0a 20 20  beComment((v,.  
1790: 20 20 20 20 20 20 20 20 20 20 20 20 22 75 73 65              "use
17a0: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 3d 25 64 22  sStmtJournal=%d"
17b0: 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f  , pParse->mayAbo
17c0: 72 74 20 26 26 20 70 50 61 72 73 65 2d 3e 69 73  rt && pParse->is
17d0: 4d 75 6c 74 69 57 72 69 74 65 29 29 3b 0a 20 20  MultiWrite));.  
17e0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
17f0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1800: 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 66 6f 72  LTABLE.      for
1810: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
1820: 6e 56 74 61 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b  nVtabLock; i++){
1830: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 76  .        char *v
1840: 74 61 62 20 3d 20 28 63 68 61 72 20 2a 29 73 71  tab = (char *)sq
1850: 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
1860: 62 2c 20 70 50 61 72 73 65 2d 3e 61 70 56 74 61  b, pParse->apVta
1870: 62 4c 6f 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20  bLock[i]);.     
1880: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1890: 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp4(v, OP_VBegi
18a0: 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74 61 62  n, 0, 0, 0, vtab
18b0: 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
18c0: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 72 73 65    }.      pParse
18d0: 2d 3e 6e 56 74 61 62 4c 6f 63 6b 20 3d 20 30 3b  ->nVtabLock = 0;
18e0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
18f0: 2a 20 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20 63  * Once all the c
1900: 6f 6f 6b 69 65 73 20 68 61 76 65 20 62 65 65 6e  ookies have been
1910: 20 76 65 72 69 66 69 65 64 20 61 6e 64 20 74 72   verified and tr
1920: 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65  ansactions opene
1930: 64 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74  d, .      ** obt
1940: 61 69 6e 20 74 68 65 20 72 65 71 75 69 72 65 64  ain the required
1950: 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68   table-locks. Th
1960: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e  is is a no-op un
1970: 6c 65 73 73 20 74 68 65 20 0a 20 20 20 20 20 20  less the .      
1980: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
1990: 66 65 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c  feature is enabl
19a0: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
19b0: 20 20 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b     codeTableLock
19c0: 73 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  s(pParse);..    
19d0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
19e0: 61 6e 79 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e  any AUTOINCREMEN
19f0: 54 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  T data structure
1a00: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
1a10: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
1a20: 65 33 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 42  e3AutoincrementB
1a30: 65 67 69 6e 28 70 50 61 72 73 65 29 3b 0a 0a 20  egin(pParse);.. 
1a40: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 63 6f 6e       /* Code con
1a50: 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
1a60: 73 20 74 68 61 74 20 77 68 65 72 65 20 66 61 63  s that where fac
1a70: 74 6f 72 65 64 20 6f 75 74 20 6f 66 20 69 6e 6e  tored out of inn
1a80: 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20  er loops */.    
1a90: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 43    if( pParse->pC
1aa0: 6f 6e 73 74 45 78 70 72 20 29 7b 0a 20 20 20 20  onstExpr ){.    
1ab0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
1ac0: 4c 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  L = pParse->pCon
1ad0: 73 74 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  stExpr;.        
1ae0: 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46  pParse->okConstF
1af0: 61 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  actor = 0;.     
1b00: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
1b10: 4c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  L->nExpr; i++){.
1b20: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1b30: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1b40: 2c 20 70 45 4c 2d 3e 61 5b 69 5d 2e 70 45 78 70  , pEL->a[i].pExp
1b50: 72 2c 20 70 45 4c 2d 3e 61 5b 69 5d 2e 75 2e 69  r, pEL->a[i].u.i
1b60: 43 6f 6e 73 74 45 78 70 72 52 65 67 29 3b 0a 20  ConstExprReg);. 
1b70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b80: 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c  ..      /* Final
1b90: 6c 79 2c 20 6a 75 6d 70 20 62 61 63 6b 20 74 6f  ly, jump back to
1ba0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1bb0: 66 20 74 68 65 20 65 78 65 63 75 74 61 62 6c 65  f the executable
1bc0: 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20   code. */.      
1bd0: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1be0: 76 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  v, 1);.    }.  }
1bf0: 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ...  /* Get the 
1c00: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65 61  VDBE program rea
1c10: 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  dy for execution
1c20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26  .  */.  if( v &&
1c30: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
1c40: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
1c50: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73  ailed ){.    ass
1c60: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61  ert( pParse->iCa
1c70: 63 68 65 4c 65 76 65 6c 3d 3d 30 20 29 3b 20 20  cheLevel==0 );  
1c80: 2f 2a 20 44 69 73 61 62 6c 65 73 20 61 6e 64 20  /* Disables and 
1c90: 72 65 2d 65 6e 61 62 6c 65 73 20 6d 61 74 63 68  re-enables match
1ca0: 20 2a 2f 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e   */.    /* A min
1cb0: 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73  imum of one curs
1cc0: 6f 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69  or is required i
1cd0: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
1ce0: 69 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53  is used.    *  S
1cf0: 65 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33  ee ticket [a6963
1d00: 37 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20  79c1f08866] */. 
1d10: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70     if( pParse->p
1d20: 41 69 6e 63 21 3d 30 20 26 26 20 70 50 61 72 73  Ainc!=0 && pPars
1d30: 65 2d 3e 6e 54 61 62 3d 3d 30 20 29 20 70 50 61  e->nTab==0 ) pPa
1d40: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20  rse->nTab = 1;. 
1d50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61     sqlite3VdbeMa
1d60: 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73  keReady(v, pPars
1d70: 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  e);.    pParse->
1d80: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1d90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1da0: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1db0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 7d 0a  TE_ERROR;.  }.}.
1dc0: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70  ./*.** Run the p
1dd0: 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67  arser and code g
1de0: 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69  enerator recursi
1df0: 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  vely in order to
1e00: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64   generate.** cod
1e10: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74  e for the SQL st
1e20: 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e  atement given on
1e30: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1e40: 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74  e pParse context
1e50: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
1e60: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1e70: 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73  .  When the pars
1e80: 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73  er is run recurs
1e90: 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61  ively.** this wa
1ea0: 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f  y, the final OP_
1eb0: 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65  Halt is not appe
1ec0: 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69  nded and other i
1ed0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a  nitialization.**
1ee0: 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f   and finalizatio
1ef0: 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74  n steps are omit
1f00: 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73  ted because thos
1f10: 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62  e are handling b
1f20: 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f  y the.** outermo
1f30: 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a  st parser..**.**
1f40: 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20   Not everything 
1f50: 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68  is nestable.  Th
1f60: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64  is facility is d
1f70: 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69  esigned to permi
1f80: 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44  t.** INSERT, UPD
1f90: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20  ATE, and DELETE 
1fa0: 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e  operations again
1fb0: 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  st SQLITE_MASTER
1fc0: 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69  .  Use.** care i
1fd0: 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20  f you decide to 
1fe0: 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20  try to use this 
1ff0: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65  routine for some
2000: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e   other purposes.
2010: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2020: 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73  NestedParse(Pars
2030: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
2040: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
2050: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
2060: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ap;.  char *zSql
2070: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
2080: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
2090: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
20a0: 62 3b 0a 20 20 63 68 61 72 20 73 61 76 65 42 75  b;.  char saveBu
20b0: 66 5b 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a 5d  f[PARSE_TAIL_SZ]
20c0: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
20d0: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
20e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
20f0: 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20  ->nested<10 );  
2100: 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c  /* Nesting shoul
2110: 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d  d only be of lim
2120: 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20  ited depth */.  
2130: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
2140: 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  rmat);.  zSql = 
2150: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
2160: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
2170: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
2180: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
2190: 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20 2f  .    return;   /
21a0: 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20  * A malloc must 
21b0: 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
21c0: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73   }.  pParse->nes
21d0: 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28  ted++;.  memcpy(
21e0: 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54  saveBuf, PARSE_T
21f0: 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50 41 52  AIL(pParse), PAR
2200: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 6d  SE_TAIL_SZ);.  m
2210: 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41 49 4c  emset(PARSE_TAIL
2220: 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50 41 52  (pParse), 0, PAR
2230: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 73  SE_TAIL_SZ);.  s
2240: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
2250: 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a  pParse, zSql, &z
2260: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
2270: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
2280: 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
2290: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29  DbFree(db, zSql)
22a0: 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41 52 53 45  ;.  memcpy(PARSE
22b0: 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20 73  _TAIL(pParse), s
22c0: 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54 41  aveBuf, PARSE_TA
22d0: 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65  IL_SZ);.  pParse
22e0: 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 23  ->nested--;.}..#
22f0: 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
2300: 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a  UTHENTICATION./*
2310: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
2320: 69 66 20 7a 54 61 62 6c 65 20 69 73 20 74 68 65  if zTable is the
2330: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73   name of the sys
2340: 74 65 6d 20 74 61 62 6c 65 20 74 68 61 74 20 73  tem table that s
2350: 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6c 69 73  tores the.** lis
2360: 74 20 6f 66 20 75 73 65 72 73 20 61 6e 64 20 74  t of users and t
2370: 68 65 69 72 20 61 63 63 65 73 73 20 63 72 65 64  heir access cred
2380: 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e 74 20  entials..*/.int 
2390: 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54  sqlite3UserAuthT
23a0: 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  able(const char 
23b0: 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72 65 74 75  *zTable){.  retu
23c0: 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  rn sqlite3_stric
23d0: 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69  mp(zTable, "sqli
23e0: 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b 0a 7d 0a  te_user")==0;.}.
23f0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  #endif../*.** Lo
2400: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
2410: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
2420: 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61  t describes a pa
2430: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
2440: 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e  e.** table given
2450: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
2460: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74  t table and (opt
2470: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d  ionally) the nam
2480: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
2490: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
24a0: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
24b0: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
24c0: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
24d0: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
24e0: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
24f0: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
2500: 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a  e table and the.
2510: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  ** first matchin
2520: 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72  g table is retur
2530: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
2540: 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ng for duplicate
2550: 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20   table.** names 
2560: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
2570: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54  earch order is T
2580: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
2590: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a  MAIN, then any.*
25a0: 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  * auxiliary data
25b0: 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e  bases added usin
25c0: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
25d0: 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  mand..**.** See 
25e0: 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61  also sqlite3Loca
25f0: 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61  teTable()..*/.Ta
2600: 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  ble *sqlite3Find
2610: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
2620: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
2630: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
2640: 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *zDatabase){.  
2650: 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20  Table *p = 0;.  
2660: 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  int i;..  /* All
2670: 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71   mutexes are req
2680: 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61  uired for schema
2690: 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73   access.  Make s
26a0: 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d  ure we hold them
26b0: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  . */.  assert( z
26c0: 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c 20 73  Database!=0 || s
26d0: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
26e0: 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
26f0: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ;.#if SQLITE_USE
2700: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
2710: 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 61  .  /* Only the a
2720: 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61 6c 6c  dmin user is all
2730: 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74 68 61  owed to know tha
2740: 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75 73 65  t the sqlite_use
2750: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65 78 69  r table.  ** exi
2760: 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  sts */.  if( db-
2770: 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 3c  >auth.authLevel<
2780: 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26 20 73  UAUTH_Admin && s
2790: 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61  qlite3UserAuthTa
27a0: 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ble(zName)!=0 ){
27b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
27c0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68 69 6c   }.#endif.  whil
27d0: 65 28 31 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  e(1){.    for(i=
27e0: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
27f0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
2800: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
2810: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f  ) ? i^1 : i;   /
2820: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
2830: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
2840: 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73 65     if( zDatabase
2850: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
2860: 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c  rICmp(zDatabase,
2870: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53   db->aDb[j].zDbS
2880: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
2890: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
28a0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
28b0: 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a  ld(db, j, 0) );.
28c0: 20 20 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69          p = sqli
28d0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
28e0: 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d  >aDb[j].pSchema-
28f0: 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 29  >tblHash, zName)
2900: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 20  ;.        if( p 
2910: 29 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20  ) return p;.    
2920: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a    }.    }.    /*
2930: 20 4e 6f 74 20 66 6f 75 6e 64 2e 20 20 49 66 20   Not found.  If 
2940: 74 68 65 20 6e 61 6d 65 20 77 65 20 77 65 72 65  the name we were
2950: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 77 61 73   looking for was
2960: 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 6d 61 73   temp.sqlite_mas
2970: 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ter.    ** then 
2980: 63 68 61 6e 67 65 20 74 68 65 20 6e 61 6d 65 20  change the name 
2990: 74 6f 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  to sqlite_temp_m
29a0: 61 73 74 65 72 20 61 6e 64 20 74 72 79 20 61 67  aster and try ag
29b0: 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ain. */.    if( 
29c0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
29d0: 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
29e0: 45 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  E)!=0 ) break;. 
29f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
2a00: 74 72 69 63 6d 70 28 7a 44 61 74 61 62 61 73 65  tricmp(zDatabase
2a10: 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62  , db->aDb[1].zDb
2a20: 53 4e 61 6d 65 29 21 3d 30 20 29 20 62 72 65 61  SName)!=0 ) brea
2a30: 6b 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54  k;.    zName = T
2a40: 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d 45 3b  EMP_MASTER_NAME;
2a50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2a60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
2a70: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
2a80: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
2a90: 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63  scribes a partic
2aa0: 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a  ular database.**
2ab0: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65   table given the
2ac0: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61   name of that ta
2ad0: 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61  ble and (optiona
2ae0: 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66  lly) the name of
2af0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
2b00: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2b10: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e  table.  Return N
2b20: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
2b30: 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e  .  Also leave an
2b40: 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67  .** error messag
2b50: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
2b60: 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rMsg..**.** The 
2b70: 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
2b80: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2b90: 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54  and sqlite3FindT
2ba0: 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20 74  able() is that t
2bb0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c  his.** routine l
2bc0: 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  eaves an error m
2bd0: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
2be0: 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a  ->zErrMsg where.
2bf0: 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  ** sqlite3FindTa
2c00: 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a  ble() does not..
2c10: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
2c20: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20 20  3LocateTable(.  
2c30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2c40: 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65 78         /* contex
2c50: 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72 65  t in which to re
2c60: 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20  port errors */. 
2c70: 20 75 33 32 20 66 6c 61 67 73 2c 20 20 20 20 20   u32 flags,     
2c80: 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f 43 41 54          /* LOCAT
2c90: 45 5f 56 49 45 57 20 6f 72 20 4c 4f 43 41 54 45  E_VIEW or LOCATE
2ca0: 5f 4e 4f 45 52 52 20 2a 2f 0a 20 20 63 6f 6e 73  _NOERR */.  cons
2cb0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
2cc0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2cd0: 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 6c  e table we are l
2ce0: 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  ooking for */.  
2cf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61  const char *zDba
2d00: 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  se     /* Name o
2d10: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
2d20: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
2d30: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
2d40: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
2d50: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
2d60: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2d70: 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
2d80: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
2d90: 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
2da0: 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
2db0: 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  ULL. */.  if( SQ
2dc0: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
2dd0: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
2de0: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
2df0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73   0;.  }..  p = s
2e00: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2e10: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d  pParse->db, zNam
2e20: 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69 66  e, zDbase);.  if
2e30: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f  ( p==0 ){.    co
2e40: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d  nst char *zMsg =
2e50: 20 66 6c 61 67 73 20 26 20 4c 4f 43 41 54 45 5f   flags & LOCATE_
2e60: 56 49 45 57 20 3f 20 22 6e 6f 20 73 75 63 68 20  VIEW ? "no such 
2e70: 76 69 65 77 22 20 3a 20 22 6e 6f 20 73 75 63 68  view" : "no such
2e80: 20 74 61 62 6c 65 22 3b 0a 23 69 66 6e 64 65 66   table";.#ifndef
2e90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2ea0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
2eb0: 28 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  ( sqlite3FindDbN
2ec0: 61 6d 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ame(pParse->db, 
2ed0: 7a 44 62 61 73 65 29 3c 31 20 29 7b 0a 20 20 20  zDbase)<1 ){.   
2ee0: 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
2ef0: 73 20 74 68 65 20 6e 6f 74 20 74 68 65 20 6e 61  s the not the na
2f00: 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 69 6e  me of a table in
2f10: 20 74 68 65 20 73 63 68 65 6d 61 20 63 72 65 61   the schema crea
2f20: 74 65 64 20 75 73 69 6e 67 0a 20 20 20 20 20 20  ted using.      
2f30: 2a 2a 20 43 52 45 41 54 45 2c 20 74 68 65 6e 20  ** CREATE, then 
2f40: 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
2f50: 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  it is the name o
2f60: 66 20 61 6e 20 76 69 72 74 75 61 6c 20 74 61 62  f an virtual tab
2f70: 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  le that.      **
2f80: 20 63 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79   can be an epony
2f90: 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61 62  mous virtual tab
2fa0: 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 4d 6f 64  le. */.      Mod
2fb0: 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64  ule *pMod = (Mod
2fc0: 75 6c 65 2a 29 73 71 6c 69 74 65 33 48 61 73 68  ule*)sqlite3Hash
2fd0: 46 69 6e 64 28 26 70 50 61 72 73 65 2d 3e 64 62  Find(&pParse->db
2fe0: 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d 65  ->aModule, zName
2ff0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 6f  );.      if( pMo
3000: 64 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 5f  d==0 && sqlite3_
3010: 73 74 72 6e 69 63 6d 70 28 7a 4e 61 6d 65 2c 20  strnicmp(zName, 
3020: 22 70 72 61 67 6d 61 5f 22 2c 20 37 29 3d 3d 30  "pragma_", 7)==0
3030: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 6f 64   ){.        pMod
3040: 20 3d 20 73 71 6c 69 74 65 33 50 72 61 67 6d 61   = sqlite3Pragma
3050: 56 74 61 62 52 65 67 69 73 74 65 72 28 70 50 61  VtabRegister(pPa
3060: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b  rse->db, zName);
3070: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
3080: 66 28 20 70 4d 6f 64 20 26 26 20 73 71 6c 69 74  f( pMod && sqlit
3090: 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54  e3VtabEponymousT
30a0: 61 62 6c 65 49 6e 69 74 28 70 50 61 72 73 65 2c  ableInit(pParse,
30b0: 20 70 4d 6f 64 29 20 29 7b 0a 20 20 20 20 20 20   pMod) ){.      
30c0: 20 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e 70    return pMod->p
30d0: 45 70 6f 54 61 62 3b 0a 20 20 20 20 20 20 7d 0a  EpoTab;.      }.
30e0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
30f0: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4c 4f   if( (flags & LO
3100: 43 41 54 45 5f 4e 4f 45 52 52 29 3d 3d 30 20 29  CATE_NOERR)==0 )
3110: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 44 62 61  {.      if( zDba
3120: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  se ){.        sq
3130: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3140: 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73  arse, "%s: %s.%s
3150: 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c  ", zMsg, zDbase,
3160: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
3170: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
3180: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3190: 61 72 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20  arse, "%s: %s", 
31a0: 7a 4d 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  zMsg, zName);.  
31b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 72      }.      pPar
31c0: 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
31d0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
31e0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
31f0: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
3200: 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64  table identified
3210: 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   by *p..**.** Th
3220: 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72 20  is is a wrapper 
3230: 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 4c 6f  around sqlite3Lo
3240: 63 61 74 65 54 61 62 6c 65 28 29 2e 20 54 68 65  cateTable(). The
3250: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
3260: 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 4c 6f  een.** sqlite3Lo
3270: 63 61 74 65 54 61 62 6c 65 28 29 20 61 6e 64 20  cateTable() and 
3280: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
3290: 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
32a0: 69 6f 6e 20 72 65 73 74 72 69 63 74 73 0a 2a 2a  ion restricts.**
32b0: 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 73   the search to s
32c0: 63 68 65 6d 61 20 28 70 2d 3e 70 53 63 68 65 6d  chema (p->pSchem
32d0: 61 29 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  a) if it is not 
32e0: 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68 65 6d 61  NULL. p->pSchema
32f0: 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e   may be.** non-N
3300: 55 4c 4c 20 69 66 20 69 74 20 69 73 20 70 61 72  ULL if it is par
3310: 74 20 6f 66 20 61 20 76 69 65 77 20 6f 72 20 74  t of a view or t
3320: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 64  rigger program d
3330: 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65 65 0a 2a  efinition. See.*
3340: 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c  * sqlite3FixSrcL
3350: 69 73 74 28 29 20 66 6f 72 20 64 65 74 61 69 6c  ist() for detail
3360: 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  s..*/.Table *sql
3370: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
3380: 74 65 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  tem(.  Parse *pP
3390: 61 72 73 65 2c 20 0a 20 20 75 33 32 20 66 6c 61  arse, .  u32 fla
33a0: 67 73 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63  gs,.  struct Src
33b0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a 29 7b 0a  List_item *p.){.
33c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
33d0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  b;.  assert( p->
33e0: 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c 20 70 2d  pSchema==0 || p-
33f0: 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 29 3b  >zDatabase==0 );
3400: 0a 20 20 69 66 28 20 70 2d 3e 70 53 63 68 65 6d  .  if( p->pSchem
3410: 61 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62  a ){.    int iDb
3420: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
3430: 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
3440: 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b  db, p->pSchema);
3450: 0a 20 20 20 20 7a 44 62 20 3d 20 70 50 61 72 73  .    zDb = pPars
3460: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
3470: 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73  zDbSName;.  }els
3480: 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e  e{.    zDb = p->
3490: 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20  zDatabase;.  }. 
34a0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c   return sqlite3L
34b0: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
34c0: 65 2c 20 66 6c 61 67 73 2c 20 70 2d 3e 7a 4e 61  e, flags, p->zNa
34d0: 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  me, zDb);.}../*.
34e0: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
34f0: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
3500: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
3510: 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61   .** a particula
3520: 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68  r index given th
3530: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69  e name of that i
3540: 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ndex.** and the 
3550: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
3560: 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69  base that contai
3570: 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  ns the index..**
3580: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
3590: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
35a0: 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73   If zDatabase is
35b0: 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65   0, all database
35c0: 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66  s are searched f
35d0: 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  or the.** table 
35e0: 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d 61  and the first ma
35f0: 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20  tching index is 
3600: 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63  returned.  (No c
3610: 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64  hecking.** for d
3620: 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e  uplicate index n
3630: 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20  ames is done.)  
3640: 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72  The search order
3650: 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73   is.** TEMP firs
3660: 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68  t, then MAIN, th
3670: 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79  en any auxiliary
3680: 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64   databases added
3690: 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54  .** using the AT
36a0: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  TACH command..*/
36b0: 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46  .Index *sqlite3F
36c0: 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33  indIndex(sqlite3
36d0: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
36e0: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
36f0: 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64  har *zDb){.  Ind
3700: 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  ex *p = 0;.  int
3710: 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74   i;.  /* All mut
3720: 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65  exes are require
3730: 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63  d for schema acc
3740: 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ess.  Make sure 
3750: 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f  we hold them. */
3760: 0a 20 20 61 73 73 65 72 74 28 20 7a 44 62 21 3d  .  assert( zDb!=
3770: 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  0 || sqlite3Btre
3780: 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
3790: 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  (db) );.  for(i=
37a0: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
37b0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
37c0: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
37d0: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53  ? i^1 : i;  /* S
37e0: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
37f0: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63  e MAIN */.    Sc
3800: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
3810: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
3820: 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ma;.    assert( 
3830: 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69  pSchema );.    i
3840: 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65  f( zDb && sqlite
3850: 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62  3StrICmp(zDb, db
3860: 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[j].zDbSNam
3870: 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
3880: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
3890: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
38a0: 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20  d(db, j, 0) );. 
38b0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
38c0: 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d  shFind(&pSchema-
38d0: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29  >idxHash, zName)
38e0: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72  ;.    if( p ) br
38f0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
3900: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
3910: 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79  claim the memory
3920: 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65   used by an inde
3930: 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  x.*/.static void
3940: 20 66 72 65 65 49 6e 64 65 78 28 73 71 6c 69 74   freeIndex(sqlit
3950: 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70  e3 *db, Index *p
3960: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
3970: 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20  E_OMIT_ANALYZE. 
3980: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e   sqlite3DeleteIn
3990: 64 65 78 53 61 6d 70 6c 65 73 28 64 62 2c 20 70  dexSamples(db, p
39a0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
39b0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
39c0: 2c 20 70 2d 3e 70 50 61 72 74 49 64 78 57 68 65  , p->pPartIdxWhe
39d0: 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  re);.  sqlite3Ex
39e0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
39f0: 20 70 2d 3e 61 43 6f 6c 45 78 70 72 29 3b 0a 20   p->aColExpr);. 
3a00: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3a10: 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  b, p->zColAff);.
3a20: 20 20 69 66 28 20 70 2d 3e 69 73 52 65 73 69 7a    if( p->isResiz
3a30: 65 64 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ed ) sqlite3DbFr
3a40: 65 65 28 64 62 2c 20 28 76 6f 69 64 20 2a 29 70  ee(db, (void *)p
3a50: 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64 65  ->azColl);.#ifde
3a60: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
3a70: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
3a80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
3a90: 3e 61 69 52 6f 77 45 73 74 29 3b 0a 23 65 6e 64  >aiRowEst);.#end
3aa0: 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  if.  sqlite3DbFr
3ab0: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
3ac0: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65  .** For the inde
3ad0: 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d  x called zIdxNam
3ae0: 65 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64  e which is found
3af0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
3b00: 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20   iDb,.** unlike 
3b10: 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20  that index from 
3b20: 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72  its Table then r
3b30: 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
3b40: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65  from.** the inde
3b50: 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  x hash table and
3b60: 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   free all memory
3b70: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
3b80: 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
3b90: 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69  he index..*/.voi
3ba0: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
3bb0: 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  ndDeleteIndex(sq
3bc0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
3bd0: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
3be0: 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64  zIdxName){.  Ind
3bf0: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61  ex *pIndex;.  Ha
3c00: 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73  sh *pHash;..  as
3c10: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
3c20: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
3c30: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48   iDb, 0) );.  pH
3c40: 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  ash = &db->aDb[i
3c50: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db].pSchema->idx
3c60: 48 61 73 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d  Hash;.  pIndex =
3c70: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
3c80: 72 74 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61  rt(pHash, zIdxNa
3c90: 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 4c  me, 0);.  if( AL
3ca0: 57 41 59 53 28 70 49 6e 64 65 78 29 20 29 7b 0a  WAYS(pIndex) ){.
3cb0: 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
3cc0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d  pTable->pIndex==
3cd0: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
3ce0: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3cf0: 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d  pIndex = pIndex-
3d00: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
3d10: 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
3d20: 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74  p;.      /* Just
3d30: 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57  ification of ALW
3d40: 41 59 53 28 29 3b 20 20 54 68 65 20 69 6e 64 65  AYS();  The inde
3d50: 78 20 6d 75 73 74 20 62 65 20 6f 6e 20 74 68 65  x must be on the
3d60: 20 6c 69 73 74 20 6f 66 0a 20 20 20 20 20 20 2a   list of.      *
3d70: 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20  * indices. */.  
3d80: 20 20 20 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e      p = pIndex->
3d90: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a  pTable->pIndex;.
3da0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
3db0: 41 59 53 28 70 29 20 26 26 20 70 2d 3e 70 4e 65  AYS(p) && p->pNe
3dc0: 78 74 21 3d 70 49 6e 64 65 78 20 29 7b 20 70 20  xt!=pIndex ){ p 
3dd0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20  = p->pNext; }.  
3de0: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
3df0: 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49   && p->pNext==pI
3e00: 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20  ndex) ){.       
3e10: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64   p->pNext = pInd
3e20: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ex->pNext;.     
3e30: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65   }.    }.    fre
3e40: 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  eIndex(db, pInde
3e50: 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c  x);.  }.  db->fl
3e60: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
3e70: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
3e80: 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75  /*.** Look throu
3e90: 67 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6f  gh the list of o
3ea0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
3eb0: 65 73 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20  es in db->aDb[] 
3ec0: 61 6e 64 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61  and if.** any ha
3ed0: 76 65 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20  ve been closed, 
3ee0: 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d  remove them from
3ef0: 20 74 68 65 20 6c 69 73 74 2e 20 20 52 65 61 6c   the list.  Real
3f00: 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a 20 64 62  locate the.** db
3f10: 2d 3e 61 44 62 5b 5d 20 73 74 72 75 63 74 75 72  ->aDb[] structur
3f20: 65 20 74 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73  e to a smaller s
3f30: 69 7a 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  ize, if possible
3f40: 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20  ..**.** Entry 0 
3f50: 28 74 68 65 20 22 6d 61 69 6e 22 20 64 61 74 61  (the "main" data
3f60: 62 61 73 65 29 20 61 6e 64 20 65 6e 74 72 79 20  base) and entry 
3f70: 31 20 28 74 68 65 20 22 74 65 6d 70 22 20 64 61  1 (the "temp" da
3f80: 74 61 62 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e  tabase).** are n
3f90: 65 76 65 72 20 63 61 6e 64 69 64 61 74 65 73 20  ever candidates 
3fa0: 66 6f 72 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70  for being collap
3fb0: 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
3fc0: 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61  ite3CollapseData
3fd0: 62 61 73 65 41 72 72 61 79 28 73 71 6c 69 74 65  baseArray(sqlite
3fe0: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c  3 *db){.  int i,
3ff0: 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b   j;.  for(i=j=2;
4000: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
4010: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
4020: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
4030: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
4040: 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >pBt==0 ){.     
4050: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4060: 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65  b, pDb->zDbSName
4070: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44  );.      pDb->zD
4080: 62 53 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  bSName = 0;.    
4090: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
40a0: 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b  }.    if( j<i ){
40b0: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a  .      db->aDb[j
40c0: 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a  ] = db->aDb[i];.
40d0: 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20      }.    j++;. 
40e0: 20 7d 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a   }.  db->nDb = j
40f0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c  ;.  if( db->nDb<
4100: 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64  =2 && db->aDb!=d
4110: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a  b->aDbStatic ){.
4120: 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61      memcpy(db->a
4130: 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44  DbStatic, db->aD
4140: 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b, 2*sizeof(db->
4150: 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71  aDb[0]));.    sq
4160: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4170: 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62  db->aDb);.    db
4180: 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53  ->aDb = db->aDbS
4190: 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  tatic;.  }.}../*
41a0: 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 73 63  .** Reset the sc
41b0: 68 65 6d 61 20 66 6f 72 20 74 68 65 20 64 61 74  hema for the dat
41c0: 61 62 61 73 65 20 61 74 20 69 6e 64 65 78 20 69  abase at index i
41d0: 44 62 2e 20 20 41 6c 73 6f 20 72 65 73 65 74 20  Db.  Also reset 
41e0: 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73 63 68 65  the.** TEMP sche
41f0: 6d 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ma..*/.void sqli
4200: 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68 65 6d  te3ResetOneSchem
4210: 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  a(sqlite3 *db, i
4220: 6e 74 20 69 44 62 29 7b 0a 20 20 44 62 20 2a 70  nt iDb){.  Db *p
4230: 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  Db;.  assert( iD
4240: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20  b<db->nDb );..  
4250: 2f 2a 20 43 61 73 65 20 31 3a 20 20 52 65 73 65  /* Case 1:  Rese
4260: 74 20 74 68 65 20 73 69 6e 67 6c 65 20 73 63 68  t the single sch
4270: 65 6d 61 20 69 64 65 6e 74 69 66 69 65 64 20 62  ema identified b
4280: 79 20 69 44 62 20 2a 2f 0a 20 20 70 44 62 20 3d  y iDb */.  pDb =
4290: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
42a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
42b0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
42c0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
42d0: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70    assert( pDb->p
42e0: 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 73  Schema!=0 );.  s
42f0: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
4300: 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b  r(pDb->pSchema);
4310: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 64 61  ..  /* If any da
4320: 74 61 62 61 73 65 20 6f 74 68 65 72 20 74 68 61  tabase other tha
4330: 6e 20 54 45 4d 50 20 69 73 20 72 65 73 65 74 2c  n TEMP is reset,
4340: 20 74 68 65 6e 20 61 6c 73 6f 20 72 65 73 65 74   then also reset
4350: 20 54 45 4d 50 0a 20 20 2a 2a 20 73 69 6e 63 65   TEMP.  ** since
4360: 20 54 45 4d 50 20 6d 69 67 68 74 20 62 65 20 68   TEMP might be h
4370: 6f 6c 64 69 6e 67 20 74 72 69 67 67 65 72 73 20  olding triggers 
4380: 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
4390: 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a  ables in the.  *
43a0: 2a 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  * other database
43b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 62  ..  */.  if( iDb
43c0: 21 3d 31 20 29 7b 0a 20 20 20 20 70 44 62 20 3d  !=1 ){.    pDb =
43d0: 20 26 64 62 2d 3e 61 44 62 5b 31 5d 3b 0a 20 20   &db->aDb[1];.  
43e0: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70    assert( pDb->p
43f0: 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 20  Schema!=0 );.   
4400: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c   sqlite3SchemaCl
4410: 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61  ear(pDb->pSchema
4420: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b  );.  }.  return;
4430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
4440: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
4450: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20  mation from all 
4460: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
4470: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a  es (including.**
4480: 20 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65 6d   "main" and "tem
4490: 70 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  p") for a single
44a0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
44b0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
44c0: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
44d0: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
44e0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
44f0: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
4500: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
4510: 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  b);.  for(i=0; i
4520: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
4530: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
4540: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
4550: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20  f( pDb->pSchema 
4560: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4570: 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d  SchemaClear(pDb-
4580: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
4590: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
45a0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
45b0: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71 6c  rnChanges;.  sql
45c0: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
45d0: 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  st(db);.  sqlite
45e0: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
45f0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c  b);.  sqlite3Col
4600: 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72 72  lapseDatabaseArr
4610: 61 79 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ay(db);.}../*.**
4620: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4630: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63   called when a c
4640: 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f  ommit occurs..*/
4650: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
4660: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
4670: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
4680: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
4690: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  ~SQLITE_InternCh
46a0: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
46b0: 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20 61 6c  Delete memory al
46c0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
46d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 20  column names of 
46e0: 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  a table or view 
46f0: 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e 61 43  (the.** Table.aC
4700: 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a 2f 0a  ol[] array)..*/.
4710: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
4720: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73 71  teColumnNames(sq
4730: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
4740: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74   *pTable){.  int
4750: 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43   i;.  Column *pC
4760: 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  ol;.  assert( pT
4770: 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  able!=0 );.  if(
4780: 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d   (pCol = pTable-
4790: 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20  >aCol)!=0 ){.   
47a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
47b0: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  le->nCol; i++, p
47c0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  Col++){.      sq
47d0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
47e0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
47f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
4800: 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  elete(db, pCol->
4810: 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71  pDflt);.      sq
4820: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4830: 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20  pCol->zColl);.  
4840: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
4850: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
4860: 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a  ->aCol);.  }.}..
4870: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
4880: 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72   memory data str
4890: 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
48a0: 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
48b0: 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20  n.** Table.  No 
48c0: 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
48d0: 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73   to disk by this
48e0: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
48f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
4900: 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61  t deletes the da
4910: 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  ta structure.  I
4920: 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e  t does not unlin
4930: 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64  k.** the table d
4940: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72  ata structure fr
4950: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
4960: 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20  e.  But it does 
4970: 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72  destroy.** memor
4980: 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  y structures of 
4990: 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  the indices and 
49a0: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73  foreign keys ass
49b0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a  ociated with .**
49c0: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
49d0: 2a 20 54 68 65 20 64 62 20 70 61 72 61 6d 65 74  * The db paramet
49e0: 65 72 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20  er is optional. 
49f0: 20 49 74 20 69 73 20 6e 65 65 64 65 64 20 69 66   It is needed if
4a00: 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
4a10: 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6c  t .** contains l
4a20: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e  ookaside memory.
4a30: 20 20 28 54 61 62 6c 65 20 6f 62 6a 65 63 74 73    (Table objects
4a40: 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 64   in the schema d
4a50: 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f  o not use.** loo
4a60: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2c 20 62  kaside memory, b
4a70: 75 74 20 73 6f 6d 65 20 65 70 68 65 6d 65 72 61  ut some ephemera
4a80: 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20  l Table objects 
4a90: 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a 2a 2a 20  do.)  Or the.** 
4aa0: 64 62 20 70 61 72 61 6d 65 74 65 72 20 63 61 6e  db parameter can
4ab0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 64 62   be used with db
4ac0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 74  ->pnBytesFreed t
4ad0: 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20 6d 65  o measure the me
4ae0: 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20 62 79 20  mory.** used by 
4af0: 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
4b00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4b10: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
4b20: 20 64 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c   deleteTable(sql
4b30: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
4b40: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65  *pTable){.  Inde
4b50: 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78  x *pIndex, *pNex
4b60: 74 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69  t;.  TESTONLY( i
4b70: 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 3b 20 29  nt nLookaside; )
4b80: 20 2f 2a 20 55 73 65 64 20 74 6f 20 76 65 72 69   /* Used to veri
4b90: 66 79 20 6c 6f 6f 6b 61 73 69 64 65 20 6e 6f 74  fy lookaside not
4ba0: 20 75 73 65 64 20 66 6f 72 20 73 63 68 65 6d 61   used for schema
4bb0: 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64   */..  /* Record
4bc0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
4bd0: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61  utstanding looka
4be0: 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  side allocations
4bf0: 20 69 6e 20 73 63 68 65 6d 61 20 54 61 62 6c 65   in schema Table
4c00: 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20  s.  ** prior to 
4c10: 64 6f 69 6e 67 20 61 6e 79 20 66 72 65 65 28 29  doing any free()
4c20: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 53 69   operations.  Si
4c30: 6e 63 65 20 73 63 68 65 6d 61 20 54 61 62 6c 65  nce schema Table
4c40: 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20 20 2a  s do not use.  *
4c50: 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74 68 69  * lookaside, thi
4c60: 73 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20  s number should 
4c70: 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20  not change. */. 
4c80: 20 54 45 53 54 4f 4e 4c 59 28 20 6e 4c 6f 6f 6b   TESTONLY( nLook
4c90: 61 73 69 64 65 20 3d 20 28 64 62 20 26 26 20 28  aside = (db && (
4ca0: 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73  pTable->tabFlags
4cb0: 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
4cc0: 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20  ==0) ?.         
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ce0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
4cf0: 75 74 20 3a 20 30 20 29 3b 0a 0a 20 20 2f 2a 20  ut : 0 );..  /* 
4d00: 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63  Delete all indic
4d10: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
4d20: 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  th this table. *
4d30: 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d  /.  for(pIndex =
4d40: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b   pTable->pIndex;
4d50: 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d   pIndex; pIndex=
4d60: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
4d70: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
4d80: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
4d90: 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  Index->pSchema==
4da0: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 0a  pTable->pSchema.
4db0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 49 73 56           || (IsV
4dc0: 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 26  irtual(pTable) &
4dd0: 26 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70  & pIndex->idxTyp
4de0: 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50  e!=SQLITE_IDXTYP
4df0: 45 5f 41 50 50 44 45 46 29 20 29 3b 0a 20 20 20  E_APPDEF) );.   
4e00: 20 69 66 28 20 28 64 62 3d 3d 30 20 7c 7c 20 64   if( (db==0 || d
4e10: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
4e20: 3d 30 29 20 26 26 20 21 49 73 56 69 72 74 75 61  =0) && !IsVirtua
4e30: 6c 28 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20  l(pTable) ){.   
4e40: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
4e50: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20   pIndex->zName; 
4e60: 0a 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 20  .      TESTONLY 
4e70: 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d 20  ( Index *pOld = 
4e80: 29 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  ) sqlite3HashIns
4e90: 65 72 74 28 0a 20 20 20 20 20 20 20 20 20 26 70  ert(.         &p
4ea0: 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e  Index->pSchema->
4eb0: 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  idxHash, zName, 
4ec0: 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  0.      );.     
4ed0: 20 61 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c   assert( db==0 |
4ee0: 7c 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  | sqlite3SchemaM
4ef0: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
4f00: 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
4f10: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
4f20: 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c  ( pOld==pIndex |
4f30: 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20  | pOld==0 );.   
4f40: 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78   }.    freeIndex
4f50: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
4f60: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  }..  /* Delete a
4f70: 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  ny foreign keys 
4f80: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 69 73  attached to this
4f90: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c   table. */.  sql
4fa0: 69 74 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c  ite3FkDelete(db,
4fb0: 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20   pTable);..  /* 
4fc0: 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65  Delete the Table
4fd0: 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c   structure itsel
4fe0: 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  f..  */.  sqlite
4ff0: 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d  3DeleteColumnNam
5000: 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  es(db, pTable);.
5010: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5020: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  db, pTable->zNam
5030: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
5040: 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  ree(db, pTable->
5050: 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69  zColAff);.  sqli
5060: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
5070: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  db, pTable->pSel
5080: 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ect);.  sqlite3E
5090: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
50a0: 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b  , pTable->pCheck
50b0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
50c0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
50d0: 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61  BLE.  sqlite3Vta
50e0: 62 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c  bClear(db, pTabl
50f0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  e);.#endif.  sql
5100: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5110: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65  Table);..  /* Ve
5120: 72 69 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f  rify that no loo
5130: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61  kaside memory wa
5140: 73 20 75 73 65 64 20 62 79 20 73 63 68 65 6d 61  s used by schema
5150: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73   tables */.  ass
5160: 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d  ert( nLookaside=
5170: 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65  =0 || nLookaside
5180: 3d 3d 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ==db->lookaside.
5190: 6e 4f 75 74 20 29 3b 0a 7d 0a 76 6f 69 64 20 73  nOut );.}.void s
51a0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
51b0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  e(sqlite3 *db, T
51c0: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
51d0: 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74   /* Do not delet
51e0: 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e 74 69  e the table unti
51f0: 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  l the reference 
5200: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
5210: 72 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 21 70 54  ro. */.  if( !pT
5220: 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  able ) return;. 
5230: 20 69 66 28 20 28 28 21 64 62 20 7c 7c 20 64 62   if( ((!db || db
5240: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
5250: 30 29 20 26 26 20 28 2d 2d 70 54 61 62 6c 65 2d  0) && (--pTable-
5260: 3e 6e 54 61 62 52 65 66 29 3e 30 29 20 29 20 72  >nTabRef)>0) ) r
5270: 65 74 75 72 6e 3b 0a 20 20 64 65 6c 65 74 65 54  eturn;.  deleteT
5280: 61 62 6c 65 28 64 62 2c 20 70 54 61 62 6c 65 29  able(db, pTable)
5290: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  ;.}.../*.** Unli
52a0: 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62  nk the given tab
52b0: 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  le from the hash
52c0: 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20   tables and the 
52d0: 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61  delete the.** ta
52e0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69  ble structure wi
52f0: 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63  th all its indic
5300: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
5310: 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  eys..*/.void sql
5320: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
5330: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
5340: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
5350: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e  onst char *zTabN
5360: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
5370: 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20  ;.  Db *pDb;..  
5380: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
5390: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
53a0: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
53b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54   );.  assert( zT
53c0: 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65  abName );.  asse
53d0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
53e0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
53f0: 44 62 2c 20 30 29 20 29 3b 0a 20 20 74 65 73 74  Db, 0) );.  test
5400: 63 61 73 65 28 20 7a 54 61 62 4e 61 6d 65 5b 30  case( zTabName[0
5410: 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a 65 72 6f  ]==0 );  /* Zero
5420: 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65 20 6e 61  -length table na
5430: 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  mes are allowed 
5440: 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  */.  pDb = &db->
5450: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20  aDb[iDb];.  p = 
5460: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
5470: 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t(&pDb->pSchema-
5480: 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61  >tblHash, zTabNa
5490: 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  me, 0);.  sqlite
54a0: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
54b0: 20 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73   p);.  db->flags
54c0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
54d0: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
54e0: 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e  ** Given a token
54f0: 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e  , return a strin
5500: 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  g that consists 
5510: 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  of the text of t
5520: 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20 20 53  hat.** token.  S
5530: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
5540: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
5550: 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20  .** is obtained 
5560: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
5570: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
5580: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
5590: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
55a0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75 6f 74  ..**.** Any quot
55b0: 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28 65 78 3a  ation marks (ex:
55c0: 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61 6d 65 27    "name", 'name'
55d0: 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60 6e 61  , [name], or `na
55e0: 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20 73 75 72  me`) that.** sur
55f0: 72 6f 75 6e 64 20 74 68 65 20 62 6f 64 79 20 6f  round the body o
5600: 66 20 74 68 65 20 74 6f 6b 65 6e 20 61 72 65 20  f the token are 
5610: 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  removed..**.** T
5620: 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20  okens are often 
5630: 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e  just pointers in
5640: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
5650: 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a  SQL text and so.
5660: 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20  ** are not \000 
5670: 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61  terminated and a
5680: 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e  re not persisten
5690: 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64  t.  The returned
56a0: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30   string.** is \0
56b0: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e  00 terminated an
56c0: 64 20 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e  d is persistent.
56d0: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
56e0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73  3NameFromToken(s
56f0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65  qlite3 *db, Toke
5700: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61  n *pName){.  cha
5710: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20  r *zName;.  if( 
5720: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  pName ){.    zNa
5730: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
5740: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
5750: 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65  )pName->z, pName
5760: 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ->n);.    sqlite
5770: 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b  3Dequote(zName);
5780: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e  .  }else{.    zN
5790: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
57a0: 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a  eturn zName;.}..
57b0: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73  /*.** Open the s
57c0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
57d0: 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74  le stored in dat
57e0: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62  abase number iDb
57f0: 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e   for.** writing.
5800: 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70   The table is op
5810: 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f  ened using curso
5820: 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  r 0..*/.void sql
5830: 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61  ite3OpenMasterTa
5840: 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20 69 6e  ble(Parse *p, in
5850: 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
5860: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
5870: 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  be(p);.  sqlite3
5880: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62  TableLock(p, iDb
5890: 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31  , MASTER_ROOT, 1
58a0: 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 29 3b 0a  , MASTER_NAME);.
58b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
58c0: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65  Op4Int(v, OP_Ope
58d0: 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45  nWrite, 0, MASTE
58e0: 52 5f 52 4f 4f 54 2c 20 69 44 62 2c 20 35 29 3b  R_ROOT, iDb, 5);
58f0: 0a 20 20 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d  .  if( p->nTab==
5900: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62  0 ){.    p->nTab
5910: 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
5920: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61  ** Parameter zNa
5930: 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e  me points to a n
5940: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 62 75  ul-terminated bu
5950: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
5960: 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61  the name.** of a
5970: 20 64 61 74 61 62 61 73 65 20 28 22 6d 61 69 6e   database ("main
5980: 22 2c 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65  ", "temp" or the
5990: 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61   name of an atta
59a0: 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 0a 2a  ched db). This.*
59b0: 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
59c0: 6e 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  ns the index of 
59d0: 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61  the named databa
59e0: 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c  se in db->aDb[],
59f0: 20 6f 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65   or.** -1 if the
5a00: 20 6e 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74   named db cannot
5a10: 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e   be found..*/.in
5a20: 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  t sqlite3FindDbN
5a30: 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ame(sqlite3 *db,
5a40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
5a50: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d  me){.  int i = -
5a60: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  1;         /* Da
5a70: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f  tabase number */
5a80: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a  .  if( zName ){.
5a90: 20 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20      Db *pDb;.   
5aa0: 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d   for(i=(db->nDb-
5ab0: 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62  1), pDb=&db->aDb
5ac0: 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  [i]; i>=0; i--, 
5ad0: 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  pDb--){.      if
5ae0: 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  ( 0==sqlite3_str
5af0: 69 63 6d 70 28 70 44 62 2d 3e 7a 44 62 53 4e 61  icmp(pDb->zDbSNa
5b00: 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 20 62 72 65  me, zName) ) bre
5b10: 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 22 6d 61  ak;.      /* "ma
5b20: 69 6e 22 20 69 73 20 61 6c 77 61 79 73 20 61 6e  in" is always an
5b30: 20 61 63 63 65 70 74 61 62 6c 65 20 61 6c 69 61   acceptable alia
5b40: 73 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72  s for the primar
5b50: 79 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  y database.     
5b60: 20 2a 2a 20 65 76 65 6e 20 69 66 20 69 74 20 68   ** even if it h
5b70: 61 73 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20  as been renamed 
5b80: 75 73 69 6e 67 20 53 51 4c 49 54 45 5f 44 42 43  using SQLITE_DBC
5b90: 4f 4e 46 49 47 5f 4d 41 49 4e 44 42 4e 41 4d 45  ONFIG_MAINDBNAME
5ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  . */.      if( i
5bb0: 3d 3d 30 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  ==0 && 0==sqlite
5bc0: 33 5f 73 74 72 69 63 6d 70 28 22 6d 61 69 6e 22  3_stricmp("main"
5bd0: 2c 20 7a 4e 61 6d 65 29 20 29 20 62 72 65 61 6b  , zName) ) break
5be0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
5bf0: 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn i;.}../*.**
5c00: 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d   The token *pNam
5c10: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  e contains the n
5c20: 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73  ame of a databas
5c30: 65 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22  e (either "main"
5c40: 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72   or.** "temp" or
5c50: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
5c60: 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68  attached db). Th
5c70: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
5c80: 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20  ns the.** index 
5c90: 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74  of the named dat
5ca0: 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62  abase in db->aDb
5cb0: 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65  [], or -1 if the
5cc0: 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f   named db .** do
5cd0: 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f  es not exist..*/
5ce0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
5cf0: 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  Db(sqlite3 *db, 
5d00: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
5d10: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d30: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
5d40: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68  e number */.  ch
5d50: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d70: 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72     /* Name we ar
5d80: 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  e searching for 
5d90: 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  */.  zName = sql
5da0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
5db0: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
5dc0: 69 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  i = sqlite3FindD
5dd0: 62 4e 61 6d 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bName(db, zName)
5de0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
5df0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
5e00: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20  return i;.}../* 
5e10: 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  The table or vie
5e20: 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d  w or trigger nam
5e30: 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  e is passed to t
5e40: 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20  his routine via 
5e50: 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31  tokens.** pName1
5e60: 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20   and pName2. If 
5e70: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
5e80: 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  as fully qualifi
5e90: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a  ed, for example:
5ea0: 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41  .**.** CREATE TA
5eb0: 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e  BLE xxx.yyy (...
5ec0: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70  );.** .** Then p
5ed0: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
5ee0: 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32  "xxx" and pName2
5ef0: 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f   "yyy". On the o
5f00: 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20  ther hand if.** 
5f10: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
5f20: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
5f30: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a  ified, i.e.:.**.
5f40: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
5f50: 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20  yyy(...);.**.** 
5f60: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
5f70: 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20  et to "yyy" and 
5f80: 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a  pName2 is ""..**
5f90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5fa0: 20 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71   sets the *ppUnq
5fb0: 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  ual pointer to p
5fc0: 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65  oint at the toke
5fd0: 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20  n (pName1 or.** 
5fe0: 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f  pName2) that sto
5ff0: 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66  res the unqualif
6000: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ied table name. 
6010: 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   The index of th
6020: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78  e.** database "x
6030: 78 78 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e  xx" is returned.
6040: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
6050: 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61  woPartName(.  Pa
6060: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
6070: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
6080: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
6090: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
60a0: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
60b0: 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69    /* The "xxx" i
60c0: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
60d0: 79 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f  yyy" or "xxx" */
60e0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
60f0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79  ,      /* The "y
6100: 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  yy" in the name 
6110: 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54  "xxx.yyy" */.  T
6120: 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20  oken **pUnqual  
6130: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
6140: 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65  unqualified obje
6150: 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a  ct name here */.
6160: 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  ){.  int iDb;   
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6180: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
6190: 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20  ding the object 
61a0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
61b0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
61c0: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 32    assert( pName2
61d0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 61  !=0 );.  if( pNa
61e0: 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  me2->n>0 ){.    
61f0: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
6200: 79 20 29 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  y ) {.      sqli
6210: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
6220: 73 65 2c 20 22 63 6f 72 72 75 70 74 20 64 61 74  se, "corrupt dat
6230: 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20 72  abase");.      r
6240: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
6250: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
6260: 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d  Name2;.    iDb =
6270: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64   sqlite3FindDb(d
6280: 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
6290: 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20  if( iDb<0 ){.   
62a0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
62b0: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
62c0: 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22  own database %T"
62d0: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20  , pName1);.     
62e0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
62f0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
6300: 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e  ssert( db->init.
6310: 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e  iDb==0 || db->in
6320: 69 74 2e 62 75 73 79 20 7c 7c 20 28 64 62 2d 3e  it.busy || (db->
6330: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
6340: 61 63 75 75 6d 29 21 3d 30 29 3b 0a 20 20 20 20  acuum)!=0);.    
6350: 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69  iDb = db->init.i
6360: 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c  Db;.    *pUnqual
6370: 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20   = pName1;.  }. 
6380: 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a   return iDb;.}..
6390: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
63a0: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  ne is used to ch
63b0: 65 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38  eck if the UTF-8
63c0: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73   string zName is
63d0: 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75   a legal.** unqu
63e0: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72  alified name for
63f0: 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62   a new schema ob
6400: 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64  ject (table, ind
6410: 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74  ex, view or.** t
6420: 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d  rigger). All nam
6430: 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63  es are legal exc
6440: 65 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62  ept those that b
6450: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74  egin with the st
6460: 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f  ring.** "sqlite_
6470: 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77  " (in upper, low
6480: 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65  er or mixed case
6490: 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20  ). This portion 
64a0: 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65  of the namespace
64b0: 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20  .** is reserved 
64c0: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65  for internal use
64d0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
64e0: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
64f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
6500: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
6510: 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  ){.  if( !pParse
6520: 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ->db->init.busy 
6530: 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  && pParse->neste
6540: 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  d==0 .          
6550: 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  && (pParse->db->
6560: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57  flags & SQLITE_W
6570: 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20  riteSchema)==0. 
6580: 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
6590: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
65a0: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
65b0: 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   7) ){.    sqlit
65c0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
65d0: 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20  e, "object name 
65e0: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
65f0: 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20  ernal use: %s", 
6600: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
6610: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
6620: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
6630: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6640: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 52 49  * Return the PRI
6650: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f  MARY KEY index o
6660: 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64  f a table.*/.Ind
6670: 65 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d 61  ex *sqlite3Prima
6680: 72 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c 65  ryKeyIndex(Table
6690: 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78   *pTab){.  Index
66a0: 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61   *p;.  for(p=pTa
66b0: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20  b->pIndex; p && 
66c0: 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  !IsPrimaryKeyInd
66d0: 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e 65 78  ex(p); p=p->pNex
66e0: 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  t){}.  return p;
66f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6700: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69   the column of i
6710: 6e 64 65 78 20 70 49 64 78 20 74 68 61 74 20 63  ndex pIdx that c
6720: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 61  orresponds to ta
6730: 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43  ble.** column iC
6740: 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  ol.  Return -1 i
6750: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
6760: 69 31 36 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  i16 sqlite3Colum
6770: 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  nOfIndex(Index *
6780: 70 49 64 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b  pIdx, i16 iCol){
6790: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
67a0: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  i=0; i<pIdx->nCo
67b0: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
67c0: 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e  if( iCol==pIdx->
67d0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65  aiColumn[i] ) re
67e0: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
67f0: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
6800: 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63  * Begin construc
6810: 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
6820: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
6830: 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73  in memory.  This
6840: 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
6850: 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69   of several acti
6860: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  on routines that
6870: 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72   get called in r
6880: 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20  esponse.** to a 
6890: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
68a0: 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74  tement.  In part
68b0: 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75  icular, this rou
68c0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a  tine is called.*
68d0: 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74  * after seeing t
68e0: 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61  okens "CREATE" a
68f0: 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74  nd "TABLE" and t
6900: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54  he table name. T
6910: 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61  he isTemp.** fla
6920: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
6930: 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65   table should be
6940: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
6950: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
6960: 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61  e.** file instea
6970: 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e  d of in the main
6980: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
6990: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
69a0: 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68  y the case.** wh
69b0: 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72  en the "TEMP" or
69c0: 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79   "TEMPORARY" key
69d0: 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62  word occurs in b
69e0: 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45  etween.** CREATE
69f0: 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a   and TABLE..**.*
6a00: 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
6a10: 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61  record is initia
6a20: 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e  lized and put in
6a30: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6a40: 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f  le..** As more o
6a50: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
6a60: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  LE statement is 
6a70: 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e  parsed, addition
6a80: 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75  al action.** rou
6a90: 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61  tines will be ca
6aa0: 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65  lled to add more
6ab0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
6ac0: 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20  this record..** 
6ad0: 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
6ae0: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
6af0: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71  tatement, the sq
6b00: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
6b10: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
6b20: 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
6b30: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f   the constructio
6b40: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  n of the new tab
6b50: 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f  le record..*/.vo
6b60: 69 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  id sqlite3StartT
6b70: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
6b80: 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
6b90: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
6ba0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
6bb0: 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
6bc0: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
6bd0: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
6be0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
6bf0: 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  e2,   /* Second 
6c00: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
6c10: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
6c20: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
6c30: 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54  sTemp,      /* T
6c40: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
6c50: 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20   TEMP table */. 
6c60: 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20   int isView,    
6c70: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
6c80: 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20  s is a VIEW */. 
6c90: 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20   int isVirtual, 
6ca0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
6cb0: 73 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74  s is a VIRTUAL t
6cc0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  able */.  int no
6cd0: 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  Err        /* Do
6ce0: 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c   nothing if tabl
6cf0: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
6d00: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
6d10: 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  pTable;.  char *
6d20: 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68  zName = 0; /* Th
6d30: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65  e name of the ne
6d40: 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  w table */.  sql
6d50: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
6d60: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
6d70: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  ;.  int iDb;    
6d80: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
6d90: 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74   number to creat
6da0: 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a  e the table in *
6db0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
6dc0: 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
6dd0: 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
6de0: 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  table to create 
6df0: 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e  */..  if( db->in
6e00: 69 74 2e 62 75 73 79 20 26 26 20 64 62 2d 3e 69  it.busy && db->i
6e10: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31 20 29  nit.newTnum==1 )
6e20: 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63 69 61 6c  {.    /* Special
6e30: 20 63 61 73 65 3a 20 20 50 61 72 73 69 6e 67 20   case:  Parsing 
6e40: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
6e50: 72 20 6f 72 20 73 71 6c 69 74 65 5f 74 65 6d 70  r or sqlite_temp
6e60: 5f 6d 61 73 74 65 72 20 73 63 68 65 6d 61 20 2a  _master schema *
6e70: 2f 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e  /.    iDb = db->
6e80: 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 7a 4e  init.iDb;.    zN
6e90: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
6ea0: 74 72 44 75 70 28 64 62 2c 20 53 43 48 45 4d 41  trDup(db, SCHEMA
6eb0: 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20  _TABLE(iDb));.  
6ec0: 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 31    pName = pName1
6ed0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
6ee0: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
6ef0: 65 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73  e */.    iDb = s
6f00: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
6f10: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
6f20: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
6f30: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
6f40: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
6f50: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
6f60: 26 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e 61  && isTemp && pNa
6f70: 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21  me2->n>0 && iDb!
6f80: 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =1 ){.      /* I
6f90: 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d  f creating a tem
6fa0: 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d  p table, the nam
6fb0: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61  e may not be qua
6fc0: 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a  lified. Unless .
6fd0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
6fe0: 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22 74  abase name is "t
6ff0: 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f  emp" anyway.  */
7000: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
7010: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7020: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
7030: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71  name must be unq
7040: 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20  ualified");.    
7050: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
7060: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
7070: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
7080: 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7a 4e   iDb = 1;.    zN
7090: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
70a0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
70b0: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61  Name);.  }.  pPa
70c0: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20  rse->sNameToken 
70d0: 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 66 28 20  = *pName;.  if( 
70e0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
70f0: 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  n;.  if( SQLITE_
7100: 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
7110: 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
7120: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
7130: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
7140: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69  e_error;.  }.  i
7150: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  f( db->init.iDb=
7160: 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b  =1 ) isTemp = 1;
7170: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7180: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
7190: 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 69 73 54  ON.  assert( isT
71a0: 65 6d 70 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70  emp==0 || isTemp
71b0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
71c0: 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73   isView==0 || is
71d0: 56 69 65 77 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20  View==1 );.  {. 
71e0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
71f0: 75 38 20 61 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20  u8 aCode[] = {. 
7200: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45        SQLITE_CRE
7210: 41 54 45 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20  ATE_TABLE,.     
7220: 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f    SQLITE_CREATE_
7230: 54 45 4d 50 5f 54 41 42 4c 45 2c 0a 20 20 20 20  TEMP_TABLE,.    
7240: 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45     SQLITE_CREATE
7250: 5f 56 49 45 57 2c 0a 20 20 20 20 20 20 20 53 51  _VIEW,.       SQ
7260: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
7270: 5f 56 49 45 57 0a 20 20 20 20 7d 3b 0a 20 20 20  _VIEW.    };.   
7280: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
7290: 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
72a0: 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
72b0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
72c0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
72d0: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
72e0: 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62  (isTemp), 0, zDb
72f0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
7300: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
7310: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
7320: 20 21 69 73 56 69 72 74 75 61 6c 20 26 26 20 73   !isVirtual && s
7330: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
7340: 70 50 61 72 73 65 2c 20 28 69 6e 74 29 61 43 6f  pParse, (int)aCo
7350: 64 65 5b 69 73 54 65 6d 70 2b 32 2a 69 73 56 69  de[isTemp+2*isVi
7360: 65 77 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ew],.           
7370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7380: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
7390: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
73a0: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
73b0: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
73c0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
73d0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
73e0: 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20   new table name 
73f0: 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65  does not collide
7400: 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e   with an existin
7410: 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  g.  ** index or 
7420: 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68  table name in th
7430: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e  e same database.
7440: 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72    Issue an error
7450: 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a   message if.  **
7460: 20 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78   it does. The ex
7470: 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68  ception is if th
7480: 65 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  e statement bein
7490: 67 20 70 61 72 73 65 64 20 77 61 73 20 70 61 73  g parsed was pas
74a0: 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73  sed.  ** to an s
74b0: 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
74c0: 74 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74  tab() call. In t
74d0: 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68  hat case only th
74e0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20  e column names. 
74f0: 20 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69   ** and types wi
7500: 6c 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74  ll be used, so t
7510: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
7520: 74 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65  to test for name
7530: 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69  space.  ** colli
7540: 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  sions..  */.  if
7550: 28 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  ( !IN_DECLARE_VT
7560: 41 42 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  AB ){.    char *
7570: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
7580: 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b].zDbSName;.   
7590: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
75a0: 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
75b0: 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
75c0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
75d0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
75e0: 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 73 71  .    pTable = sq
75f0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
7600: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a  b, zName, zDb);.
7610: 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20 29      if( pTable )
7620: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f 45  {.      if( !noE
7630: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rr ){.        sq
7640: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7650: 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20  arse, "table %T 
7660: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
7670: 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   pName);.      }
7680: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
7690: 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
76a0: 62 75 73 79 20 7c 7c 20 43 4f 52 52 55 50 54 5f  busy || CORRUPT_
76b0: 44 42 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  DB );.        sq
76c0: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
76d0: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
76e0: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
76f0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
7700: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
7710: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
7720: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
7730: 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20  me, zDb)!=0 ){. 
7740: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7750: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
7760: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
7770: 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73  n index named %s
7780: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
7790: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
77a0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
77b0: 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20 73   }..  pTable = s
77c0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
77d0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
77e0: 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61  ble));.  if( pTa
77f0: 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ble==0 ){.    as
7800: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
7810: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 50  Failed );.    pP
7820: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
7830: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
7840: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
7850: 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  ;.    goto begin
7860: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
7870: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  }.  pTable->zNam
7880: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61  e = zName;.  pTa
7890: 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  ble->iPKey = -1;
78a0: 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  .  pTable->pSche
78b0: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
78c0: 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61  ].pSchema;.  pTa
78d0: 62 6c 65 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31  ble->nTabRef = 1
78e0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77  ;.  pTable->nRow
78f0: 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73  LogEst = 200; as
7900: 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74  sert( 200==sqlit
7910: 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36  e3LogEst(1048576
7920: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
7930: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
7940: 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  ==0 );.  pParse-
7950: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61  >pNewTable = pTa
7960: 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ble;..  /* If th
7970: 69 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20  is is the magic 
7980: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
7990: 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75  table used by au
79a0: 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a  toincrement,.  *
79b0: 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20  * then record a 
79c0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
79d0: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69  table in the mai
79e0: 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
79f0: 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61  ture.  ** so tha
7a00: 74 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e  t INSERT can fin
7a10: 64 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69  d the table easi
7a20: 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
7a30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
7a40: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28  OINCREMENT.  if(
7a50: 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64   !pParse->nested
7a60: 20 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65   && strcmp(zName
7a70: 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  , "sqlite_sequen
7a80: 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ce")==0 ){.    a
7a90: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
7aa0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
7ab0: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
7ac0: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
7ad0: 2d 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62  ->pSeqTab = pTab
7ae0: 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
7af0: 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
7b00: 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74  ating the code t
7b10: 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20  hat will insert 
7b20: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
7b30: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53   into.  ** the S
7b40: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
7b50: 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72  le.  Note in par
7b60: 74 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20  ticular that we 
7b70: 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20  must go ahead.  
7b80: 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  ** and allocate 
7b90: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
7ba0: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
7bb0: 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f  entry now.  Befo
7bc0: 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d  re any.  ** PRIM
7bd0: 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
7be0: 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70  E keywords are p
7bf0: 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65  arsed.  Those ke
7c00: 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73  ywords will caus
7c10: 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74  e.  ** indices t
7c20: 6f 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64  o be created and
7c30: 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72   the table recor
7c40: 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f  d must come befo
7c50: 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64  re the .  ** ind
7c60: 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68  ices.  Hence, th
7c70: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
7c80: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75  for the table mu
7c90: 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a  st be allocated.
7ca0: 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20    ** now..  */. 
7cb0: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
7cc0: 75 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69  usy && (v = sqli
7cd0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
7ce0: 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  e))!=0 ){.    in
7cf0: 74 20 61 64 64 72 31 3b 0a 20 20 20 20 69 6e 74  t addr1;.    int
7d00: 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20   fileFormat;.   
7d10: 20 69 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c   int reg1, reg2,
7d20: 20 72 65 67 33 3b 0a 20 20 20 20 2f 2a 20 6e 75   reg3;.    /* nu
7d30: 6c 6c 52 6f 77 5b 5d 20 69 73 20 61 6e 20 4f 50  llRow[] is an OP
7d40: 5f 52 65 63 6f 72 64 20 65 6e 63 6f 64 69 6e 67  _Record encoding
7d50: 20 6f 66 20 61 20 72 6f 77 20 63 6f 6e 74 61 69   of a row contai
7d60: 6e 69 6e 67 20 35 20 4e 55 4c 4c 73 20 2a 2f 0a  ning 5 NULLs */.
7d70: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
7d80: 20 63 68 61 72 20 6e 75 6c 6c 52 6f 77 5b 5d 20   char nullRow[] 
7d90: 3d 20 7b 20 36 2c 20 30 2c 20 30 2c 20 30 2c 20  = { 6, 0, 0, 0, 
7da0: 30 2c 20 30 20 7d 3b 0a 20 20 20 20 73 71 6c 69  0, 0 };.    sqli
7db0: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
7dc0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
7dd0: 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
7de0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
7df0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
7e00: 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20  ( isVirtual ){. 
7e10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7e20: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65  AddOp0(v, OP_VBe
7e30: 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  gin);.    }.#end
7e40: 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  if..    /* If th
7e50: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e  e file format an
7e60: 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68  d encoding in th
7e70: 65 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20  e database have 
7e80: 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20  not been set, . 
7e90: 20 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e     ** set them n
7ea0: 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ow..    */.    r
7eb0: 65 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65  eg1 = pParse->re
7ec0: 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73  gRowid = ++pPars
7ed0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67  e->nMem;.    reg
7ee0: 32 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52  2 = pParse->regR
7ef0: 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  oot = ++pParse->
7f00: 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d  nMem;.    reg3 =
7f10: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
7f20: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7f30: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61  AddOp3(v, OP_Rea
7f40: 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65  dCookie, iDb, re
7f50: 67 33 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46  g3, BTREE_FILE_F
7f60: 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c 69  ORMAT);.    sqli
7f70: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
7f80: 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 61 64  (v, iDb);.    ad
7f90: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
7fa0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
7fb0: 2c 20 72 65 67 33 29 3b 20 56 64 62 65 43 6f 76  , reg3); VdbeCov
7fc0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 66 69  erage(v);.    fi
7fd0: 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e  leFormat = (db->
7fe0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c  flags & SQLITE_L
7ff0: 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30  egacyFileFmt)!=0
8000: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
8010: 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f       1 : SQLITE_
8020: 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b  MAX_FILE_FORMAT;
8030: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8040: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
8050: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52  Cookie, iDb, BTR
8060: 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20  EE_FILE_FORMAT, 
8070: 66 69 6c 65 46 6f 72 6d 61 74 29 3b 0a 20 20 20  fileFormat);.   
8080: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8090: 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
80a0: 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 54  ie, iDb, BTREE_T
80b0: 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20 45 4e  EXT_ENCODING, EN
80c0: 43 28 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69  C(db));.    sqli
80d0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
80e0: 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 20 20  v, addr1);..    
80f0: 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65  /* This just cre
8100: 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c  ates a place-hol
8110: 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68  der record in th
8120: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
8130: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68  table..    ** Th
8140: 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64  e record created
8150: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
8160: 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20  n anything yet. 
8170: 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c   It will be repl
8180: 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  aced.    ** by t
8190: 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e  he real entry in
81a0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
81b0: 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  at sqlite3EndTab
81c0: 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  le()..    **.   
81d0: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
81e0: 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  r the new entry 
81f0: 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73  is left in regis
8200: 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52  ter pParse->regR
8210: 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65  owid..    ** The
8220: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
8230: 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  r of the new tab
8240: 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  le is left in re
8250: 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  g pParse->regRoo
8260: 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  t..    ** The ro
8270: 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67  wid and root pag
8280: 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20  e number values 
8290: 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68  are needed by th
82a0: 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20  e code that.    
82b0: 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  ** sqlite3EndTab
82c0: 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  le will generate
82d0: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65  ..    */.#if !de
82e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
82f0: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
8300: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
8310: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
8320: 20 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20    if( isView || 
8330: 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20  isVirtual ){.   
8340: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8350: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
8360: 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20  er, 0, reg2);.  
8370: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
8380: 20 20 20 7b 0a 20 20 20 20 20 20 70 50 61 72 73     {.      pPars
8390: 65 2d 3e 61 64 64 72 43 72 54 61 62 20 3d 20 73  e->addrCrTab = s
83a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
83b0: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
83c0: 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a  le, iDb, reg2);.
83d0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
83e0: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
83f0: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
8400: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8410: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
8420: 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20  wid, 0, reg1);. 
8430: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8440: 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
8450: 20 36 2c 20 72 65 67 33 2c 20 30 2c 20 6e 75 6c   6, reg3, 0, nul
8460: 6c 52 6f 77 2c 20 50 34 5f 53 54 41 54 49 43 29  lRow, P4_STATIC)
8470: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8480: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
8490: 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c 20 72  sert, 0, reg3, r
84a0: 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg1);.    sqlite
84b0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
84c0: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
84d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
84e0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp0(v, OP_Clo
84f0: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  se);.  }..  /* N
8500: 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72  ormal (non-error
8510: 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72  ) return. */.  r
8520: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  eturn;..  /* If 
8530: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
8540: 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f   we jump here */
8550: 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72  .begin_table_err
8560: 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  or:.  sqlite3DbF
8570: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
8580: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
8590: 53 65 74 20 70 72 6f 70 65 72 74 69 65 73 20 6f  Set properties o
85a0: 66 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  f a table column
85b0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 28 6d   based on the (m
85c0: 61 67 69 63 61 6c 29 0a 2a 2a 20 6e 61 6d 65 20  agical).** name 
85d0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a  of the column..*
85e0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
85f0: 42 4c 45 5f 48 49 44 44 45 4e 5f 43 4f 4c 55 4d  BLE_HIDDEN_COLUM
8600: 4e 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  NS.void sqlite3C
8610: 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46  olumnPropertiesF
8620: 72 6f 6d 4e 61 6d 65 28 54 61 62 6c 65 20 2a 70  romName(Table *p
8630: 54 61 62 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  Tab, Column *pCo
8640: 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  l){.  if( sqlite
8650: 33 5f 73 74 72 6e 69 63 6d 70 28 70 43 6f 6c 2d  3_strnicmp(pCol-
8660: 3e 7a 4e 61 6d 65 2c 20 22 5f 5f 68 69 64 64 65  >zName, "__hidde
8670: 6e 5f 5f 22 2c 20 31 30 29 3d 3d 30 20 29 7b 0a  n__", 10)==0 ){.
8680: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
8690: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 49  gs |= COLFLAG_HI
86a0: 44 44 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DDEN;.  }else if
86b0: 28 20 70 54 61 62 20 26 26 20 70 43 6f 6c 21 3d  ( pTab && pCol!=
86c0: 70 54 61 62 2d 3e 61 43 6f 6c 20 26 26 20 28 70  pTab->aCol && (p
86d0: 43 6f 6c 5b 2d 31 5d 2e 63 6f 6c 46 6c 61 67 73  Col[-1].colFlags
86e0: 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45   & COLFLAG_HIDDE
86f0: 4e 29 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  N) ){.    pTab->
8700: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 4f  tabFlags |= TF_O
8710: 4f 4f 48 69 64 64 65 6e 3b 0a 20 20 7d 0a 7d 0a  OOHidden;.  }.}.
8720: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
8730: 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20  dd a new column 
8740: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
8750: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
8760: 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  structed..**.** 
8770: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
8780: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
8790: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
87a0: 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  mn declaration.*
87b0: 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  * in a CREATE TA
87c0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
87d0: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
87e0: 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a  e() gets called.
87f0: 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20  ** first to get 
8800: 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54  things going.  T
8810: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
8820: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65   is called for e
8830: 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a  ach.** column..*
8840: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
8850: 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70  dColumn(Parse *p
8860: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
8870: 61 6d 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70  ame, Token *pTyp
8880: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
8890: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
88a0: 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70  *z;.  char *zTyp
88b0: 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  e;.  Column *pCo
88c0: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
88d0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
88e0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
88f0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
8900: 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 53 51  ) return;.#if SQ
8910: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a  LITE_MAX_COLUMN.
8920: 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e    if( p->nCol+1>
8930: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
8940: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
8950: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
8960: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8970: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
8980: 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d   on %s", p->zNam
8990: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
89a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 20 3d    }.#endif.  z =
89b0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
89c0: 52 61 77 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e  Raw(db, pName->n
89d0: 20 2b 20 70 54 79 70 65 2d 3e 6e 20 2b 20 32 29   + pType->n + 2)
89e0: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
89f0: 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 63 70 79 28  eturn;.  memcpy(
8a00: 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  z, pName->z, pNa
8a10: 6d 65 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 4e 61 6d  me->n);.  z[pNam
8a20: 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  e->n] = 0;.  sql
8a30: 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a  ite3Dequote(z);.
8a40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
8a50: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
8a60: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
8a70: 63 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69  cmp(z, p->aCol[i
8a80: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
8a90: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8aa0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
8ab0: 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e  plicate column n
8ac0: 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ame: %s", z);.  
8ad0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8ae0: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
8af0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
8b00: 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c  }.  if( (p->nCol
8b10: 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20   & 0x7)==0 ){.  
8b20: 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a    Column *aNew;.
8b30: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
8b40: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70  e3DbRealloc(db,p
8b50: 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b  ->aCol,(p->nCol+
8b60: 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  8)*sizeof(p->aCo
8b70: 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  l[0]));.    if( 
8b80: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
8b90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8ba0: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  b, z);.      ret
8bb0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
8bc0: 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20  ->aCol = aNew;. 
8bd0: 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e   }.  pCol = &p->
8be0: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20  aCol[p->nCol];. 
8bf0: 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c   memset(pCol, 0,
8c00: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b   sizeof(p->aCol[
8c10: 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e  0]));.  pCol->zN
8c20: 61 6d 65 20 3d 20 7a 3b 0a 20 20 73 71 6c 69 74  ame = z;.  sqlit
8c30: 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69  e3ColumnProperti
8c40: 65 73 46 72 6f 6d 4e 61 6d 65 28 70 2c 20 70 43  esFromName(p, pC
8c50: 6f 6c 29 3b 0a 20 0a 20 20 69 66 28 20 70 54 79  ol);. .  if( pTy
8c60: 70 65 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  pe->n==0 ){.    
8c70: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
8c80: 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  o type specified
8c90: 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74  , columns have t
8ca0: 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e  he default affin
8cb0: 69 74 79 0a 20 20 20 20 2a 2a 20 27 42 4c 4f 42  ity.    ** 'BLOB
8cc0: 27 2e 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e  '. */.    pCol->
8cd0: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
8ce0: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
8cf0: 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 31 3b  pCol->szEst = 1;
8d00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54  .  }else{.    zT
8d10: 79 70 65 20 3d 20 7a 20 2b 20 73 71 6c 69 74 65  ype = z + sqlite
8d20: 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2b 20 31  3Strlen30(z) + 1
8d30: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79  ;.    memcpy(zTy
8d40: 70 65 2c 20 70 54 79 70 65 2d 3e 7a 2c 20 70 54  pe, pType->z, pT
8d50: 79 70 65 2d 3e 6e 29 3b 0a 20 20 20 20 7a 54 79  ype->n);.    zTy
8d60: 70 65 5b 70 54 79 70 65 2d 3e 6e 5d 20 3d 20 30  pe[pType->n] = 0
8d70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71  ;.    sqlite3Deq
8d80: 75 6f 74 65 28 7a 54 79 70 65 29 3b 0a 20 20 20  uote(zType);.   
8d90: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
8da0: 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  = sqlite3Affinit
8db0: 79 54 79 70 65 28 7a 54 79 70 65 2c 20 26 70 43  yType(zType, &pC
8dc0: 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a 20 20 20 20  ol->szEst);.    
8dd0: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
8de0: 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50  = COLFLAG_HASTYP
8df0: 45 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c  E;.  }.  p->nCol
8e00: 2b 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f  ++;.  pParse->co
8e10: 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d  nstraintName.n =
8e20: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
8e30: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8e40: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
8e50: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
8e60: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
8e70: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
8e80: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  LE statement.  A
8e90: 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73   "NOT NULL" cons
8ea0: 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65  traint has.** be
8eb0: 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c  en seen on a col
8ec0: 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  umn.  This routi
8ed0: 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e  ne sets the notN
8ee0: 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74  ull flag on.** t
8ef0: 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  he column curren
8f00: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
8f10: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
8f20: 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c  sqlite3AddNotNul
8f30: 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  l(Parse *pParse,
8f40: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
8f50: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20 3d   Table *p;.  p =
8f60: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
8f70: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
8f80: 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c  | NEVER(p->nCol<
8f90: 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  1) ) return;.  p
8fa0: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
8fb0: 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29  ].notNull = (u8)
8fc0: 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 2d 3e 74 61  onError;.  p->ta
8fd0: 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73  bFlags |= TF_Has
8fe0: 4e 6f 74 4e 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  NotNull;.}../*.*
8ff0: 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d  * Scan the colum
9000: 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70  n type name zTyp
9010: 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29  e (length nType)
9020: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a   and return the.
9030: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66  ** associated af
9040: 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a  finity type..**.
9050: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9060: 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65  does a case-inde
9070: 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f  pendent search o
9080: 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20  f zType for the 
9090: 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69  .** substrings i
90a0: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
90b0: 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66  table. If one of
90c0: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
90d0: 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65  is.** found, the
90e0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61   corresponding a
90f0: 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72  ffinity is retur
9100: 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f  ned. If zType co
9110: 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74  ntains.** more t
9120: 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  han one of the s
9130: 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69  ubstrings, entri
9140: 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f  es toward the to
9150: 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62  p of .** the tab
9160: 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79  le take priority
9170: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
9180: 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42  f zType is 'BLOB
9190: 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45  INT', .** SQLITE
91a0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20  _AFF_INTEGER is 
91b0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
91c0: 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20  Substring     | 
91d0: 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d  Affinity.** ----
91e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
9200: 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20  'INT'         | 
9210: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
9220: 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20  ER.** 'CHAR'    
9230: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
9240: 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20  _TEXT.** 'CLOB' 
9250: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
9260: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58  AFF_TEXT.** 'TEX
9270: 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  T'        | SQLI
9280: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
9290: 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53  BLOB'        | S
92a0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 0a 2a  QLITE_AFF_BLOB.*
92b0: 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20  * 'REAL'        
92c0: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
92d0: 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20  L.** 'FLOA'     
92e0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
92f0: 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20  REAL.** 'DOUB'  
9300: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
9310: 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66  FF_REAL.**.** If
9320: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62   none of the sub
9330: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61  strings in the a
9340: 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66  bove table are f
9350: 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ound,.** SQLITE_
9360: 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72  AFF_NUMERIC is r
9370: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72  eturned..*/.char
9380: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
9390: 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Type(const char 
93a0: 2a 7a 49 6e 2c 20 75 38 20 2a 70 73 7a 45 73 74  *zIn, u8 *pszEst
93b0: 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a  ){.  u32 h = 0;.
93c0: 20 20 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c    char aff = SQL
93d0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
93e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
93f0: 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Char = 0;..  ass
9400: 65 72 74 28 20 7a 49 6e 21 3d 30 20 29 3b 0a 20  ert( zIn!=0 );. 
9410: 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30 5d 20 29   while( zIn[0] )
9420: 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29  {.    h = (h<<8)
9430: 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72 54   + sqlite3UpperT
9440: 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29 26 30 78  oLower[(*zIn)&0x
9450: 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a  ff];.    zIn++;.
9460: 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27      if( h==(('c'
9470: 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b  <<24)+('h'<<16)+
9480: 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b  ('a'<<8)+'r') ){
9490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
94a0: 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66  CHAR */.      af
94b0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
94c0: 45 58 54 3b 0a 20 20 20 20 20 20 7a 43 68 61 72  EXT;.      zChar
94d0: 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d 65 6c 73   = zIn;.    }els
94e0: 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c  e if( h==(('c'<<
94f0: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
9500: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20  o'<<8)+'b') ){  
9510: 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a       /* CLOB */.
9520: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9530: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
9540: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
9550: 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31  't'<<24)+('e'<<1
9560: 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29  6)+('x'<<8)+'t')
9570: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58   ){       /* TEX
9580: 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  T */.      aff =
9590: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
95a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
95b0: 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27  h==(('b'<<24)+('
95c0: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
95d0: 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'b')          /
95e0: 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * BLOB */.      
95f0: 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54    && (aff==SQLIT
9600: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c  E_AFF_NUMERIC ||
9610: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
9620: 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  _REAL) ){.      
9630: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
9640: 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 69 66 28  _BLOB;.      if(
9650: 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20 29 20 7a   zIn[0]=='(' ) z
9660: 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23 69 66 6e  Char = zIn;.#ifn
9670: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9680: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
9690: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
96a0: 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c  (('r'<<24)+('e'<
96b0: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c  <16)+('a'<<8)+'l
96c0: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ')          /* R
96d0: 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  EAL */.        &
96e0: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
96f0: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
9700: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
9710: 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65  AFF_REAL;.    }e
9720: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27  lse if( h==(('f'
9730: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
9740: 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20  ('o'<<8)+'a')   
9750: 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a         /* FLOA *
9760: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
9770: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
9780: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
9790: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
97a0: 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EAL;.    }else i
97b0: 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29  f( h==(('d'<<24)
97c0: 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c  +('o'<<16)+('u'<
97d0: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
97e0: 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20    /* DOUB */.   
97f0: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
9800: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9810: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
9820: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
9830: 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
9840: 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46 46   if( (h&0x00FFFF
9850: 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b  FF)==(('i'<<16)+
9860: 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('n'<<8)+'t') ){
9870: 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20      /* INT */.  
9880: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9890: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
98a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
98b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 73  .  }..  /* If ps
98c0: 7a 45 73 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  zEst is not NULL
98d0: 2c 20 73 74 6f 72 65 20 61 6e 20 65 73 74 69 6d  , store an estim
98e0: 61 74 65 20 6f 66 20 74 68 65 20 66 69 65 6c 64  ate of the field
98f0: 20 73 69 7a 65 2e 20 20 54 68 65 0a 20 20 2a 2a   size.  The.  **
9900: 20 65 73 74 69 6d 61 74 65 20 69 73 20 73 63 61   estimate is sca
9910: 6c 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  led so that the 
9920: 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e 74 65 67  size of an integ
9930: 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a 20 20 69  er is 1.  */.  i
9940: 66 28 20 70 73 7a 45 73 74 20 29 7b 0a 20 20 20  f( pszEst ){.   
9950: 20 2a 70 73 7a 45 73 74 20 3d 20 31 3b 20 20 20   *pszEst = 1;   
9960: 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20  /* default size 
9970: 69 73 20 61 70 70 72 6f 78 20 34 20 62 79 74 65  is approx 4 byte
9980: 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66  s */.    if( aff
9990: 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  <SQLITE_AFF_NUME
99a0: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28  RIC ){.      if(
99b0: 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20   zChar ){.      
99c0: 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30    while( zChar[0
99d0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ] ){.          i
99e0: 66 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  f( sqlite3Isdigi
99f0: 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20  t(zChar[0]) ){. 
9a00: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76             int v
9a10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
9a20: 20 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33    sqlite3GetInt3
9a30: 32 28 7a 43 68 61 72 2c 20 26 76 29 3b 0a 20 20  2(zChar, &v);.  
9a40: 20 20 20 20 20 20 20 20 20 20 76 20 3d 20 76 2f            v = v/
9a50: 34 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20  4 + 1;.         
9a60: 20 20 20 69 66 28 20 76 3e 32 35 35 20 29 20 76     if( v>255 ) v
9a70: 20 3d 20 32 35 35 3b 0a 20 20 20 20 20 20 20 20   = 255;.        
9a80: 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 76 3b      *pszEst = v;
9a90: 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56 41 52   /* BLOB(k), VAR
9aa0: 43 48 41 52 28 6b 29 2c 20 43 48 41 52 28 6b 29  CHAR(k), CHAR(k)
9ab0: 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f   -> r=(k/4+1) */
9ac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
9ad0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
9ae0: 20 20 20 20 20 20 20 20 20 20 7a 43 68 61 72 2b            zChar+
9af0: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
9b00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9b10: 20 20 2a 70 73 7a 45 73 74 20 3d 20 35 3b 20 20    *pszEst = 5;  
9b20: 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20   /* BLOB, TEXT, 
9b30: 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28 61 70  CLOB -> r=5  (ap
9b40: 70 72 6f 78 20 32 30 20 62 79 74 65 73 29 2a 2f  prox 20 bytes)*/
9b50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9b60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b   }.  return aff;
9b70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78  .}../*.** The ex
9b80: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
9b90: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
9ba0: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
9bb0: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
9bc0: 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65  .** of the table
9bd0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
9be0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
9bf0: 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c  *.** Default val
9c00: 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d  ue expressions m
9c10: 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e  ust be constant.
9c20: 20 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70    Raise an excep
9c30: 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20  tion if this.** 
9c40: 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e  is not the case.
9c50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9c60: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
9c70: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
9c80: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
9c90: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
9ca0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
9cb0: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
9cc0: 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c  sqlite3AddDefaul
9cd0: 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50  tValue(Parse *pP
9ce0: 61 72 73 65 2c 20 45 78 70 72 53 70 61 6e 20 2a  arse, ExprSpan *
9cf0: 70 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c 65 20  pSpan){.  Table 
9d00: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
9d10: 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
9d20: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9d30: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
9d40: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
9d50: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20  !=0 ){.    pCol 
9d60: 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  = &(p->aCol[p->n
9d70: 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28  Col-1]);.    if(
9d80: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
9d90: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
9da0: 6e 28 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20  n(pSpan->pExpr, 
9db0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29  db->init.busy) )
9dc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
9dd0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
9de0: 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f  "default value o
9df0: 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73  f column [%s] is
9e00: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a   not constant",.
9e10: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
9e20: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
9e30: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f  e{.      /* A co
9e40: 70 79 20 6f 66 20 70 45 78 70 72 20 69 73 20 75  py of pExpr is u
9e50: 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74  sed instead of t
9e60: 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20  he original, as 
9e70: 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20  pExpr contains. 
9e80: 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74       ** tokens t
9e90: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c  hat point to vol
9ea0: 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54 68  atile memory. Th
9eb0: 65 20 27 73 70 61 6e 27 20 6f 66 20 74 68 65 20  e 'span' of the 
9ec0: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20  expression.     
9ed0: 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20   ** is required 
9ee0: 62 79 20 70 72 61 67 6d 61 20 74 61 62 6c 65 5f  by pragma table_
9ef0: 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  info..      */. 
9f00: 20 20 20 20 20 45 78 70 72 20 78 3b 0a 20 20 20       Expr x;.   
9f10: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
9f20: 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70  lete(db, pCol->p
9f30: 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d  Dflt);.      mem
9f40: 73 65 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f  set(&x, 0, sizeo
9f50: 66 28 78 29 29 3b 0a 20 20 20 20 20 20 78 2e 6f  f(x));.      x.o
9f60: 70 20 3d 20 54 4b 5f 53 50 41 4e 3b 0a 20 20 20  p = TK_SPAN;.   
9f70: 20 20 20 78 2e 75 2e 7a 54 6f 6b 65 6e 20 3d 20     x.u.zToken = 
9f80: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
9f90: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61  (db, (char*)pSpa
9fa0: 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20  n->zStart,.     
9fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
9fd0: 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64  int)(pSpan->zEnd
9fe0: 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74   - pSpan->zStart
9ff0: 29 29 3b 0a 20 20 20 20 20 20 78 2e 70 4c 65 66  ));.      x.pLef
a000: 74 20 3d 20 70 53 70 61 6e 2d 3e 70 45 78 70 72  t = pSpan->pExpr
a010: 3b 0a 20 20 20 20 20 20 78 2e 66 6c 61 67 73 20  ;.      x.flags 
a020: 3d 20 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20  = EP_Skip;.     
a030: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73   pCol->pDflt = s
a040: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
a050: 2c 20 26 78 2c 20 45 58 50 52 44 55 50 5f 52 45  , &x, EXPRDUP_RE
a060: 44 55 43 45 29 3b 0a 20 20 20 20 20 20 73 71 6c  DUCE);.      sql
a070: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 78  ite3DbFree(db, x
a080: 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  .u.zToken);.    
a090: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  }.  }.  sqlite3E
a0a0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 53  xprDelete(db, pS
a0b0: 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a  pan->pExpr);.}..
a0c0: 2f 2a 0a 2a 2a 20 42 61 63 6b 77 61 72 64 73 20  /*.** Backwards 
a0d0: 43 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 48 61  Compatibility Ha
a0e0: 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20 48 69 73 74 6f  ck:.** .** Histo
a0f0: 72 69 63 61 6c 20 76 65 72 73 69 6f 6e 73 20 6f  rical versions o
a100: 66 20 53 51 4c 69 74 65 20 61 63 63 65 70 74 65  f SQLite accepte
a110: 64 20 73 74 72 69 6e 67 73 20 61 73 20 63 6f 6c  d strings as col
a120: 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 0a 2a 2a 20  umn names in.** 
a130: 69 6e 64 65 78 65 73 20 61 6e 64 20 50 52 49 4d  indexes and PRIM
a140: 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
a150: 6e 74 73 20 61 6e 64 20 69 6e 20 55 4e 49 51 55  nts and in UNIQU
a160: 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  E constraints.  
a170: 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  Example:.**.**  
a180: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
a190: 78 79 7a 28 61 2c 62 2c 63 2c 64 2c 65 2c 50 52  xyz(a,b,c,d,e,PR
a1a0: 49 4d 41 52 59 20 4b 45 59 28 27 61 27 29 2c 55  IMARY KEY('a'),U
a1b0: 4e 49 51 55 45 28 27 62 27 2c 27 63 27 20 43 4f  NIQUE('b','c' CO
a1c0: 4c 4c 41 54 45 20 74 72 69 6d 29 0a 2a 2a 20 20  LLATE trim).**  
a1d0: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
a1e0: 61 62 63 20 4f 4e 20 78 79 7a 28 27 63 27 2c 27  abc ON xyz('c','
a1f0: 64 27 20 44 45 53 43 2c 27 65 27 20 43 4f 4c 4c  d' DESC,'e' COLL
a200: 41 54 45 20 6e 6f 63 61 73 65 20 44 45 53 43 29  ATE nocase DESC)
a210: 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ;.**.** This is 
a220: 67 6f 6f 66 79 2e 20 20 42 75 74 20 74 6f 20 70  goofy.  But to p
a230: 72 65 73 65 72 76 65 20 62 61 63 6b 77 61 72 64  reserve backward
a240: 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
a250: 77 65 20 63 6f 6e 74 69 6e 75 65 20 74 6f 0a 2a  we continue to.*
a260: 2a 20 61 63 63 65 70 74 20 69 74 2e 20 20 54 68  * accept it.  Th
a270: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
a280: 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 63 6f  the necessary co
a290: 6e 76 65 72 73 69 6f 6e 2e 20 20 49 74 20 63 6f  nversion.  It co
a2a0: 6e 76 65 72 74 73 0a 2a 2a 20 74 68 65 20 65 78  nverts.** the ex
a2b0: 70 72 65 73 73 69 6f 6e 20 67 69 76 65 6e 20 69  pression given i
a2c0: 6e 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20 66  n its argument f
a2d0: 72 6f 6d 20 61 20 54 4b 5f 53 54 52 49 4e 47 20  rom a TK_STRING 
a2e0: 69 6e 74 6f 20 61 20 54 4b 5f 49 44 0a 2a 2a 20  into a TK_ID.** 
a2f0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
a300: 6e 20 69 73 20 6a 75 73 74 20 61 20 54 4b 5f 53  n is just a TK_S
a310: 54 52 49 4e 47 20 77 69 74 68 20 61 6e 20 6f 70  TRING with an op
a320: 74 69 6f 6e 61 6c 20 43 4f 4c 4c 41 54 45 20 63  tional COLLATE c
a330: 6c 61 75 73 65 2e 0a 2a 2a 20 49 66 20 74 68 65  lause..** If the
a340: 20 65 70 78 72 65 73 73 69 6f 6e 20 69 73 20 61   epxression is a
a350: 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  nything other th
a360: 61 6e 20 54 4b 5f 53 54 52 49 4e 47 2c 20 74 68  an TK_STRING, th
a370: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  e expression is.
a380: 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  ** unchanged..*/
a390: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
a3a0: 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28 45  ite3StringToId(E
a3b0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
a3c0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20  ->op==TK_STRING 
a3d0: 29 7b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54  ){.    p->op = T
a3e0: 4b 5f 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  K_ID;.  }else if
a3f0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c  ( p->op==TK_COLL
a400: 41 54 45 20 26 26 20 70 2d 3e 70 4c 65 66 74 2d  ATE && p->pLeft-
a410: 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29  >op==TK_STRING )
a420: 7b 0a 20 20 20 20 70 2d 3e 70 4c 65 66 74 2d 3e  {.    p->pLeft->
a430: 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 0a  op = TK_ID;.  }.
a440: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61  }../*.** Designa
a450: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
a460: 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  EY for the table
a470: 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  .  pList is a li
a480: 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20  st of names .** 
a490: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
a4a0: 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79  form the primary
a4b0: 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20   key.  If pList 
a4c0: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
a4d0: 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74  e.** most recent
a4e0: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20  ly added column 
a4f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
a500: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
a510: 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63  .**.** A table c
a520: 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  an have at most 
a530: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  one primary key.
a540: 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61    If the table a
a550: 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20  lready has.** a 
a560: 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64  primary key (and
a570: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
a580: 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29  ond primary key)
a590: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a   then create an.
a5a0: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
a5b0: 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  If the PRIMARY K
a5c0: 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c  EY is on a singl
a5d0: 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64  e column whose d
a5e0: 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47  atatype is INTEG
a5f0: 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77  ER,.** then we w
a600: 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74  ill try to use t
a610: 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  hat column as th
a620: 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68  e rowid.  Set th
a630: 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a  e Table.iPKey.**
a640: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61   field of the ta
a650: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
a660: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65  uction to be the
a670: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
a680: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
a690: 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61   KEY column.  Ta
a6a0: 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74  ble.iPKey is set
a6b0: 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20   to -1 if there 
a6c0: 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52  is.** no INTEGER
a6d0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a   PRIMARY KEY..**
a6e0: 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69  .** If the key i
a6f0: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
a700: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
a710: 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  en create a uniq
a720: 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20  ue.** index for 
a730: 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64  the key.  No ind
a740: 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f  ex is created fo
a750: 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  r INTEGER PRIMAR
a760: 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20  Y KEYs..*/.void 
a770: 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72  sqlite3AddPrimar
a780: 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  yKey(.  Parse *p
a790: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
a7a0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
a7b0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
a7c0: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66  t,  /* List of f
a7d0: 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65  ield names to be
a7e0: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
a7f0: 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
a800: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
a810: 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20  th a uniqueness 
a820: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e  conflict */.  in
a830: 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20  t autoInc,      
a840: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41  /* True if the A
a850: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79  UTOINCREMENT key
a860: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
a870: 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
a880: 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  er     /* SQLITE
a890: 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54  _SO_ASC or SQLIT
a8a0: 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a  E_SO_DESC */.){.
a8b0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
a8c0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
a8d0: 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  e;.  Column *pCo
a8e0: 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  l = 0;.  int iCo
a8f0: 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 6e 74  l = -1, i;.  int
a900: 20 6e 54 65 72 6d 3b 0a 20 20 69 66 28 20 70 54   nTerm;.  if( pT
a910: 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 69  ab==0 ) goto pri
a920: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
a930: 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c   if( pTab->tabFl
a940: 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d  ags & TF_HasPrim
a950: 61 72 79 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  aryKey ){.    sq
a960: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
a970: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61  arse, .      "ta
a980: 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d  ble \"%s\" has m
a990: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69  ore than one pri
a9a0: 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d  mary key", pTab-
a9b0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
a9c0: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
a9d0: 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e  it;.  }.  pTab->
a9e0: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48  tabFlags |= TF_H
a9f0: 61 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20  asPrimaryKey;.  
aa00: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
aa10: 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
aa20: 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70  >nCol - 1;.    p
aa30: 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f  Col = &pTab->aCo
aa40: 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 70 43 6f  l[iCol];.    pCo
aa50: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
aa60: 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a  OLFLAG_PRIMKEY;.
aa70: 20 20 20 20 6e 54 65 72 6d 20 3d 20 31 3b 0a 20      nTerm = 1;. 
aa80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 54 65 72   }else{.    nTer
aa90: 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  m = pList->nExpr
aaa0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
aab0: 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  <nTerm; i++){.  
aac0: 20 20 20 20 45 78 70 72 20 2a 70 43 45 78 70 72      Expr *pCExpr
aad0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
aae0: 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d  ipCollate(pList-
aaf0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
ab00: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 45 78      assert( pCEx
ab10: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  pr!=0 );.      s
ab20: 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64  qlite3StringToId
ab30: 28 70 43 45 78 70 72 29 3b 0a 20 20 20 20 20 20  (pCExpr);.      
ab40: 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70 3d 3d  if( pCExpr->op==
ab50: 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20  TK_ID ){.       
ab60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 4e   const char *zCN
ab70: 61 6d 65 20 3d 20 70 43 45 78 70 72 2d 3e 75 2e  ame = pCExpr->u.
ab80: 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
ab90: 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c  for(iCol=0; iCol
aba0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f  <pTab->nCol; iCo
abb0: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l++){.          
abc0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
abd0: 6d 70 28 7a 43 4e 61 6d 65 2c 20 70 54 61 62 2d  mp(zCName, pTab-
abe0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
abf0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
ac00: 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61       pCol = &pTa
ac10: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20  b->aCol[iCol];. 
ac20: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
ac30: 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  >colFlags |= COL
ac40: 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20  FLAG_PRIMKEY;.  
ac50: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
ac60: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ac70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ac80: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
ac90: 54 65 72 6d 3d 3d 31 0a 20 20 20 26 26 20 70 43  Term==1.   && pC
aca0: 6f 6c 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  ol.   && sqlite3
acb0: 53 74 72 49 43 6d 70 28 73 71 6c 69 74 65 33 43  StrICmp(sqlite3C
acc0: 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 22  olumnType(pCol,"
acd0: 22 29 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d  "), "INTEGER")==
ace0: 30 0a 20 20 20 26 26 20 73 6f 72 74 4f 72 64 65  0.   && sortOrde
acf0: 72 21 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53  r!=SQLITE_SO_DES
ad00: 43 0a 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  C.  ){.    pTab-
ad10: 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20  >iPKey = iCol;. 
ad20: 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66     pTab->keyConf
ad30: 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a   = (u8)onError;.
ad40: 20 20 20 20 61 73 73 65 72 74 28 20 61 75 74 6f      assert( auto
ad50: 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e  Inc==0 || autoIn
ad60: 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61 62  c==1 );.    pTab
ad70: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 61 75  ->tabFlags |= au
ad80: 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63  toInc*TF_Autoinc
ad90: 72 65 6d 65 6e 74 3b 0a 20 20 20 20 69 66 28 20  rement;.    if( 
ada0: 70 4c 69 73 74 20 29 20 70 50 61 72 73 65 2d 3e  pList ) pParse->
adb0: 69 50 6b 53 6f 72 74 4f 72 64 65 72 20 3d 20 70  iPkSortOrder = p
adc0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  List->a[0].sortO
add0: 72 64 65 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66  rder;.  }else if
ade0: 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66  ( autoInc ){.#if
adf0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ae00: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
ae10: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
ae20: 73 67 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f  sg(pParse, "AUTO
ae30: 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c  INCREMENT is onl
ae40: 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20  y allowed on an 
ae50: 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47 45  ".       "INTEGE
ae60: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b  R PRIMARY KEY");
ae70: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
ae80: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65 61  .    sqlite3Crea
ae90: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
aea0: 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20  0, 0, 0, pList, 
aeb0: 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20 20 20  onError, 0,.    
aec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aed0: 20 20 20 20 20 20 20 30 2c 20 73 6f 72 74 4f 72         0, sortOr
aee0: 64 65 72 2c 20 30 2c 20 53 51 4c 49 54 45 5f 49  der, 0, SQLITE_I
aef0: 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45  DXTYPE_PRIMARYKE
af00: 59 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  Y);.    pList = 
af10: 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f  0;.  }..primary_
af20: 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  key_exit:.  sqli
af30: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
af40: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
af50: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ist);.  return;.
af60: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
af70: 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ew CHECK constra
af80: 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65  int to the table
af90: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
afa0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
afb0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
afc0: 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74  dCheckConstraint
afd0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
afe0: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
aff0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
b000: 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20  pr *pCheckExpr  
b010: 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70  /* The check exp
b020: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69  ression */.){.#i
b030: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b040: 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20  T_CHECK.  Table 
b050: 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  *pTab = pParse->
b060: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 73 71 6c  pNewTable;.  sql
b070: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
b080: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 54 61  e->db;.  if( pTa
b090: 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45  b && !IN_DECLARE
b0a0: 5f 56 54 41 42 0a 20 20 20 26 26 20 21 73 71 6c  _VTAB.   && !sql
b0b0: 69 74 65 33 42 74 72 65 65 49 73 52 65 61 64 6f  ite3BtreeIsReado
b0c0: 6e 6c 79 28 64 62 2d 3e 61 44 62 5b 64 62 2d 3e  nly(db->aDb[db->
b0d0: 69 6e 69 74 2e 69 44 62 5d 2e 70 42 74 29 0a 20  init.iDb].pBt). 
b0e0: 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 70 43   ){.    pTab->pC
b0f0: 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  heck = sqlite3Ex
b100: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
b110: 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63  rse, pTab->pChec
b120: 6b 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a  k, pCheckExpr);.
b130: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
b140: 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e  constraintName.n
b150: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b160: 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
b170: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70  (pParse, pTab->p
b180: 43 68 65 63 6b 2c 20 26 70 50 61 72 73 65 2d 3e  Check, &pParse->
b190: 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2c 20  constraintName, 
b1a0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  1);.    }.  }els
b1b0: 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
b1c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
b1d0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
b1e0: 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d 0a  CheckExpr);.  }.
b1f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
b200: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
b210: 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
b220: 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20  recently parsed 
b230: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  table column.** 
b240: 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67  to the CollSeq g
b250: 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  iven..*/.void sq
b260: 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54  lite3AddCollateT
b270: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
b280: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  e, Token *pToken
b290: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
b2a0: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
b2b0: 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zColl;          
b2c0: 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20      /* Dequoted 
b2d0: 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f  name of collatio
b2e0: 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  n sequence */.  
b2f0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
b300: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
b310: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
b320: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
b330: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d  ->nCol-1;.  db =
b340: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a   pParse->db;.  z
b350: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61  Coll = sqlite3Na
b360: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
b370: 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21  pToken);.  if( !
b380: 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a  zColl ) return;.
b390: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c 6f  .  if( sqlite3Lo
b3a0: 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
b3b0: 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  se, zColl) ){.  
b3c0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
b3d0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
b3e0: 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  (db, p->aCol[i].
b3f0: 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 61  zColl);.    p->a
b400: 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a  Col[i].zColl = z
b410: 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  Coll;.  .    /* 
b420: 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  If the column is
b430: 20 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e   declared as "<n
b440: 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59  ame> PRIMARY KEY
b450: 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22   COLLATE <type>"
b460: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e  ,.    ** then an
b470: 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20   index may have 
b480: 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20  been created on 
b490: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f  this column befo
b4a0: 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  re the.    ** co
b4b0: 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73  llation type was
b4c0: 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20   added. Correct 
b4d0: 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74 68  this if it is th
b4e0: 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  e case..    */. 
b4f0: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70     for(pIdx=p->p
b500: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
b510: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
b520: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
b530: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29  dx->nKeyCol==1 )
b540: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
b550: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69  ->aiColumn[0]==i
b560: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78   ){.        pIdx
b570: 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d  ->azColl[0] = p-
b580: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a  >aCol[i].zColl;.
b590: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b5a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
b5b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f  e3DbFree(db, zCo
b5c0: 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ll);.  }.}../*.*
b5d0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
b5e0: 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c  returns the coll
b5f0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
b600: 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69  or database nati
b610: 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64  ve text.** encod
b620: 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62  ing identified b
b630: 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61  y the string zNa
b640: 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65  me, length nName
b650: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
b660: 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
b670: 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e  on sequence is n
b680: 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  ot available, or
b690: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a   not available.*
b6a0: 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
b6b0: 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e  e native encodin
b6c0: 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  g, the collation
b6d0: 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f   factory is invo
b6e0: 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73  ked to.** reques
b6f0: 74 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c  t it. If the col
b700: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64  lation factory d
b710: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73  oes not supply s
b720: 75 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a  uch a sequence,.
b730: 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65  ** and the seque
b740: 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  nce is available
b750: 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74   in another text
b760: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20   encoding, then 
b770: 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72  that is.** retur
b780: 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  ned instead..**.
b790: 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e  ** If no version
b7a0: 73 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74  s of the request
b7b0: 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65  ed collations se
b7c0: 71 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c  quence are avail
b7d0: 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74  able, or.** anot
b7e0: 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73  her error occurs
b7f0: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
b800: 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ed and an error 
b810: 6d 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20  message written 
b820: 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  into.** pParse..
b830: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
b840: 6e 65 20 69 73 20 61 20 77 72 61 70 70 65 72 20  ne is a wrapper 
b850: 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46 69  around sqlite3Fi
b860: 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68  ndCollSeq().  Th
b870: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e  is routine.** in
b880: 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61 74  vokes the collat
b890: 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20 74  ion factory if t
b8a0: 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69  he named collati
b8b0: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  on cannot be fou
b8c0: 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61  nd.** and genera
b8d0: 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  tes an error mes
b8e0: 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  sage..**.** See 
b8f0: 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e  also: sqlite3Fin
b900: 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69  dCollSeq(), sqli
b910: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a  te3GetCollSeq().
b920: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
b930: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
b940: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
b950: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
b960: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
b970: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
b980: 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64    u8 enc = ENC(d
b990: 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73  b);.  u8 initbus
b9a0: 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  y = db->init.bus
b9b0: 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  y;.  CollSeq *pC
b9c0: 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  oll;..  pColl = 
b9d0: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
b9e0: 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d  eq(db, enc, zNam
b9f0: 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20  e, initbusy);.  
ba00: 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26  if( !initbusy &&
ba10: 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f   (!pColl || !pCo
ba20: 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20  ll->xCmp) ){.   
ba30: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
ba40: 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  GetCollSeq(pPars
ba50: 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a  e, enc, pColl, z
ba60: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  Name);.  }..  re
ba70: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a  turn pColl;.}...
ba80: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
ba90: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
baa0: 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65  crement the sche
bab0: 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a  ma cookie..**.**
bac0: 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   The schema cook
bad0: 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ie is used to de
bae0: 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65  termine when the
baf0: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a   schema for the.
bb00: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
bb10: 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68  ges.  After each
bb20: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20   schema change, 
bb30: 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  the cookie value
bb40: 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68  .** changes.  Wh
bb50: 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72  en a process fir
bb60: 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68  st reads the sch
bb70: 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74  ema it records t
bb80: 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54  he.** cookie.  T
bb90: 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65  hereafter, whene
bba0: 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61  ver it goes to a
bbb0: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
bbc0: 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73  se,.** it checks
bbd0: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d   the cookie to m
bbe0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68  ake sure the sch
bbf0: 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e  ema has not chan
bc00: 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20  ged.** since it 
bc10: 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a  was last read..*
bc20: 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69  *.** This plan i
bc30: 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  s not completely
bc40: 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20   bullet-proof.  
bc50: 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  It is possible f
bc60: 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  or.** the schema
bc70: 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69   to change multi
bc80: 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f  ple times and fo
bc90: 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  r the cookie to 
bca0: 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74  be.** set back t
bcb0: 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20  o prior value.  
bcc0: 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67  But schema chang
bcd0: 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e  es are infrequen
bce0: 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f  t.** and the pro
bcf0: 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74  bability of hitt
bd00: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f  ing the same coo
bd10: 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c  kie value is onl
bd20: 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e  y.** 1 chance in
bd30: 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65   2^32.  So we're
bd40: 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2a   safe enough..**
bd50: 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49  .** IMPLEMENTATI
bd60: 4f 4e 2d 4f 46 3a 20 52 2d 33 34 32 33 30 2d 35  ON-OF: R-34230-5
bd70: 36 30 34 39 20 53 51 4c 69 74 65 20 61 75 74 6f  6049 SQLite auto
bd80: 6d 61 74 69 63 61 6c 6c 79 20 69 6e 63 72 65 6d  matically increm
bd90: 65 6e 74 73 0a 2a 2a 20 74 68 65 20 73 63 68 65  ents.** the sche
bda0: 6d 61 2d 76 65 72 73 69 6f 6e 20 77 68 65 6e 65  ma-version whene
bdb0: 76 65 72 20 74 68 65 20 73 63 68 65 6d 61 20 63  ver the schema c
bdc0: 68 61 6e 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  hanges..*/.void 
bdd0: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
bde0: 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  kie(Parse *pPars
bdf0: 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73  e, int iDb){.  s
be00: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
be10: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
be20: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
be30: 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  be;.  assert( sq
be40: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
be50: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
be60: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
be70: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
be80: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54  tCookie, iDb, BT
be90: 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49  REE_SCHEMA_VERSI
bea0: 4f 4e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ON, .           
beb0: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62           db->aDb
bec0: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73  [iDb].pSchema->s
bed0: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 29 3b  chema_cookie+1);
bee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
bef0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
bf00: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
bf10: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
bf20: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
bf30: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
bf40: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
bf50: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
bf60: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
bf70: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
bf80: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
bf90: 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
bfa0: 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69  te is conservati
bfb0: 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  ve.  It might be
bfc0: 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61   larger that wha
bfd0: 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e  t is.** really n
bfe0: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
bff0: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
c000: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
c010: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28  .  int n;.  for(
c020: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
c030: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
c040: 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  '"' ){ n++; }.  
c050: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32  }.  return n + 2
c060: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
c070: 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 69  irst parameter i
c080: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
c090: 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  n output buffer.
c0a0: 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   The second .** 
c0b0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
c0c0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74  ointer to an int
c0d0: 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69  eger that contai
c0e0: 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  ns the offset at
c0f0: 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72 69  .** which to wri
c100: 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  te into the outp
c110: 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73 20  ut buffer. This 
c120: 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73 20  function copies 
c130: 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  the.** nul-termi
c140: 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f 69  nated string poi
c150: 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 74  nted to by the t
c160: 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c 20  hird parameter, 
c170: 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a  zSignedIdent,.**
c180: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
c190: 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  d offset in the 
c1a0: 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61 74  buffer and updat
c1b0: 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66 65  es *pIdx to refe
c1c0: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73  r.** to the firs
c1d0: 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68 65  t byte after the
c1e0: 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74 74   last byte writt
c1f0: 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  en before return
c200: 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ing..** .** If t
c210: 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e 65  he string zSigne
c220: 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73 20  dIdent consists 
c230: 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70 68  entirely of alph
c240: 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61  a-numeric.** cha
c250: 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f  racters, does no
c260: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 64  t begin with a d
c270: 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74 20  igit and is not 
c280: 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a  an SQL keyword,.
c290: 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f  ** then it is co
c2a0: 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70  pied to the outp
c2b0: 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74 6c  ut buffer exactl
c2c0: 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68 65  y as it is. Othe
c2d0: 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20  rwise,.** it is 
c2e0: 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f 75  quoted using dou
c2f0: 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73  ble-quotes..*/.s
c300: 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74  tatic void ident
c310: 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  Put(char *z, int
c320: 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53   *pIdx, char *zS
c330: 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75  ignedIdent){.  u
c340: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
c350: 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  dent = (unsigned
c360: 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64   char*)zSignedId
c370: 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ent;.  int i, j,
c380: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
c390: 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28  = *pIdx;..  for(
c3a0: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
c3b0: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73  j++){.    if( !s
c3c0: 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49  qlite3Isalnum(zI
c3d0: 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65  dent[j]) && zIde
c3e0: 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65  nt[j]!='_' ) bre
c3f0: 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75  ak;.  }.  needQu
c400: 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73 64  ote = sqlite3Isd
c410: 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a  igit(zIdent[0]).
c420: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
c430: 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64  qlite3KeywordCod
c440: 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b  e(zIdent, j)!=TK
c450: 5f 49 44 0a 20 20 20 20 20 20 20 20 20 20 20 20  _ID.            
c460: 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a  || zIdent[j]!=0.
c470: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6a              || j
c480: 3d 3d 30 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64  ==0;..  if( need
c490: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
c4a0: 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b   '"';.  for(j=0;
c4b0: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
c4c0: 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a  {.    z[i++] = z
c4d0: 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66  Ident[j];.    if
c4e0: 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27  ( zIdent[j]=='"'
c4f0: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
c500: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51  .  }.  if( needQ
c510: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
c520: 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b  '"';.  z[i] = 0;
c530: 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a  .  *pIdx = i;.}.
c540: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
c550: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
c560: 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72  tatement appropr
c570: 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76  iate for the giv
c580: 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65  en.** table.  Me
c590: 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  mory to hold the
c5a0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61   text of the sta
c5b0: 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e  tement is obtain
c5c0: 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74  ed.** from sqlit
c5d0: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
c5e0: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
c5f0: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
c600: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ion..*/.static c
c610: 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65  har *createTable
c620: 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64 62  Stmt(sqlite3 *db
c630: 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  , Table *p){.  i
c640: 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68  nt i, k, n;.  ch
c650: 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61  ar *zStmt;.  cha
c660: 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c  r *zSep, *zSep2,
c670: 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e   *zEnd;.  Column
c680: 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b   *pCol;.  n = 0;
c690: 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d  .  for(pCol = p-
c6a0: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
c6b0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
c6c0: 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64  ++){.    n += id
c6d0: 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e  entLength(pCol->
c6e0: 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20 7d 0a  zName) + 5;.  }.
c6f0: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
c700: 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  th(p->zName);.  
c710: 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20 20 20  if( n<50 ){ .   
c720: 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20   zSep = "";.    
c730: 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20  zSep2 = ",";.   
c740: 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d   zEnd = ")";.  }
c750: 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d  else{.    zSep =
c760: 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65   "\n  ";.    zSe
c770: 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20  p2 = ",\n  ";.  
c780: 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a    zEnd = "\n)";.
c790: 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20    }.  n += 35 + 
c7a0: 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74  6*p->nCol;.  zSt
c7b0: 6d 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  mt = sqlite3DbMa
c7c0: 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29 3b 0a 20  llocRaw(0, n);. 
c7d0: 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b   if( zStmt==0 ){
c7e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46  .    sqlite3OomF
c7f0: 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 72 65  ault(db);.    re
c800: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
c810: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
c820: 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45 41 54 45  , zStmt, "CREATE
c830: 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d   TABLE ");.  k =
c840: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
c850: 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74  (zStmt);.  ident
c860: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
c870: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d  ->zName);.  zStm
c880: 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20  t[k++] = '(';.  
c890: 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c  for(pCol=p->aCol
c8a0: 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  , i=0; i<p->nCol
c8b0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
c8c0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
c8d0: 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a   char * const az
c8e0: 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Type[] = {.     
c8f0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
c900: 5f 42 4c 4f 42 20 20 20 20 2a 2f 20 22 22 2c 0a  _BLOB    */ "",.
c910: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
c920: 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 2a 2f  E_AFF_TEXT    */
c930: 20 22 20 54 45 58 54 22 2c 0a 20 20 20 20 20 20   " TEXT",.      
c940: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    /* SQLITE_AFF_
c950: 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20 4e 55 4d  NUMERIC */ " NUM
c960: 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ",.        /* SQ
c970: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
c980: 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20 20 20 20   */ " INT",.    
c990: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
c9a0: 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20 22 20 52  F_REAL    */ " R
c9b0: 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20  EAL".    };.    
c9c0: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e  int len;.    con
c9d0: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
c9e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
c9f0: 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d  rintf(n-k, &zStm
ca00: 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20  t[k], zSep);.   
ca10: 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   k += sqlite3Str
ca20: 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b 5d 29  len30(&zStmt[k])
ca30: 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65  ;.    zSep = zSe
ca40: 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74  p2;.    identPut
ca50: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c  (zStmt, &k, pCol
ca60: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61 73  ->zName);.    as
ca70: 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69  sert( pCol->affi
ca80: 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f  nity-SQLITE_AFF_
ca90: 42 4c 4f 42 20 3e 3d 20 30 20 29 3b 0a 20 20 20  BLOB >= 0 );.   
caa0: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61   assert( pCol->a
cab0: 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41  ffinity-SQLITE_A
cac0: 46 46 5f 42 4c 4f 42 20 3c 20 41 72 72 61 79 53  FF_BLOB < ArrayS
cad0: 69 7a 65 28 61 7a 54 79 70 65 29 20 29 3b 0a 20  ize(azType) );. 
cae0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
caf0: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
cb00: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a  ITE_AFF_BLOB );.
cb10: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
cb20: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
cb30: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b  LITE_AFF_TEXT );
cb40: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
cb50: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
cb60: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
cb70: 43 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  C );.    testcas
cb80: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
cb90: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  y==SQLITE_AFF_IN
cba0: 54 45 47 45 52 20 29 3b 0a 20 20 20 20 74 65 73  TEGER );.    tes
cbb0: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
cbc0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
cbd0: 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20 0a 20  F_REAL );.    . 
cbe0: 20 20 20 7a 54 79 70 65 20 3d 20 61 7a 54 79 70     zType = azTyp
cbf0: 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  e[pCol->affinity
cc00: 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   - SQLITE_AFF_BL
cc10: 4f 42 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73  OB];.    len = s
cc20: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
cc30: 54 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Type);.    asser
cc40: 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  t( pCol->affinit
cc50: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  y==SQLITE_AFF_BL
cc60: 4f 42 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  OB .            
cc70: 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  || pCol->affinit
cc80: 79 3d 3d 73 71 6c 69 74 65 33 41 66 66 69 6e 69  y==sqlite3Affini
cc90: 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20 30 29  tyType(zType, 0)
cca0: 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26   );.    memcpy(&
ccb0: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c  zStmt[k], zType,
ccc0: 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20   len);.    k += 
ccd0: 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  len;.    assert(
cce0: 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 73   k<=n );.  }.  s
ccf0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
cd00: 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20  n-k, &zStmt[k], 
cd10: 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72  "%s", zEnd);.  r
cd20: 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a  eturn zStmt;.}..
cd30: 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61 6e 20  /*.** Resize an 
cd40: 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20  Index object to 
cd50: 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73 20 74  hold N columns t
cd60: 6f 74 61 6c 2e 20 20 52 65 74 75 72 6e 20 53 51  otal.  Return SQ
cd70: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
cd80: 63 63 65 73 73 20 61 6e 64 20 53 51 4c 49 54 45  ccess and SQLITE
cd90: 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d  _NOMEM on an OOM
cda0: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
cdb0: 63 20 69 6e 74 20 72 65 73 69 7a 65 49 6e 64 65  c int resizeInde
cdc0: 78 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20  xObject(sqlite3 
cdd0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  *db, Index *pIdx
cde0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68 61 72  , int N){.  char
cdf0: 20 2a 7a 45 78 74 72 61 3b 0a 20 20 69 6e 74 20   *zExtra;.  int 
ce00: 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 49 64  nByte;.  if( pId
ce10: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20  x->nColumn>=N ) 
ce20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ce30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
ce40: 2d 3e 69 73 52 65 73 69 7a 65 64 3d 3d 30 20 29  ->isResized==0 )
ce50: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 73 69 7a  ;.  nByte = (siz
ce60: 65 6f 66 28 63 68 61 72 2a 29 20 2b 20 73 69 7a  eof(char*) + siz
ce70: 65 6f 66 28 69 31 36 29 20 2b 20 31 29 2a 4e 3b  eof(i16) + 1)*N;
ce80: 0a 20 20 7a 45 78 74 72 61 20 3d 20 73 71 6c 69  .  zExtra = sqli
ce90: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
cea0: 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66  db, nByte);.  if
ceb0: 28 20 7a 45 78 74 72 61 3d 3d 30 20 29 20 72 65  ( zExtra==0 ) re
cec0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
ced0: 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79  M_BKPT;.  memcpy
cee0: 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61  (zExtra, pIdx->a
cef0: 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66 28 63 68  zColl, sizeof(ch
cf00: 61 72 2a 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75  ar*)*pIdx->nColu
cf10: 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43  mn);.  pIdx->azC
cf20: 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  oll = (const cha
cf30: 72 2a 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45  r**)zExtra;.  zE
cf40: 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 63  xtra += sizeof(c
cf50: 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70  har*)*N;.  memcp
cf60: 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e  y(zExtra, pIdx->
cf70: 61 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66  aiColumn, sizeof
cf80: 28 69 31 36 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c  (i16)*pIdx->nCol
cf90: 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69  umn);.  pIdx->ai
cfa0: 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 7a  Column = (i16*)z
cfb0: 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20  Extra;.  zExtra 
cfc0: 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 4e  += sizeof(i16)*N
cfd0: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72  ;.  memcpy(zExtr
cfe0: 61 2c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  a, pIdx->aSortOr
cff0: 64 65 72 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  der, pIdx->nColu
d000: 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f  mn);.  pIdx->aSo
d010: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 7a  rtOrder = (u8*)z
d020: 45 78 74 72 61 3b 0a 20 20 70 49 64 78 2d 3e 6e  Extra;.  pIdx->n
d030: 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49  Column = N;.  pI
d040: 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 20 3d 20  dx->isResized = 
d050: 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
d060: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
d070: 45 73 74 69 6d 61 74 65 20 74 68 65 20 74 6f 74  Estimate the tot
d080: 61 6c 20 72 6f 77 20 77 69 64 74 68 20 66 6f 72  al row width for
d090: 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61   a table..*/.sta
d0a0: 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74  tic void estimat
d0b0: 65 54 61 62 6c 65 57 69 64 74 68 28 54 61 62 6c  eTableWidth(Tabl
d0c0: 65 20 2a 70 54 61 62 29 7b 0a 20 20 75 6e 73 69  e *pTab){.  unsi
d0d0: 67 6e 65 64 20 77 54 61 62 6c 65 20 3d 20 30 3b  gned wTable = 0;
d0e0: 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20  .  const Column 
d0f0: 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 69 6e 74 20  *pTabCol;.  int 
d100: 69 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 2d  i;.  for(i=pTab-
d110: 3e 6e 43 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d 70  >nCol, pTabCol=p
d120: 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20  Tab->aCol; i>0; 
d130: 69 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b  i--, pTabCol++){
d140: 0a 20 20 20 20 77 54 61 62 6c 65 20 2b 3d 20 70  .    wTable += p
d150: 54 61 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20  TabCol->szEst;. 
d160: 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69   }.  if( pTab->i
d170: 50 4b 65 79 3c 30 20 29 20 77 54 61 62 6c 65 2b  PKey<0 ) wTable+
d180: 2b 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62  +;.  pTab->szTab
d190: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
d1a0: 45 73 74 28 77 54 61 62 6c 65 2a 34 29 3b 0a 7d  Est(wTable*4);.}
d1b0: 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  ../*.** Estimate
d1c0: 20 74 68 65 20 61 76 65 72 61 67 65 20 73 69 7a   the average siz
d1d0: 65 20 6f 66 20 61 20 72 6f 77 20 66 6f 72 20 61  e of a row for a
d1e0: 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  n index..*/.stat
d1f0: 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65  ic void estimate
d200: 49 6e 64 65 78 57 69 64 74 68 28 49 6e 64 65 78  IndexWidth(Index
d210: 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67   *pIdx){.  unsig
d220: 6e 65 64 20 77 49 6e 64 65 78 20 3d 20 30 3b 0a  ned wIndex = 0;.
d230: 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
d240: 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20   Column *aCol = 
d250: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
d260: 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ol;.  for(i=0; i
d270: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
d280: 69 2b 2b 29 7b 0a 20 20 20 20 69 31 36 20 78 20  i++){.    i16 x 
d290: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
d2a0: 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
d2b0: 20 78 3c 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   x<pIdx->pTable-
d2c0: 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 77 49 6e  >nCol );.    wIn
d2d0: 64 65 78 20 2b 3d 20 78 3c 30 20 3f 20 31 20 3a  dex += x<0 ? 1 :
d2e0: 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f   aCol[pIdx->aiCo
d2f0: 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a  lumn[i]].szEst;.
d300: 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73 7a 49 64    }.  pIdx->szId
d310: 78 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  xRow = sqlite3Lo
d320: 67 45 73 74 28 77 49 6e 64 65 78 2a 34 29 3b 0a  gEst(wIndex*4);.
d330: 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 72 75  }../* Return tru
d340: 65 20 69 66 20 76 61 6c 75 65 20 78 20 69 73 20  e if value x is 
d350: 66 6f 75 6e 64 20 61 6e 79 20 6f 66 20 74 68 65  found any of the
d360: 20 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74 72   first nCol entr
d370: 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a  ies of aiCol[].*
d380: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
d390: 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69 31 36  Column(const i16
d3a0: 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f   *aiCol, int nCo
d3b0: 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77 68 69  l, int x){.  whi
d3c0: 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29  le( nCol-- > 0 )
d3d0: 20 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b   if( x==*(aiCol+
d3e0: 2b 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  +) ) return 1;. 
d3f0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
d400: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
d410: 20 72 75 6e 73 20 61 74 20 74 68 65 20 65 6e 64   runs at the end
d420: 20 6f 66 20 70 61 72 73 69 6e 67 20 61 20 43 52   of parsing a CR
d430: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
d440: 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20 68 61 73  ment that.** has
d450: 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
d460: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6a 6f   clause.  The jo
d470: 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
d480: 65 20 69 73 20 74 6f 20 63 6f 6e 76 65 72 74 20  e is to convert 
d490: 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c  both.** internal
d4a0: 20 73 63 68 65 6d 61 20 64 61 74 61 20 73 74 72   schema data str
d4b0: 75 63 74 75 72 65 73 20 61 6e 64 20 74 68 65 20  uctures and the 
d4c0: 67 65 6e 65 72 61 74 65 64 20 56 44 42 45 20 63  generated VDBE c
d4d0: 6f 64 65 20 73 6f 20 74 68 61 74 20 74 68 65 79  ode so that they
d4e0: 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f 70 72 69  .** are appropri
d4f0: 61 74 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55  ate for a WITHOU
d500: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20 69 6e  T ROWID table in
d510: 73 74 65 61 64 20 6f 66 20 61 20 72 6f 77 69 64  stead of a rowid
d520: 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67   table..** Chang
d530: 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a  es include:.**.*
d540: 2a 20 20 20 20 20 28 31 29 20 20 53 65 74 20 61  *     (1)  Set a
d550: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  ll columns of th
d560: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 73 63  e PRIMARY KEY sc
d570: 68 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f 20 62  hema object to b
d580: 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20  e NOT NULL..**  
d590: 20 20 20 28 32 29 20 20 43 6f 6e 76 65 72 74 20     (2)  Convert 
d5a0: 74 68 65 20 4f 50 5f 43 72 65 61 74 65 54 61 62  the OP_CreateTab
d5b0: 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 43 72  le into an OP_Cr
d5c0: 65 61 74 65 49 6e 64 65 78 2e 20 20 54 68 65 72  eateIndex.  Ther
d5d0: 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  e is.**         
d5e0: 20 6e 6f 20 72 6f 77 69 64 20 62 74 72 65 65 20   no rowid btree 
d5f0: 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f  for a WITHOUT RO
d600: 57 49 44 2e 20 20 49 6e 73 74 65 61 64 2c 20 74  WID.  Instead, t
d610: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20  he canonical.** 
d620: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 73 74           data st
d630: 6f 72 61 67 65 20 69 73 20 61 20 63 6f 76 65 72  orage is a cover
d640: 69 6e 67 20 69 6e 64 65 78 20 62 74 72 65 65 2e  ing index btree.
d650: 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 42 79 70  .**     (3)  Byp
d660: 61 73 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e  ass the creation
d670: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   of the sqlite_m
d680: 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72  aster table entr
d690: 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f  y.**          fo
d6a0: 72 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  r the PRIMARY KE
d6b0: 59 20 61 73 20 74 68 65 20 70 72 69 6d 61 72 79  Y as the primary
d6c0: 20 6b 65 79 20 69 6e 64 65 78 20 69 73 20 6e 6f   key index is no
d6d0: 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 64  w.**          id
d6e0: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
d6f0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
d700: 62 6c 65 20 65 6e 74 72 79 20 6f 66 20 74 68 65  ble entry of the
d710: 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 0a 2a   table itself..*
d720: 2a 20 20 20 20 20 28 34 29 20 20 53 65 74 20 74  *     (4)  Set t
d730: 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d 20 6f 66  he Index.tnum of
d740: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
d750: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e   Index object in
d760: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
d770: 20 73 63 68 65 6d 61 20 74 6f 20 74 68 65 20 72   schema to the r
d780: 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ootpage from the
d790: 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 20   main table..** 
d7a0: 20 20 20 20 28 35 29 20 20 41 64 64 20 61 6c 6c      (5)  Add all
d7b0: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74   table columns t
d7c0: 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  o the PRIMARY KE
d7d0: 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 0a 2a  Y Index object.*
d7e0: 2a 20 20 20 20 20 20 20 20 20 20 73 6f 20 74 68  *          so th
d7f0: 61 74 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  at the PRIMARY K
d800: 45 59 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67  EY is a covering
d810: 20 69 6e 64 65 78 2e 20 20 54 68 65 20 73 75 72   index.  The sur
d820: 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  plus.**         
d830: 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70 61 72   columns are par
d840: 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e 6e 58 46  t of KeyInfo.nXF
d850: 69 65 6c 64 20 61 6e 64 20 61 72 65 20 6e 6f 74  ield and are not
d860: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20 20   used for.**    
d870: 20 20 20 20 20 20 73 6f 72 74 69 6e 67 20 6f 72        sorting or
d880: 20 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e 69 71 75   lookup or uniqu
d890: 65 6e 65 73 73 20 63 68 65 63 6b 73 2e 0a 2a 2a  eness checks..**
d8a0: 20 20 20 20 20 28 36 29 20 20 52 65 70 6c 61 63       (6)  Replac
d8b0: 65 20 74 68 65 20 72 6f 77 69 64 20 74 61 69 6c  e the rowid tail
d8c0: 20 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d 61 74 69   on all automati
d8d0: 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 20  cally generated 
d8e0: 55 4e 49 51 55 45 0a 2a 2a 20 20 20 20 20 20 20  UNIQUE.**       
d8f0: 20 20 20 69 6e 64 69 63 65 73 20 77 69 74 68 20     indices with 
d900: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d910: 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 46  columns..**.** F
d920: 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
d930: 73 2c 20 6f 6e 6c 79 20 28 31 29 20 69 73 20 70  s, only (1) is p
d940: 65 72 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61  erformed..*/.sta
d950: 74 69 63 20 76 6f 69 64 20 63 6f 6e 76 65 72 74  tic void convert
d960: 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61  ToWithoutRowidTa
d970: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
d980: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  e, Table *pTab){
d990: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
d9a0: 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 0a 20 20    Index *pPk;.  
d9b0: 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e 74 20 69  int nPk;.  int i
d9c0: 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  , j;.  sqlite3 *
d9d0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d9e0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
d9f0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 2f  rse->pVdbe;..  /
da00: 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 50 52 49  * Mark every PRI
da10: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
da20: 61 73 20 4e 4f 54 20 4e 55 4c 4c 20 28 65 78 63  as NOT NULL (exc
da30: 65 70 74 20 66 6f 72 20 69 6d 70 6f 73 74 65 72  ept for imposter
da40: 20 74 61 62 6c 65 73 29 0a 20 20 2a 2f 0a 20 20   tables).  */.  
da50: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d  if( !db->init.im
da60: 70 6f 73 74 65 72 54 61 62 6c 65 20 29 7b 0a 20  posterTable ){. 
da70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
da80: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
da90: 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62 2d        if( (pTab-
daa0: 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c 61 67  >aCol[i].colFlag
dab0: 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d  s & COLFLAG_PRIM
dac0: 4b 45 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  KEY)!=0 ){.     
dad0: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d     pTab->aCol[i]
dae0: 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 4f 45 5f 41 62  .notNull = OE_Ab
daf0: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
db00: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
db10: 20 72 65 6d 61 69 6e 69 6e 67 20 74 72 61 6e 73   remaining trans
db20: 66 6f 72 6d 61 74 69 6f 6e 73 20 6f 6e 6c 79 20  formations only 
db30: 61 70 70 6c 79 20 74 6f 20 62 2d 74 72 65 65 20  apply to b-tree 
db40: 74 61 62 6c 65 73 2c 20 6e 6f 74 20 74 6f 0a 20  tables, not to. 
db50: 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c   ** virtual tabl
db60: 65 73 20 2a 2f 0a 20 20 69 66 28 20 49 4e 5f 44  es */.  if( IN_D
db70: 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 72 65  ECLARE_VTAB ) re
db80: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76  turn;..  /* Conv
db90: 65 72 74 20 74 68 65 20 4f 50 5f 43 72 65 61 74  ert the OP_Creat
dba0: 65 54 61 62 6c 65 20 6f 70 63 6f 64 65 20 74 68  eTable opcode th
dbb0: 61 74 20 77 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  at would normall
dbc0: 79 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 2a  y create the.  *
dbd0: 2a 20 72 6f 6f 74 2d 70 61 67 65 20 66 6f 72 20  * root-page for 
dbe0: 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 61  the table into a
dbf0: 6e 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  n OP_CreateIndex
dc00: 20 6f 70 63 6f 64 65 2e 20 20 54 68 65 20 69 6e   opcode.  The in
dc10: 64 65 78 0a 20 20 2a 2a 20 63 72 65 61 74 65 64  dex.  ** created
dc20: 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
dc30: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
dc40: 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ex..  */.  if( p
dc50: 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62  Parse->addrCrTab
dc60: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
dc70: 76 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  v );.    sqlite3
dc80: 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65  VdbeChangeOpcode
dc90: 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72  (v, pParse->addr
dca0: 43 72 54 61 62 2c 20 4f 50 5f 43 72 65 61 74 65  CrTab, OP_Create
dcb0: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Index);.  }..  /
dcc0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 50 52 49  * Locate the PRI
dcd0: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20  MARY KEY index. 
dce0: 20 4f 72 2c 20 69 66 20 74 68 69 73 20 74 61 62   Or, if this tab
dcf0: 6c 65 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  le was originall
dd00: 79 0a 20 20 2a 2a 20 61 6e 20 49 4e 54 45 47 45  y.  ** an INTEGE
dd10: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74 61  R PRIMARY KEY ta
dd20: 62 6c 65 2c 20 63 72 65 61 74 65 20 61 20 6e 65  ble, create a ne
dd30: 77 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  w PRIMARY KEY in
dd40: 64 65 78 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  dex. .  */.  if(
dd50: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20   pTab->iPKey>=0 
dd60: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
dd70: 2a 70 4c 69 73 74 3b 0a 20 20 20 20 54 6f 6b 65  *pList;.    Toke
dd80: 6e 20 69 70 6b 54 6f 6b 65 6e 3b 0a 20 20 20 20  n ipkToken;.    
dd90: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74  sqlite3TokenInit
dda0: 28 26 69 70 6b 54 6f 6b 65 6e 2c 20 70 54 61 62  (&ipkToken, pTab
ddb0: 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b  ->aCol[pTab->iPK
ddc0: 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ey].zName);.    
ddd0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
dde0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
ddf0: 61 72 73 65 2c 20 30 2c 20 0a 20 20 20 20 20 20  arse, 0, .      
de00: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
de10: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
de20: 20 54 4b 5f 49 44 2c 20 26 69 70 6b 54 6f 6b 65   TK_ID, &ipkToke
de30: 6e 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20  n, 0));.    if( 
de40: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
de50: 6e 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  n;.    pList->a[
de60: 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70  0].sortOrder = p
de70: 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72  Parse->iPkSortOr
de80: 64 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  der;.    assert(
de90: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
dea0: 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  le==pTab );.    
deb0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
dec0: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
ded0: 20 30 2c 20 70 4c 69 73 74 2c 20 70 54 61 62 2d   0, pList, pTab-
dee0: 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20  >keyConf, 0, 0, 
def0: 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
df10: 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d  ITE_IDXTYPE_PRIM
df20: 41 52 59 4b 45 59 29 3b 0a 20 20 20 20 69 66 28  ARYKEY);.    if(
df30: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
df40: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  d ) return;.    
df50: 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
df60: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
df70: 62 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50  b);.    pTab->iP
df80: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73  Key = -1;.  }els
df90: 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c  e{.    pPk = sql
dfa0: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
dfb0: 64 65 78 28 70 54 61 62 29 3b 0a 0a 20 20 20 20  dex(pTab);..    
dfc0: 2f 2a 20 42 79 70 61 73 73 20 74 68 65 20 63 72  /* Bypass the cr
dfd0: 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 52  eation of the PR
dfe0: 49 4d 41 52 59 20 4b 45 59 20 62 74 72 65 65 20  IMARY KEY btree 
dff0: 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  and the sqlite_m
e000: 61 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 61 62  aster.    ** tab
e010: 6c 65 20 65 6e 74 72 79 2e 20 54 68 69 73 20 69  le entry. This i
e020: 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20  s only required 
e030: 69 66 20 63 75 72 72 65 6e 74 6c 79 20 67 65 6e  if currently gen
e040: 65 72 61 74 69 6e 67 20 56 44 42 45 0a 20 20 20  erating VDBE.   
e050: 20 2a 2a 20 63 6f 64 65 20 66 6f 72 20 61 20 43   ** code for a C
e060: 52 45 41 54 45 20 54 41 42 4c 45 20 28 6e 6f 74  REATE TABLE (not
e070: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 6f 6e   when parsing on
e080: 65 20 61 73 20 70 61 72 74 20 6f 66 20 72 65 61  e as part of rea
e090: 64 69 6e 67 0a 20 20 20 20 2a 2a 20 61 20 64 61  ding.    ** a da
e0a0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 29 2e 20  tabase schema). 
e0b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 76 20 29 7b   */.    if( v ){
e0c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64  .      assert( d
e0d0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
e0e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e0f0: 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65  VdbeChangeOpcode
e100: 28 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d 2c 20 4f  (v, pPk->tnum, O
e110: 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a  P_Goto);.    }..
e120: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65      /*.    ** Re
e130: 6d 6f 76 65 20 61 6c 6c 20 72 65 64 75 6e 64 61  move all redunda
e140: 6e 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  nt columns from 
e150: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  the PRIMARY KEY.
e160: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63    For example, c
e170: 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 22 50 52  hange.    ** "PR
e180: 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 61 2c  IMARY KEY(a,b,a,
e190: 62 2c 63 2c 62 2c 63 2c 64 29 22 20 69 6e 74 6f  b,c,b,c,d)" into
e1a0: 20 6a 75 73 74 20 22 50 52 49 4d 41 52 59 20 4b   just "PRIMARY K
e1b0: 45 59 28 61 2c 62 2c 63 2c 64 29 22 2e 20 20 4c  EY(a,b,c,d)".  L
e1c0: 61 74 65 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65  ater.    ** code
e1d0: 20 61 73 73 75 6d 65 73 20 74 68 65 20 50 52 49   assumes the PRI
e1e0: 4d 41 52 59 20 4b 45 59 20 63 6f 6e 74 61 69 6e  MARY KEY contain
e1f0: 73 20 6e 6f 20 72 65 70 65 61 74 65 64 20 63 6f  s no repeated co
e200: 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  lumns..    */.  
e210: 20 20 66 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c 70    for(i=j=1; i<p
e220: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b  Pk->nKeyCol; i++
e230: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73  ){.      if( has
e240: 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f  Column(pPk->aiCo
e250: 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69  lumn, j, pPk->ai
e260: 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20  Column[i]) ){.  
e270: 20 20 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75        pPk->nColu
e280: 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  mn--;.      }els
e290: 65 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e  e{.        pPk->
e2a0: 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20  aiColumn[j++] = 
e2b0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
e2c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e2d0: 20 20 20 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c      pPk->nKeyCol
e2e0: 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = j;.  }.  asse
e2f0: 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20  rt( pPk!=0 );.  
e300: 70 50 6b 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  pPk->isCovering 
e310: 3d 20 31 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e  = 1;.  if( !db->
e320: 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62  init.imposterTab
e330: 6c 65 20 29 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f  le ) pPk->uniqNo
e340: 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 6e 50 6b  tNull = 1;.  nPk
e350: 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   = pPk->nKeyCol;
e360: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20  ..  /* The root 
e370: 70 61 67 65 20 6f 66 20 74 68 65 20 50 52 49 4d  page of the PRIM
e380: 41 52 59 20 4b 45 59 20 69 73 20 74 68 65 20 74  ARY KEY is the t
e390: 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 20 2a  able root page *
e3a0: 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20  /.  pPk->tnum = 
e3b0: 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f  pTab->tnum;..  /
e3c0: 2a 20 55 70 64 61 74 65 20 74 68 65 20 69 6e 2d  * Update the in-
e3d0: 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
e3e0: 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e 49  ation of all UNI
e3f0: 51 55 45 20 69 6e 64 69 63 65 73 20 62 79 20 63  QUE indices by c
e400: 6f 6e 76 65 72 74 69 6e 67 0a 20 20 2a 2a 20 74  onverting.  ** t
e410: 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 20 63  he final rowid c
e420: 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f  olumn into one o
e430: 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f  r more columns o
e440: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
e450: 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49  Y..  */.  for(pI
e460: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
e470: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
e480: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
e490: 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 49 73 50  t n;.    if( IsP
e4a0: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
e4b0: 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Idx) ) continue;
e4c0: 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20  .    for(i=n=0; 
e4d0: 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nPk; i++){.   
e4e0: 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d     if( !hasColum
e4f0: 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  n(pIdx->aiColumn
e500: 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c  , pIdx->nKeyCol,
e510: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
e520: 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a  ]) ) n++;.    }.
e530: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
e540: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e        /* This in
e550: 64 65 78 20 69 73 20 61 20 73 75 70 65 72 73 65  dex is a superse
e560: 74 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79  t of the primary
e570: 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20 70 49   key */.      pI
e580: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49  dx->nColumn = pI
e590: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20  dx->nKeyCol;.   
e5a0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
e5b0: 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a   }.    if( resiz
e5c0: 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c  eIndexObject(db,
e5d0: 20 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b 65   pIdx, pIdx->nKe
e5e0: 79 43 6f 6c 2b 6e 29 20 29 20 72 65 74 75 72 6e  yCol+n) ) return
e5f0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a  ;.    for(i=0, j
e600: 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  =pIdx->nKeyCol; 
e610: 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nPk; i++){.   
e620: 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d     if( !hasColum
e630: 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  n(pIdx->aiColumn
e640: 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c  , pIdx->nKeyCol,
e650: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
e660: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  ]) ){.        pI
e670: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20  dx->aiColumn[j] 
e680: 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  = pPk->aiColumn[
e690: 69 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  i];.        pIdx
e6a0: 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70 50  ->azColl[j] = pP
e6b0: 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  k->azColl[i];.  
e6c0: 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
e6d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
e6e0: 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
e6f0: 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  mn>=pIdx->nKeyCo
e700: 6c 2b 6e 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l+n );.    asser
e710: 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
e720: 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  >=j );.  }..  /*
e730: 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63   Add all table c
e740: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52  olumns to the PR
e750: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a  IMARY KEY index.
e760: 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 6b 3c 70    */.  if( nPk<p
e770: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
e780: 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78   if( resizeIndex
e790: 4f 62 6a 65 63 74 28 64 62 2c 20 70 50 6b 2c 20  Object(db, pPk, 
e7a0: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 20 72 65  pTab->nCol) ) re
e7b0: 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  turn;.    for(i=
e7c0: 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54 61 62  0, j=nPk; i<pTab
e7d0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
e7e0: 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75      if( !hasColu
e7f0: 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  mn(pPk->aiColumn
e800: 2c 20 6a 2c 20 69 29 20 29 7b 0a 20 20 20 20 20  , j, i) ){.     
e810: 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 50 6b     assert( j<pPk
e820: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20  ->nColumn );.   
e830: 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75       pPk->aiColu
e840: 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[j] = i;.     
e850: 20 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a     pPk->azColl[j
e860: 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49  ] = sqlite3StrBI
e870: 4e 41 52 59 3b 0a 20 20 20 20 20 20 20 20 6a 2b  NARY;.        j+
e880: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
e890: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 6b  .    assert( pPk
e8a0: 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a  ->nColumn==j );.
e8b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
e8c0: 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d  ->nCol==j );.  }
e8d0: 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e  else{.    pPk->n
e8e0: 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e  Column = pTab->n
e8f0: 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Col;.  }.}../*.*
e900: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
e910: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f  s called to repo
e920: 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22  rt the final ")"
e930: 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73   that terminates
e940: 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41 42  .** a CREATE TAB
e950: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
e960: 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74  .** The table st
e970: 72 75 63 74 75 72 65 20 74 68 61 74 20 6f 74 68  ructure that oth
e980: 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  er action routin
e990: 65 73 20 68 61 76 65 20 62 65 65 6e 20 62 75 69  es have been bui
e9a0: 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65  lding.** is adde
e9b0: 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61  d to the interna
e9c0: 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61  l hash tables, a
e9d0: 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72  ssuming no error
e9e0: 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72  s have.** occurr
e9f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74  ed..**.** An ent
ea00: 72 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ry for the table
ea10: 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20   is made in the 
ea20: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20  master table on 
ea30: 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20  disk, unless.** 
ea40: 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72  this is a tempor
ea50: 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d  ary table or db-
ea60: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20  >init.busy==1.  
ea70: 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75  When db->init.bu
ea80: 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e  sy==1.** it mean
ea90: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
eaa0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
eab0: 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65  er table because
eac0: 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e   we just.** conn
ead0: 65 63 74 65 64 20 74 6f 20 74 68 65 20 64 61 74  ected to the dat
eae0: 61 62 61 73 65 20 6f 72 20 62 65 63 61 75 73 65  abase or because
eaf0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
eb00: 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20  er table has.** 
eb10: 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64  recently changed
eb20: 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66  , so the entry f
eb30: 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c  or this table al
eb40: 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a  ready exists in.
eb50: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ** the sqlite_ma
eb60: 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20  ster table.  We 
eb70: 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63  do not want to c
eb80: 72 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a  reate it again..
eb90: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65  **.** If the pSe
eba0: 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73  lect argument is
ebb0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65   not NULL, it me
ebc0: 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 72 6f  ans that this ro
ebd0: 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c  utine.** was cal
ebe0: 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
ebf0: 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
ec00: 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41  from a .** "CREA
ec10: 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20  TE TABLE ... AS 
ec20: 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74  SELECT ..." stat
ec30: 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75  ement.  The colu
ec40: 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  mn names of.** t
ec50: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c  he new table wil
ec60: 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65 73 75  l match the resu
ec70: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
ec80: 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  LECT..*/.void sq
ec90: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20  lite3EndTable(. 
eca0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ecb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
ecc0: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
ecd0: 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20  oken *pCons,    
ece0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c         /* The ',
ecf0: 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68  ' token after th
ed00: 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65  e last column de
ed10: 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  fn. */.  Token *
ed20: 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  pEnd,           
ed30: 20 2f 2a 20 54 68 65 20 27 29 27 20 62 65 66 6f   /* The ')' befo
ed40: 72 65 20 6f 70 74 69 6f 6e 73 20 69 6e 20 74 68  re options in th
ed50: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a  e CREATE TABLE *
ed60: 2f 0a 20 20 75 38 20 74 61 62 4f 70 74 73 2c 20  /.  u8 tabOpts, 
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
ed80: 78 74 72 61 20 74 61 62 6c 65 20 6f 70 74 69 6f  xtra table optio
ed90: 6e 73 2e 20 55 73 75 61 6c 6c 79 20 30 2e 20 2a  ns. Usually 0. *
eda0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
edb0: 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ect         /* S
edc0: 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52  elect from a "CR
edd0: 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45  EATE ... AS SELE
ede0: 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  CT" */.){.  Tabl
edf0: 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
ee00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
ee10: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
ee20: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
ee30: 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74  ->db; /* The dat
ee40: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
ee50: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee70: 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e 20 77  /* Database in w
ee80: 68 69 63 68 20 74 68 65 20 74 61 62 6c 65 20 6c  hich the table l
ee90: 69 76 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ives */.  Index 
eea0: 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
eeb0: 20 20 20 20 2f 2a 20 41 6e 20 69 6d 70 6c 69 65      /* An implie
eec0: 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74  d index of the t
eed0: 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70  able */..  if( p
eee0: 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63  End==0 && pSelec
eef0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
ef00: 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
ef10: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
ef20: 6c 65 64 20 29 3b 0a 20 20 70 20 3d 20 70 50 61  led );.  p = pPa
ef30: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
ef40: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
ef50: 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
ef60: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c  !db->init.busy |
ef70: 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20  | !pSelect );.. 
ef80: 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69   /* If the db->i
ef90: 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74  nit.busy is 1 it
efa0: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
efb0: 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66  ading the SQL of
efc0: 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69  f the.  ** "sqli
efd0: 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73  te_master" or "s
efe0: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
eff0: 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  r" table on the 
f000: 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f  disk..  ** So do
f010: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
f020: 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45  e disk again.  E
f030: 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20  xtract the root 
f040: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
f050: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66   for the table f
f060: 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74  rom the db->init
f070: 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20  .newTnum field. 
f080: 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65   (The page numbe
f090: 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61  r.  ** should ha
f0a0: 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72  ve been put ther
f0b0: 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f  e by the sqliteO
f0c0: 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a  penCb routine.).
f0d0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
f0e0: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
f0f0: 72 20 69 73 20 31 2c 20 74 68 61 74 20 6d 65 61  r is 1, that mea
f100: 6e 73 20 74 68 69 73 20 69 73 20 74 68 65 20 73  ns this is the s
f110: 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a  qlite_master.  *
f120: 2a 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 20  * table itself. 
f130: 20 53 6f 20 6d 61 72 6b 20 69 74 20 72 65 61 64   So mark it read
f140: 2d 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  -only..  */.  if
f150: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
f160: 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d  ){.    p->tnum =
f170: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
f180: 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 6e  m;.    if( p->tn
f190: 75 6d 3d 3d 31 20 29 20 70 2d 3e 74 61 62 46 6c  um==1 ) p->tabFl
f1a0: 61 67 73 20 7c 3d 20 54 46 5f 52 65 61 64 6f 6e  ags |= TF_Readon
f1b0: 6c 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  ly;.  }..  /* Sp
f1c0: 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67  ecial processing
f1d0: 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
f1e0: 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69  ID Tables */.  i
f1f0: 66 28 20 74 61 62 4f 70 74 73 20 26 20 54 46 5f  f( tabOpts & TF_
f200: 57 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a  WithoutRowid ){.
f210: 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46      if( (p->tabF
f220: 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
f230: 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20  crement) ){.    
f240: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f250: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
f260: 20 20 20 20 22 41 55 54 4f 49 4e 43 52 45 4d 45      "AUTOINCREME
f270: 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  NT not allowed o
f280: 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  n WITHOUT ROWID 
f290: 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20  tables");.      
f2a0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
f2b0: 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61    if( (p->tabFla
f2c0: 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61  gs & TF_HasPrima
f2d0: 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20  ryKey)==0 ){.   
f2e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
f2f0: 73 67 28 70 50 61 72 73 65 2c 20 22 50 52 49 4d  sg(pParse, "PRIM
f300: 41 52 59 20 4b 45 59 20 6d 69 73 73 69 6e 67 20  ARY KEY missing 
f310: 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c 20 70 2d  on table %s", p-
f320: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  >zName);.    }el
f330: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61 62  se{.      p->tab
f340: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69 74 68  Flags |= TF_With
f350: 6f 75 74 52 6f 77 69 64 20 7c 20 54 46 5f 4e 6f  outRowid | TF_No
f360: 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20  VisibleRowid;.  
f370: 20 20 20 20 63 6f 6e 76 65 72 74 54 6f 57 69 74      convertToWit
f380: 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 70  houtRowidTable(p
f390: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d  Parse, p);.    }
f3a0: 0a 20 20 7d 0a 0a 20 20 69 44 62 20 3d 20 73 71  .  }..  iDb = sq
f3b0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
f3c0: 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  ex(db, p->pSchem
f3d0: 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  a);..#ifndef SQL
f3e0: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
f3f0: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65   /* Resolve name
f400: 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63  s in all CHECK c
f410: 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65 73  onstraint expres
f420: 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  sions..  */.  if
f430: 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20  ( p->pCheck ){. 
f440: 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
f450: 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70  eSelfReference(p
f460: 50 61 72 73 65 2c 20 70 2c 20 4e 43 5f 49 73 43  Parse, p, NC_IsC
f470: 68 65 63 6b 2c 20 30 2c 20 70 2d 3e 70 43 68 65  heck, 0, p->pChe
f480: 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  ck);.  }.#endif 
f490: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
f4a0: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a  TE_OMIT_CHECK) *
f4b0: 2f 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65  /..  /* Estimate
f4c0: 20 74 68 65 20 61 76 65 72 61 67 65 20 72 6f 77   the average row
f4d0: 20 73 69 7a 65 20 66 6f 72 20 74 68 65 20 74 61   size for the ta
f4e0: 62 6c 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20  ble and for all 
f4f0: 69 6d 70 6c 69 65 64 20 69 6e 64 69 63 65 73 20  implied indices 
f500: 2a 2f 0a 20 20 65 73 74 69 6d 61 74 65 54 61 62  */.  estimateTab
f510: 6c 65 57 69 64 74 68 28 70 29 3b 0a 20 20 66 6f  leWidth(p);.  fo
f520: 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78  r(pIdx=p->pIndex
f530: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
f540: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 65  x->pNext){.    e
f550: 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74  stimateIndexWidt
f560: 68 28 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20  h(pIdx);.  }..  
f570: 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61  /* If not initia
f580: 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65  lizing, then cre
f590: 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72  ate a record for
f5a0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20   the new table. 
f5b0: 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54   ** in the SQLIT
f5c0: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f  E_MASTER table o
f5d0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
f5e0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
f5f0: 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59  s is a TEMPORARY
f600: 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68   table, write th
f610: 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  e entry into the
f620: 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
f630: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
f640: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
f650: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
f660: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
f670: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e  t.busy ){.    in
f680: 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t n;.    Vdbe *v
f690: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
f6a0: 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20  e;    /* "view" 
f6b0: 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20  or "table" */.  
f6c0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20    char *zType2; 
f6d0: 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22    /* "VIEW" or "
f6e0: 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68  TABLE" */.    ch
f6f0: 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a  ar *zStmt;    /*
f700: 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   Text of the CRE
f710: 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45  ATE TABLE or CRE
f720: 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
f730: 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73  nt */..    v = s
f740: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
f750: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e  arse);.    if( N
f760: 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74  EVER(v==0) ) ret
f770: 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  urn;..    sqlite
f780: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
f790: 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20  P_Close, 0);..  
f7a0: 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69    /* .    ** Ini
f7b0: 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f  tialize zType fo
f7c0: 72 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 6f  r the new view o
f7d0: 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  r table..    */.
f7e0: 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65      if( p->pSele
f7f0: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ct==0 ){.      /
f800: 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c  * A regular tabl
f810: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65  e */.      zType
f820: 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20   = "table";.    
f830: 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c    zType2 = "TABL
f840: 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  E";.#ifndef SQLI
f850: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20  TE_OMIT_VIEW.   
f860: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
f870: 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20   A view */.     
f880: 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b   zType = "view";
f890: 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20  .      zType2 = 
f8a0: 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20  "VIEW";.#endif. 
f8b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
f8c0: 74 68 69 73 20 69 73 20 61 20 43 52 45 41 54 45  this is a CREATE
f8d0: 20 54 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c   TABLE xx AS SEL
f8e0: 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65  ECT ..., execute
f8f0: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
f900: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  ** statement to 
f910: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77  populate the new
f920: 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74   table. The root
f930: 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72  -page number for
f940: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20   the.    ** new 
f950: 74 61 62 6c 65 20 69 73 20 69 6e 20 72 65 67 69  table is in regi
f960: 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67  ster pParse->reg
f970: 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  Root..    **.   
f980: 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c   ** Once the SEL
f990: 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64  ECT has been cod
f9a0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c  ed by sqlite3Sel
f9b0: 65 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20  ect(), it is in 
f9c0: 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c  a.    ** suitabl
f9d0: 65 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79  e state to query
f9e0: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
f9f0: 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20  names and types 
fa00: 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a  to be used.    *
fa10: 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62  * by the new tab
fa20: 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
fa30: 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63 68 65  * A shared-cache
fa40: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e   write-lock is n
fa50: 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 77  ot required to w
fa60: 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20  rite to the new 
fa70: 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73  table,.    ** as
fa80: 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d   a schema-lock m
fa90: 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
faa0: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74   been obtained t
fab0: 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e  o create it. Sin
fac0: 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65  ce.    ** a sche
fad0: 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73  ma-lock excludes
fae0: 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62   all other datab
faf0: 61 73 65 20 75 73 65 72 73 2c 20 74 68 65 20 77  ase users, the w
fb00: 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a  rite-lock would.
fb10: 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64      ** be redund
fb20: 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ant..    */.    
fb30: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
fb40: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
fb50: 64 65 73 74 3b 20 20 20 20 2f 2a 20 57 68 65 72  dest;    /* Wher
fb60: 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 68 6f  e the SELECT sho
fb70: 75 6c 64 20 73 74 6f 72 65 20 72 65 73 75 6c 74  uld store result
fb80: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  s */.      int r
fb90: 65 67 59 69 65 6c 64 3b 20 20 20 20 20 20 20 2f  egYield;       /
fba0: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
fbb0: 6e 67 20 63 6f 2d 72 6f 75 74 69 6e 65 20 65 6e  ng co-routine en
fbc0: 74 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  try-point */.   
fbd0: 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20     int addrTop; 
fbe0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
fbf0: 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
fc00: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
fc10: 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Rec;         /* 
fc20: 41 20 72 65 63 6f 72 64 20 74 6f 20 62 65 20 69  A record to be i
fc30: 6e 73 65 72 74 20 69 6e 74 6f 20 74 68 65 20 6e  nsert into the n
fc40: 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ew table */.    
fc50: 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 20    int regRowid; 
fc60: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 6f        /* Rowid o
fc70: 66 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 74  f the next row t
fc80: 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20  o insert */.    
fc90: 20 20 69 6e 74 20 61 64 64 72 49 6e 73 4c 6f 6f    int addrInsLoo
fca0: 70 3b 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20  p;    /* Top of 
fcb0: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 69 6e 73  the loop for ins
fcc0: 65 72 74 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20  erting rows */. 
fcd0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c       Table *pSel
fce0: 54 61 62 3b 20 20 20 20 20 2f 2a 20 41 20 74 61  Tab;     /* A ta
fcf0: 62 6c 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ble that describ
fd00: 65 73 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  es the SELECT re
fd10: 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20  sults */..      
fd20: 72 65 67 59 69 65 6c 64 20 3d 20 2b 2b 70 50 61  regYield = ++pPa
fd30: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
fd40: 20 72 65 67 52 65 63 20 3d 20 2b 2b 70 50 61 72   regRec = ++pPar
fd50: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
fd60: 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61  regRowid = ++pPa
fd70: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
fd80: 20 61 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e   assert(pParse->
fd90: 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20  nTab==1);.      
fda0: 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
fdb0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
fdc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
fdd0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
fde0: 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65 67  , 1, pParse->reg
fdf0: 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20  Root, iDb);.    
fe00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
fe10: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
fe20: 50 32 49 53 52 45 47 29 3b 0a 20 20 20 20 20 20  P2ISREG);.      
fe30: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32  pParse->nTab = 2
fe40: 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 20  ;.      addrTop 
fe50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
fe60: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b  rentAddr(v) + 1;
fe70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fe80: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
fe90: 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
fea0: 67 59 69 65 6c 64 2c 20 30 2c 20 61 64 64 72 54  gYield, 0, addrT
feb0: 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
fec0: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
fed0: 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f  (&dest, SRT_Coro
fee0: 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29  utine, regYield)
fef0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
ff00: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
ff10: 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20  elect, &dest);. 
ff20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ff30: 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20  EndCoroutine(v, 
ff40: 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 20  regYield);.     
ff50: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
ff60: 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 20  Here(v, addrTop 
ff70: 2d 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  - 1);.      if( 
ff80: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
ff90: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 70 53 65  eturn;.      pSe
ffa0: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
ffb0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
ffc0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29  pParse, pSelect)
ffd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c  ;.      if( pSel
ffe0: 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Tab==0 ) return;
fff0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10000 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
10010 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65     p->nCol = pSe
10020 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
10030 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c    p->aCol = pSel
10040 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
10050 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
10060 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61   0;.      pSelTa
10070 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
10080 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
10090 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61  Table(db, pSelTa
100a0 62 29 3b 0a 20 20 20 20 20 20 61 64 64 72 49 6e  b);.      addrIn
100b0 73 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  sLoop = sqlite3V
100c0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
100d0 59 69 65 6c 64 2c 20 64 65 73 74 2e 69 53 44 50  Yield, dest.iSDP
100e0 61 72 6d 29 3b 0a 20 20 20 20 20 20 56 64 62 65  arm);.      Vdbe
100f0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
10100 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10110 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
10120 65 63 6f 72 64 2c 20 64 65 73 74 2e 69 53 64 73  ecord, dest.iSds
10130 74 2c 20 64 65 73 74 2e 6e 53 64 73 74 2c 20 72  t, dest.nSdst, r
10140 65 67 52 65 63 29 3b 0a 20 20 20 20 20 20 73 71  egRec);.      sq
10150 6c 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e 69  lite3TableAffini
10160 74 79 28 76 2c 20 70 2c 20 30 29 3b 0a 20 20 20  ty(v, p, 0);.   
10170 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10180 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
10190 77 69 64 2c 20 31 2c 20 72 65 67 52 6f 77 69 64  wid, 1, regRowid
101a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
101b0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
101c0 5f 49 6e 73 65 72 74 2c 20 31 2c 20 72 65 67 52  _Insert, 1, regR
101d0 65 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  ec, regRowid);. 
101e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
101f0 47 6f 74 6f 28 76 2c 20 61 64 64 72 49 6e 73 4c  Goto(v, addrInsL
10200 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oop);.      sqli
10210 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
10220 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b  v, addrInsLoop);
10230 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10240 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
10250 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  lose, 1);.    }.
10260 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
10270 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
10280 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
10290 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
102a0 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
102b0 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72        zStmt = cr
102c0 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62  eateTableStmt(db
102d0 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , p);.    }else{
102e0 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45  .      Token *pE
102f0 6e 64 32 20 3d 20 74 61 62 4f 70 74 73 20 3f 20  nd2 = tabOpts ? 
10300 26 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f  &pParse->sLastTo
10310 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20  ken : pEnd;.    
10320 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64    n = (int)(pEnd
10330 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73  2->z - pParse->s
10340 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20  NameToken.z);.  
10350 20 20 20 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a      if( pEnd2->z
10360 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20  [0]!=';' ) n += 
10370 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20  pEnd2->n;.      
10380 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
10390 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20  Printf(db, .    
103a0 20 20 20 20 20 20 22 43 52 45 41 54 45 20 25 73        "CREATE %s
103b0 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20   %.*s", zType2, 
103c0 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65  n, pParse->sName
103d0 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b  Token.z.      );
103e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
103f0 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65   slot for the re
10400 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79  cord has already
10410 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
10420 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53  in the .    ** S
10430 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
10440 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65  le.  We just nee
10450 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74  d to update that
10460 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20   slot with all. 
10470 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d     ** the inform
10480 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c  ation we've coll
10490 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ected..    */.  
104a0 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
104b0 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
104c0 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
104d0 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45 54   ".         "SET
104e0 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65   type='%s', name
104f0 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  =%Q, tbl_name=%Q
10500 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20  , rootpage=#%d, 
10510 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20  sql=%Q ".       
10520 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64  "WHERE rowid=#%d
10530 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ",.      db->aDb
10540 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20  [iDb].zDbSName, 
10550 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20  MASTER_NAME,.   
10560 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20     zType,.      
10570 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
10580 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
10590 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c  pParse->regRoot,
105a0 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20  .      zStmt,.  
105b0 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52      pParse->regR
105c0 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20 20  owid.    );.    
105d0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
105e0 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71  , zStmt);.    sq
105f0 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
10600 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
10610 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10620 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
10630 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  NT.    /* Check 
10640 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65  to see if we nee
10650 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73  d to create an s
10660 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
10670 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20  able for.    ** 
10680 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66  keeping track of
10690 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b   autoincrement k
106a0 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eys..    */.    
106b0 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73  if( (p->tabFlags
106c0 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
106d0 65 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ent)!=0 ){.     
106e0 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
106f0 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20  aDb[iDb];.      
10700 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
10710 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
10720 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
10730 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63      if( pDb->pSc
10740 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30  hema->pSeqTab==0
10750 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
10760 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
10770 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
10780 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25   "CREATE TABLE %
10790 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  Q.sqlite_sequenc
107a0 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20  e(name,seq)",.  
107b0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62          pDb->zDb
107c0 53 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b  SName.        );
107d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
107e0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65  endif..    /* Re
107f0 70 61 72 73 65 20 65 76 65 72 79 74 68 69 6e 67  parse everything
10800 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69   to update our i
10810 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72  nternal data str
10820 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73  uctures */.    s
10830 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72  qlite3VdbeAddPar
10840 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44  seSchemaOp(v, iD
10850 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  b,.           sq
10860 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
10870 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20   "tbl_name='%q' 
10880 41 4e 44 20 74 79 70 65 21 3d 27 74 72 69 67 67  AND type!='trigg
10890 65 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29  er'", p->zName))
108a0 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64  ;.  }...  /* Add
108b0 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68   the table to th
108c0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
108d0 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
108e0 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  e database..  */
108f0 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
10900 62 75 73 79 20 29 7b 0a 20 20 20 20 54 61 62 6c  busy ){.    Tabl
10910 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68  e *pOld;.    Sch
10920 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70  ema *pSchema = p
10930 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61  ->pSchema;.    a
10940 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
10950 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
10960 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
10970 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48   pOld = sqlite3H
10980 61 73 68 49 6e 73 65 72 74 28 26 70 53 63 68 65  ashInsert(&pSche
10990 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e  ma->tblHash, p->
109a0 7a 4e 61 6d 65 2c 20 70 29 3b 0a 20 20 20 20 69  zName, p);.    i
109b0 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20  f( pOld ){.     
109c0 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64   assert( p==pOld
109d0 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
109e0 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
109f0 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72  inside HashInser
10a00 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  t() */.      sql
10a10 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
10a20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
10a30 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
10a40 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b  ->pNewTable = 0;
10a50 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
10a60 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
10a70 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66  hanges;..#ifndef
10a80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54   SQLITE_OMIT_ALT
10a90 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ERTABLE.    if( 
10aa0 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  !p->pSelect ){. 
10ab0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
10ac0 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
10ad0 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 73  char *)pParse->s
10ae0 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20  NameToken.z;.   
10af0 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20     int nName;.  
10b00 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 65      assert( !pSe
10b10 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26  lect && pCons &&
10b20 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69   pEnd );.      i
10b30 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29  f( pCons->z==0 )
10b40 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73 20  {.        pCons 
10b50 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  = pEnd;.      }.
10b60 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69        nName = (i
10b70 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72 20  nt)((const char 
10b80 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61  *)pCons->z - zNa
10b90 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  me);.      p->ad
10ba0 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20  dColOffset = 13 
10bb0 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61  + sqlite3Utf8Cha
10bc0 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  rLen(zName, nNam
10bd0 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
10be0 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
10bf0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
10c00 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
10c10 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
10c20 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
10c30 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49   create a new VI
10c40 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  EW.*/.void sqlit
10c50 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  e3CreateView(.  
10c60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10c70 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
10c80 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
10c90 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
10ca0 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
10cb0 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
10cc0 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
10cd0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
10ce0 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e1,     /* The t
10cf0 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
10d00 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
10d10 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
10d20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
10d30 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
10d40 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
10d50 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 45   the view */.  E
10d60 78 70 72 4c 69 73 74 20 2a 70 43 4e 61 6d 65 73  xprList *pCNames
10d70 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 6c 69  , /* Optional li
10d80 73 74 20 6f 66 20 76 69 65 77 20 63 6f 6c 75 6d  st of view colum
10d90 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 53 65 6c  n names */.  Sel
10da0 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
10db0 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74  /* A SELECT stat
10dc0 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20  ement that will 
10dd0 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76  become the new v
10de0 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
10df0 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  emp,        /* T
10e00 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52  RUE for a TEMPOR
10e10 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  ARY view */.  in
10e20 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20  t noErr         
10e30 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72   /* Suppress err
10e40 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56  or messages if V
10e50 49 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73  IEW already exis
10e60 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
10e70 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *p;.  int n;.  
10e80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
10e90 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44   Token sEnd;.  D
10ea0 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54  bFixer sFix;.  T
10eb0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
10ec0 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71  .  int iDb;.  sq
10ed0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
10ee0 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
10ef0 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b  Parse->nVar>0 ){
10f00 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
10f10 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61  rMsg(pParse, "pa
10f20 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74  rameters are not
10f30 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77   allowed in view
10f40 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72  s");.    goto cr
10f50 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a  eate_view_fail;.
10f60 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61    }.  sqlite3Sta
10f70 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  rtTable(pParse, 
10f80 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
10f90 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f  isTemp, 1, 0, no
10fa0 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  Err);.  p = pPar
10fb0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
10fc0 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
10fd0 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
10fe0 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69   create_view_fai
10ff0 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50  l;.  sqlite3TwoP
11000 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
11010 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
11020 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d  &pName);.  iDb =
11030 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
11040 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63  Index(db, p->pSc
11050 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  hema);.  sqlite3
11060 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
11070 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65  Parse, iDb, "vie
11080 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  w", pName);.  if
11090 28 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65  ( sqlite3FixSele
110a0 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63  ct(&sFix, pSelec
110b0 74 29 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65  t) ) goto create
110c0 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f  _view_fail;..  /
110d0 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  * Make a copy of
110e0 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45   the entire SELE
110f0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
11100 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69  t defines the vi
11110 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69  ew..  ** This wi
11120 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65  ll force all the
11130 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61   Expr.token.z va
11140 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d  lues to be dynam
11150 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  ically.  ** allo
11160 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61  cated rather tha
11170 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69  n point to the i
11180 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68  nput string - wh
11190 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  ich means that. 
111a0 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65   ** they will pe
111b0 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20  rsist after the 
111c0 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f  current sqlite3_
111d0 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75  exec() call retu
111e0 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  rns..  */.  p->p
111f0 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
11200 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53  SelectDup(db, pS
11210 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f 52  elect, EXPRDUP_R
11220 45 44 55 43 45 29 3b 0a 20 20 70 2d 3e 70 43 68  EDUCE);.  p->pCh
11230 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eck = sqlite3Exp
11240 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 43 4e  rListDup(db, pCN
11250 61 6d 65 73 2c 20 45 58 50 52 44 55 50 5f 52 45  ames, EXPRDUP_RE
11260 44 55 43 45 29 3b 0a 20 20 69 66 28 20 64 62 2d  DUCE);.  if( db-
11270 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
11280 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77  goto create_view
11290 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  _fail;..  /* Loc
112a0 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
112b0 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73  he CREATE VIEW s
112c0 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20  tatement.  Make 
112d0 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20  sEnd point to.  
112e0 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f  ** the end..  */
112f0 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65  .  sEnd = pParse
11300 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20  ->sLastToken;.  
11310 61 73 73 65 72 74 28 20 73 45 6e 64 2e 7a 5b 30  assert( sEnd.z[0
11320 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 45  ]!=0 );.  if( sE
11330 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a  nd.z[0]!=';' ){.
11340 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45      sEnd.z += sE
11350 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64  nd.n;.  }.  sEnd
11360 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69  .n = 0;.  n = (i
11370 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65  nt)(sEnd.z - pBe
11380 67 69 6e 2d 3e 7a 29 3b 0a 20 20 61 73 73 65 72  gin->z);.  asser
11390 74 28 20 6e 3e 30 20 29 3b 0a 20 20 7a 20 3d 20  t( n>0 );.  z = 
113a0 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69  pBegin->z;.  whi
113b0 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61  le( sqlite3Isspa
113c0 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d  ce(z[n-1]) ){ n-
113d0 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20  -; }.  sEnd.z = 
113e0 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e  &z[n-1];.  sEnd.
113f0 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65  n = 1;..  /* Use
11400 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
11410 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76 69  () to add the vi
11420 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45  ew to the SQLITE
11430 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f  _MASTER table */
11440 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  .  sqlite3EndTab
11450 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26 73  le(pParse, 0, &s
11460 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 0a 63 72 65  End, 0, 0);..cre
11470 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3a 0a 20  ate_view_fail:. 
11480 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
11490 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74  lete(db, pSelect
114a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
114b0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
114c0 43 4e 61 6d 65 73 29 3b 0a 20 20 72 65 74 75 72  CNames);.  retur
114d0 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  n;.}.#endif /* S
114e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
114f0 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
11500 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
11510 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
11520 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
11530 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54  ALTABLE)./*.** T
11540 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
11550 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61  re pTable is rea
11560 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c  lly a VIEW.  Fil
11570 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  l in the names o
11580 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73  f.** the columns
11590 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20   of the view in 
115a0 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63  the pTable struc
115b0 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68  ture.  Return th
115c0 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65  e number.** of e
115d0 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72  rrors.  If an er
115e0 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76  ror is seen leav
115f0 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
11600 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
11610 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
11620 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
11630 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70  mnNames(Parse *p
11640 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
11650 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  able){.  Table *
11660 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20  pSelTab;   /* A 
11670 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20  fake table from 
11680 77 68 69 63 68 20 77 65 20 67 65 74 20 74 68 65  which we get the
11690 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
116a0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20   Select *pSel;  
116b0 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68     /* Copy of th
116c0 65 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d  e SELECT that im
116d0 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
116e0 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20  w */.  int nErr 
116f0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  = 0;     /* Numb
11700 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63  er of errors enc
11710 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e  ountered */.  in
11720 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
11730 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68  /* Temporarily h
11740 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20  olds the number 
11750 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73 69 67  of cursors assig
11760 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ned */.  sqlite3
11770 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
11780 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  b;  /* Database 
11790 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d  connection for m
117a0 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a  alloc errors */.
117b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
117c0 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
117d0 4e 0a 20 20 73 71 6c 69 74 65 33 5f 78 61 75 74  N.  sqlite3_xaut
117e0 68 20 78 41 75 74 68 3b 20 20 20 20 20 20 20 2f  h xAuth;       /
117f0 2a 20 53 61 76 65 64 20 78 41 75 74 68 20 70 6f  * Saved xAuth po
11800 69 6e 74 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a  inter */.#endif.
11810 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
11820 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  e );..#ifndef SQ
11830 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
11840 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 73 71 6c  LTABLE.  if( sql
11850 69 74 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e  ite3VtabCallConn
11860 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ect(pParse, pTab
11870 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  le) ){.    retur
11880 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
11890 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74    }.  if( IsVirt
118a0 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72 65  ual(pTable) ) re
118b0 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  turn 0;.#endif..
118c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
118d0 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20  MIT_VIEW.  /* A 
118e0 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65  positive nCol me
118f0 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  ans the columns 
11900 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76  names for this v
11910 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72  iew are.  ** alr
11920 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f  eady known..  */
11930 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
11940 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30  Col>0 ) return 0
11950 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69  ;..  /* A negati
11960 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65  ve nCol is a spe
11970 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e  cial marker mean
11980 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20  ing that we are 
11990 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74  currently.  ** t
119a0 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65  rying to compute
119b0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
119c0 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20  s.  If we enter 
119d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
119e0 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76  h.  ** a negativ
119f0 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73  e nCol, it means
11a00 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65   two or more vie
11a10 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20  ws form a loop, 
11a20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a  like this:.  **.
11a30 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
11a40 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45  VIEW one AS SELE
11a50 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20  CT * FROM two;. 
11a60 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
11a70 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43  IEW two AS SELEC
11a80 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20  T * FROM one;.  
11a90 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  **.  ** Actually
11aa0 2c 20 74 68 65 20 65 72 72 6f 72 20 61 62 6f 76  , the error abov
11ab0 65 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20  e is now caught 
11ac0 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e  prior to reachin
11ad0 67 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20  g this point..  
11ae0 2a 2a 20 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f  ** But the follo
11af0 77 69 6e 67 20 74 65 73 74 20 69 73 20 73 74 69  wing test is sti
11b00 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61 73 20  ll important as 
11b10 69 74 20 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a  it does come up.
11b20 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c    ** in the foll
11b30 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a  owing:.  ** .  *
11b40 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
11b50 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a  LE main.ex1(a);.
11b60 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
11b70 54 45 4d 50 20 56 49 45 57 20 65 78 31 20 41 53  TEMP VIEW ex1 AS
11b80 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65   SELECT a FROM e
11b90 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  x1;.  **     SEL
11ba0 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e  ECT * FROM temp.
11bb0 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ex1;.  */.  if( 
11bc0 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29  pTable->nCol<0 )
11bd0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
11be0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
11bf0 69 65 77 20 25 73 20 69 73 20 63 69 72 63 75 6c  iew %s is circul
11c00 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70  arly defined", p
11c10 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Table->zName);. 
11c20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
11c30 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
11c40 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20  e->nCol>=0 );.. 
11c50 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
11c60 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
11c70 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70   we need to comp
11c80 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ute the table na
11c90 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74  mes..  ** Note t
11ca0 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hat the call to 
11cb0 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
11cc0 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20  OfSelect() will 
11cd0 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20  expand any.  ** 
11ce0 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  "*" elements in 
11cf0 74 68 65 20 72 65 73 75 6c 74 73 20 73 65 74 20  the results set 
11d00 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e 64 20  of the view and 
11d10 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73  will assign curs
11d20 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ors.  ** to the 
11d30 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
11d40 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75  FROM clause.  Bu
11d50 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74  t we do not want
11d60 20 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20   these changes. 
11d70 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e   ** to be perman
11d80 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d  ent.  So the com
11d90 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65  putation is done
11da0 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68   on a copy of th
11db0 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74  e SELECT.  ** st
11dc0 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
11dd0 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
11de0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54   */.  assert( pT
11df0 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b  able->pSelect );
11e00 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65  .  pSel = sqlite
11e10 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
11e20 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20  Table->pSelect, 
11e30 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29  0);.  if( pSel )
11e40 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73 65  {.    n = pParse
11e50 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c 69  ->nTab;.    sqli
11e60 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
11e70 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
11e80 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20  pSel->pSrc);.   
11e90 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
11ea0 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  -1;.    db->look
11eb0 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2b 2b  aside.bDisable++
11ec0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
11ed0 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
11ee0 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d 20  ION.    xAuth = 
11ef0 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 64  db->xAuth;.    d
11f00 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20  b->xAuth = 0;.  
11f10 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
11f20 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
11f30 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
11f40 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74  l);.    db->xAut
11f50 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73 65  h = xAuth;.#else
11f60 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73  .    pSelTab = s
11f70 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
11f80 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
11f90 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  pSel);.#endif.  
11fa0 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
11fb0 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62   n;.    if( pTab
11fc0 6c 65 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20  le->pCheck ){.  
11fd0 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20 56 49      /* CREATE VI
11fe0 45 57 20 6e 61 6d 65 28 61 72 67 6c 69 73 74 29  EW name(arglist)
11ff0 20 41 53 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a   AS ....      **
12000 20 54 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   The names of th
12010 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
12020 20 74 61 62 6c 65 20 61 72 65 20 74 61 6b 65 6e   table are taken
12030 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 61   from.      ** a
12040 72 67 6c 69 73 74 20 77 68 69 63 68 20 69 73 20  rglist which is 
12050 73 74 6f 72 65 64 20 69 6e 20 70 54 61 62 6c 65  stored in pTable
12060 2d 3e 70 43 68 65 63 6b 2e 20 20 54 68 65 20 70  ->pCheck.  The p
12070 43 68 65 63 6b 20 66 69 65 6c 64 0a 20 20 20 20  Check field.    
12080 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 68 6f    ** normally ho
12090 6c 64 73 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  lds CHECK constr
120a0 61 69 6e 74 73 20 6f 6e 20 61 6e 20 6f 72 64 69  aints on an ordi
120b0 6e 61 72 79 20 74 61 62 6c 65 2c 20 62 75 74 20  nary table, but 
120c0 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 56  for.      ** a V
120d0 49 45 57 20 69 74 20 68 6f 6c 64 73 20 74 68 65  IEW it holds the
120e0 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 20   list of column 
120f0 6e 61 6d 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  names..      */.
12100 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c        sqlite3Col
12110 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
12120 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 2d  (pParse, pTable-
12130 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20 20 20  >pCheck, .      
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12150 20 20 20 20 20 20 20 20 20 20 20 26 70 54 61 62             &pTab
12160 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 6c  le->nCol, &pTabl
12170 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e->aCol);.      
12180 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
12190 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20  iled==0 .       
121a0 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
121b0 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 54 61  =0.       && pTa
121c0 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 2d  ble->nCol==pSel-
121d0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20  >pEList->nExpr. 
121e0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
121f0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
12200 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
12210 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  lation(pParse, p
12220 54 61 62 6c 65 2c 20 70 53 65 6c 29 3b 0a 20 20  Table, pSel);.  
12230 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
12240 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20  if( pSelTab ){. 
12250 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20 56       /* CREATE V
12260 49 45 57 20 6e 61 6d 65 20 41 53 2e 2e 2e 20 20  IEW name AS...  
12270 77 69 74 68 6f 75 74 20 61 6e 20 61 72 67 75 6d  without an argum
12280 65 6e 74 20 6c 69 73 74 2e 20 20 43 6f 6e 73 74  ent list.  Const
12290 72 75 63 74 0a 20 20 20 20 20 20 2a 2a 20 74 68  ruct.      ** th
122a0 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
122b0 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 73  rom the SELECT s
122c0 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
122d0 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
122e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
122f0 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61  ssert( pTable->a
12300 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Col==0 );.      
12310 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70  pTable->nCol = p
12320 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
12330 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
12340 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
12350 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
12360 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
12370 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
12380 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
12390 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
123a0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
123b0 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29  pTable->pSchema)
123c0 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
123d0 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f       pTable->nCo
123e0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72  l = 0;.      nEr
123f0 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  r++;.    }.    s
12400 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
12410 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a  e(db, pSelTab);.
12420 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
12430 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
12440 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  );.    db->looka
12450 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2d 2d 3b  side.bDisable--;
12460 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
12470 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 70 54  nErr++;.  }.  pT
12480 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 73  able->pSchema->s
12490 63 68 65 6d 61 46 6c 61 67 73 20 7c 3d 20 44 42  chemaFlags |= DB
124a0 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 23  _UnresetViews;.#
124b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
124c0 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72  OMIT_VIEW */.  r
124d0 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a  eturn nErr;  .}.
124e0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
124f0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
12500 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
12510 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
12520 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23  TUALTABLE) */..#
12530 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12540 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c  IT_VIEW./*.** Cl
12550 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
12560 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20  ames from every 
12570 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65  VIEW in database
12580 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   idx..*/.static 
12590 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52  void sqliteViewR
125a0 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20  esetAll(sqlite3 
125b0 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20  *db, int idx){. 
125c0 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20   HashElem *i;.  
125d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
125e0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
125f0 62 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a 20 20  b, idx, 0) );.  
12600 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72  if( !DbHasProper
12610 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
12620 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72  nresetViews) ) r
12630 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73  eturn;.  for(i=s
12640 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
12650 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63  db->aDb[idx].pSc
12660 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
12670 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  i;i=sqliteHashNe
12680 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c  xt(i)){.    Tabl
12690 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
126a0 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
126b0 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
126c0 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
126d0 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  te3DeleteColumnN
126e0 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29 3b 0a  ames(db, pTab);.
126f0 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
12700 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 61 62   = 0;.      pTab
12710 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
12720 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50  }.  }.  DbClearP
12730 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
12740 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
12750 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
12760 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52 65  ine sqliteViewRe
12770 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64  setAll(A,B).#end
12780 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
12790 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  T_VIEW */../*.**
127a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
127b0 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
127c0 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74  VDBE to adjust t
127d0 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
127e0 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51  ma.** used by SQ
127f0 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62 74  Lite when the bt
12800 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20  ree layer moves 
12810 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67  a table root pag
12820 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70  e. The.** root-p
12830 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  age of a table o
12840 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62  r index in datab
12850 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61 6e  ase iDb has chan
12860 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a  ged from iFrom.*
12870 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20  * to iTo..**.** 
12880 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54  Ticket #1728:  T
12890 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20  he symbol table 
128a0 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74  might still cont
128b0 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  ain information.
128c0 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64  ** on tables and
128d0 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61 74  /or indices that
128e0 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 73 73   are the process
128f0 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65   of being delete
12900 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65  d..** If you are
12910 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66   unlucky, one of
12920 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69   those deleted i
12930 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73  ndices or tables
12940 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74   might.** have t
12950 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65  he same rootpage
12960 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 72   number as the r
12970 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  eal table or ind
12980 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65  ex that is.** be
12990 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77  ing moved.  So w
129a0 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65  e cannot stop se
129b0 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 74 68  arching after th
129c0 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a  e first match .*
129d0 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66 69  * because the fi
129e0 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20  rst match might 
129f0 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  be for one of th
12a00 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65  e deleted indice
12a10 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61  s.** or tables a
12a20 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65  nd not the table
12a30 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 61  /index that is a
12a40 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f  ctually being mo
12a50 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20  ved..** We must 
12a60 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67  continue looping
12a70 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65   until all table
12a80 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69  s and indices wi
12a90 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d  th.** rootpage==
12aa0 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20  iFrom have been 
12ab0 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76  converted to hav
12ac0 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20  e a rootpage of 
12ad0 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  iTo.** in order 
12ae0 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74 68  to be certain th
12af0 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 72 69  at we got the ri
12b00 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e  ght one..*/.#ifn
12b10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12b20 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20  AUTOVACUUM.void 
12b30 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d  sqlite3RootPageM
12b40 6f 76 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62  oved(sqlite3 *db
12b50 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69  , int iDb, int i
12b60 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
12b70 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
12b80 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68  m;.  Hash *pHash
12b90 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20  ;.  Db *pDb;..  
12ba0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
12bb0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
12bc0 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
12bd0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
12be0 44 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d 20 26  Db];.  pHash = &
12bf0 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
12c00 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c  lHash;.  for(pEl
12c10 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
12c20 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
12c30 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
12c40 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
12c50 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
12c60 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
12c70 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
12c80 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pTab->tnum==iFr
12c90 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  om ){.      pTab
12ca0 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
12cb0 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20    }.  }.  pHash 
12cc0 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  = &pDb->pSchema-
12cd0 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28  >idxHash;.  for(
12ce0 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
12cf0 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45  First(pHash); pE
12d00 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
12d10 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
12d20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
12d30 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  dx = sqliteHashD
12d40 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
12d50 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d  if( pIdx->tnum==
12d60 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
12d70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Idx->tnum = iTo;
12d80 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
12d90 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
12da0 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74   code to erase t
12db0 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
12dc0 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66  ot-page iTable f
12dd0 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44 62  rom database iDb
12de0 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20  ..** Also write 
12df0 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74  code to modify t
12e00 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
12e10 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72   table and inter
12e20 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66  nal schema.** if
12e30 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20   a root-page of 
12e40 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
12e50 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
12e60 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74  ree-layer whilst
12e70 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62  .** erasing iTab
12e80 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  le (this can hap
12e90 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
12ea0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
12eb0 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  )..*/ .static vo
12ec0 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61  id destroyRootPa
12ed0 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
12ee0 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
12ef0 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
12f00 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
12f10 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  be(pParse);.  in
12f20 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
12f30 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
12f40 3b 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 62  ;.  assert( iTab
12f50 6c 65 3e 31 20 29 3b 0a 20 20 73 71 6c 69 74 65  le>1 );.  sqlite
12f60 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12f70 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c  P_Destroy, iTabl
12f80 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73  e, r1, iDb);.  s
12f90 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
12fa0 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20  Parse);.#ifndef 
12fb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
12fc0 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44  VACUUM.  /* OP_D
12fd0 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e  estroy stores an
12fe0 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20   in integer r1. 
12ff0 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a  If this integer.
13000 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f    ** is non-zero
13010 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
13020 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
13030 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76  r of a table mov
13040 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74  ed to.  ** locat
13050 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20  ion iTable. The 
13060 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d  following code m
13070 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c 69  odifies the sqli
13080 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
13090 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20  to.  ** reflect 
130a0 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this..  **.  ** 
130b0 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68  The "#NNN" in th
130c0 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63 69  e SQL is a speci
130d0 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74  al constant that
130e0 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72 20   means whatever 
130f0 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e  value.  ** is in
13100 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20   register NNN.  
13110 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65  See grammar rule
13120 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
13130 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45  h the TK_REGISTE
13140 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72  R.  ** token for
13150 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
13160 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  rmation..  */.  
13170 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
13180 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
13190 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53   "UPDATE %Q.%s S
131a0 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57  ET rootpage=%d W
131b0 48 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f  HERE #%d AND roo
131c0 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20  tpage=#%d",.    
131d0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
131e0 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20  [iDb].zDbSName, 
131f0 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 69 54 61  MASTER_NAME, iTa
13200 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65  ble, r1, r1);.#e
13210 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65  ndif.  sqlite3Re
13220 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
13230 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a  rse, r1);.}../*.
13240 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63 6f  ** Write VDBE co
13250 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c  de to erase tabl
13260 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61  e pTab and all a
13270 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65  ssociated indice
13280 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f  s on disk..** Co
13290 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  de to update the
132a0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
132b0 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e  ables and intern
132c0 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69  al schema defini
132d0 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65  tions.** in case
132e0 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c   a root-page bel
132f0 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65  onging to anothe
13300 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64  r table is moved
13310 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c 61   by the btree la
13320 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61  yer.** is also a
13330 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20 68  dded (this can h
13340 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75  appen with an au
13350 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
13360 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  se)..*/.static v
13370 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65  oid destroyTable
13380 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
13390 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69  Table *pTab){.#i
133a0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
133b0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e  _AUTOVACUUM.  In
133c0 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74  dex *pIdx;.  int
133d0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
133e0 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
133f0 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
13400 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f  chema);.  destro
13410 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
13420 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44  , pTab->tnum, iD
13430 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70  b);.  for(pIdx=p
13440 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
13450 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
13460 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72 6f  ext){.    destro
13470 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
13480 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  , pIdx->tnum, iD
13490 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  b);.  }.#else.  
134a0 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
134b0 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76  se may be auto-v
134c0 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69  acuum capable (i
134d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
134e0 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73  TOVACUUM.  ** is
134f0 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74   not defined), t
13500 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74  hen it is import
13510 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44  ant to call OP_D
13520 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20  estroy on the.  
13530 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64  ** table and ind
13540 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e  ex root-pages in
13550 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67   order, starting
13560 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69   with the numeri
13570 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67  cally .  ** larg
13580 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  est root-page nu
13590 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72 61  mber. This guara
135a0 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20  ntees that none 
135b0 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  of the root-page
135c0 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73  s.  ** to be des
135d0 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61  troyed is reloca
135e0 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ted by an earlie
135f0 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e  r OP_Destroy. i.
13600 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66  e. if the.  ** f
13610 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f  ollowing were co
13620 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  ded:.  **.  ** O
13630 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20  P_Destroy 4 0.  
13640 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44  ** ....  ** OP_D
13650 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a  estroy 5 0.  **.
13660 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61    ** and root pa
13670 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f  ge 5 happened to
13680 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74 20   be the largest 
13690 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
136a0 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
136b0 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74  abase, then root
136c0 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65   page 5 would be
136d0 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34   moved to page 4
136e0 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f   by the .  ** "O
136f0 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f  P_Destroy 4 0" o
13700 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65  pcode. The subse
13710 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f  quent "OP_Destro
13720 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74  y 5 0" would hit
13730 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73  .  ** a free-lis
13740 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  t page..  */.  i
13750 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e  nt iTab = pTab->
13760 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73  tnum;.  int iDes
13770 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77  troyed = 0;..  w
13780 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49  hile( 1 ){.    I
13790 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
137a0 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30  int iLargest = 0
137b0 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73 74  ;..    if( iDest
137c0 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62  royed==0 || iTab
137d0 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20  <iDestroyed ){. 
137e0 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20       iLargest = 
137f0 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iTab;.    }.    
13800 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
13810 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
13820 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
13830 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d        int iIdx =
13840 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20   pIdx->tnum;.   
13850 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
13860 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
13870 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
13880 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65 64   if( (iDestroyed
13890 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65  ==0 || (iIdx<iDe
138a0 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49 64  stroyed)) && iId
138b0 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20  x>iLargest ){.  
138c0 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
138d0 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20   iIdx;.      }. 
138e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61     }.    if( iLa
138f0 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  rgest==0 ){.    
13900 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65    return;.    }e
13910 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
13920 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
13930 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
13940 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
13950 65 6d 61 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ema);.      asse
13960 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
13970 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44  b<pParse->db->nD
13980 62 20 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72  b );.      destr
13990 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
139a0 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62  e, iLargest, iDb
139b0 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f  );.      iDestro
139c0 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a  yed = iLargest;.
139d0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
139e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
139f0 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68   entries from th
13a00 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74  e sqlite_statN t
13a10 61 62 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e 20  ables (for N in 
13a20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74 65  (1,2,3)).** afte
13a30 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58 20 6f  r a DROP INDEX o
13a40 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d  r DROP TABLE com
13a50 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mand..*/.static 
13a60 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61  void sqlite3Clea
13a70 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20 20 50  rStatTables(.  P
13a80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
13a90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
13aa0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
13ab0 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20    int iDb,      
13ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13ad0 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  database number 
13ae0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
13af0 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22  *zType,     /* "
13b00 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f  idx" or "tbl" */
13b10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13b20 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Name      /* Nam
13b30 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20 74 61  e of index or ta
13b40 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ble */.){.  int 
13b50 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
13b60 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61 72 73  *zDbName = pPars
13b70 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
13b80 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 66 6f 72 28  zDbSName;.  for(
13b90 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b  i=1; i<=4; i++){
13ba0 0a 20 20 20 20 63 68 61 72 20 7a 54 61 62 5b 32  .    char zTab[2
13bb0 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  4];.    sqlite3_
13bc0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
13bd0 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69  zTab),zTab,"sqli
13be0 74 65 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a 20  te_stat%d",i);. 
13bf0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
13c00 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
13c10 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d  db, zTab, zDbNam
13c20 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  e) ){.      sqli
13c30 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
13c40 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
13c50 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
13c60 73 20 57 48 45 52 45 20 25 73 3d 25 51 22 2c 0a  s WHERE %s=%Q",.
13c70 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c          zDbName,
13c80 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e   zTab, zType, zN
13c90 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ame.      );.   
13ca0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
13cb0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
13cc0 20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a   drop a table..*
13cd0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
13ce0 64 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  deDropTable(Pars
13cf0 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
13d00 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 44 62 2c   *pTab, int iDb,
13d10 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20   int isView){.  
13d20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
13d30 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
13d40 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72 20 2a  >db;.  Trigger *
13d50 70 54 72 69 67 67 65 72 3b 0a 20 20 44 62 20 2a  pTrigger;.  Db *
13d60 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
13d70 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  Db];..  v = sqli
13d80 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
13d90 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
13da0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  =0 );.  sqlite3B
13db0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
13dc0 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
13dd0 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
13de0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
13df0 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69  TABLE.  if( IsVi
13e00 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
13e10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13e20 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp0(v, OP_VBegi
13e30 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  n);.  }.#endif..
13e40 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72    /* Drop all tr
13e50 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65  iggers associate
13e60 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
13e70 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20   being dropped. 
13e80 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e  Code.  ** is gen
13e90 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65  erated to remove
13ea0 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71   entries from sq
13eb0 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f  lite_master and/
13ec0 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74  or.  ** sqlite_t
13ed0 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65  emp_master if re
13ee0 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  quired..  */.  p
13ef0 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65  Trigger = sqlite
13f00 33 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61  3TriggerList(pPa
13f10 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 77 68  rse, pTab);.  wh
13f20 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29 7b  ile( pTrigger ){
13f30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72  .    assert( pTr
13f40 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
13f50 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c  pTab->pSchema ||
13f60 20 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67   .        pTrigg
13f70 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  er->pSchema==db-
13f80 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
13f90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 72  );.    sqlite3Dr
13fa0 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61  opTriggerPtr(pPa
13fb0 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a  rse, pTrigger);.
13fc0 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
13fd0 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a  Trigger->pNext;.
13fe0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
13ff0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
14000 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f  REMENT.  /* Remo
14010 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f  ve any entries o
14020 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  f the sqlite_seq
14030 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f  uence table asso
14040 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 2a 2a  ciated with.  **
14050 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
14060 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69   dropped. This i
14070 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68  s done before th
14080 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70  e table is dropp
14090 65 64 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 62  ed.  ** at the b
140a0 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63  tree level, in c
140b0 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73  ase the sqlite_s
140c0 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65  equence table ne
140d0 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65  eds to.  ** move
140e0 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
140f0 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61  the drop (can ha
14100 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63  ppen in auto-vac
14110 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a  uum mode)..  */.
14120 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46    if( pTab->tabF
14130 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
14140 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73  crement ){.    s
14150 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
14160 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
14170 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
14180 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
14190 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a  WHERE name=%Q",.
141a0 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e        pDb->zDbSN
141b0 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
141c0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  .    );.  }.#end
141d0 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c  if..  /* Drop al
141e0 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  l SQLITE_MASTER 
141f0 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
14200 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
14210 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74  er to the.  ** t
14220 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61  able. The progra
14230 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72  m name loops thr
14240 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20  ough the master 
14250 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65  table and delete
14260 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77  s.  ** every row
14270 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
14280 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73  a table of the s
14290 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
142a0 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64  one being.  ** d
142b0 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73  ropped. Triggers
142c0 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
142d0 61 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20  arately because 
142e0 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  a trigger can be
142f0 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e  .  ** created in
14300 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
14310 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74  se that refers t
14320 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f  o a table in ano
14330 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62 61  ther.  ** databa
14340 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  se..  */.  sqlit
14350 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
14360 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44 45  arse, .      "DE
14370 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
14380 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25  WHERE tbl_name=%
14390 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69  Q and type!='tri
143a0 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70 44  gger'",.      pD
143b0 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53  b->zDbSName, MAS
143c0 54 45 52 5f 4e 41 4d 45 2c 20 70 54 61 62 2d 3e  TER_NAME, pTab->
143d0 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69  zName);.  if( !i
143e0 73 56 69 65 77 20 26 26 20 21 49 73 56 69 72 74  sView && !IsVirt
143f0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
14400 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50   destroyTable(pP
14410 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d  arse, pTab);.  }
14420 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68  ..  /* Remove th
14430 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72  e table entry fr
14440 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65  om SQLite's inte
14450 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20  rnal schema and 
14460 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20  modify.  ** the 
14470 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20  schema cookie.. 
14480 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
14490 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
144a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
144b0 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f  p4(v, OP_VDestro
144c0 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54  y, iDb, 0, 0, pT
144d0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
144e0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
144f0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f  AddOp4(v, OP_Dro
14500 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20  pTable, iDb, 0, 
14510 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  0, pTab->zName, 
14520 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 68 61  0);.  sqlite3Cha
14530 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
14540 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
14550 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c  ViewResetAll(db,
14560 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iDb);.}../*.** 
14570 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
14580 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65  called to do the
14590 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20   work of a DROP 
145a0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
145b0 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65  .** pName is the
145c0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
145d0 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64  le to be dropped
145e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
145f0 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65  3DropTable(Parse
14600 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
14610 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73  t *pName, int is
14620 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29  View, int noErr)
14630 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
14640 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
14650 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
14660 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
14670 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  b;..  if( db->ma
14680 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
14690 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
146a0 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73  _table;.  }.  as
146b0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
146c0 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  rr==0 );.  asser
146d0 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
146e0 31 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  1 );.  if( sqlit
146f0 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
14700 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74  rse) ) goto exit
14710 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69  _drop_table;.  i
14720 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73  f( noErr ) db->s
14730 75 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20  uppressErr++;.  
14740 61 73 73 65 72 74 28 20 69 73 56 69 65 77 3d 3d  assert( isView==
14750 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d 4c 4f 43  0 || isView==LOC
14760 41 54 45 5f 56 49 45 57 20 29 3b 0a 20 20 70 54  ATE_VIEW );.  pT
14770 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
14780 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
14790 73 65 2c 20 69 73 56 69 65 77 2c 20 26 70 4e 61  se, isView, &pNa
147a0 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28  me->a[0]);.  if(
147b0 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70   noErr ) db->sup
147c0 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69  pressErr--;..  i
147d0 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
147e0 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 73 71    if( noErr ) sq
147f0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e  lite3CodeVerifyN
14800 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72 73  amedSchema(pPars
14810 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
14820 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 67  Database);.    g
14830 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
14840 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  ble;.  }.  iDb =
14850 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
14860 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
14870 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65  pSchema);.  asse
14880 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
14890 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20  b<db->nDb );..  
148a0 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20 61 20  /* If pTab is a 
148b0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63  virtual table, c
148c0 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d  all ViewGetColum
148d0 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75  nNames() to ensu
148e0 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e  re.  ** it is in
148f0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
14900 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
14910 70 54 61 62 29 20 26 26 20 73 71 6c 69 74 65 33  pTab) && sqlite3
14920 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
14930 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
14940 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
14950 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
14960 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
14970 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
14980 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
14990 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  code;.    const 
149a0 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48  char *zTab = SCH
149b0 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a  EMA_TABLE(iDb);.
149c0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
149d0 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
149e0 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b].zDbSName;.   
149f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
14a00 67 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  g2 = 0;.    if( 
14a10 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
14a20 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
14a30 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c  DELETE, zTab, 0,
14a40 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f   zDb)){.      go
14a50 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
14a60 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  le;.    }.    if
14a70 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20  ( isView ){.    
14a80 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
14a90 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a  DB && iDb==1 ){.
14aa0 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
14ab0 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
14ac0 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  VIEW;.      }els
14ad0 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
14ae0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49  = SQLITE_DROP_VI
14af0 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  EW;.      }.#ifn
14b00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14b10 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
14b20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72   }else if( IsVir
14b30 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
14b40 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
14b50 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20  E_DROP_VTABLE;. 
14b60 20 20 20 20 20 7a 41 72 67 32 20 3d 20 73 71 6c       zArg2 = sql
14b70 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62  ite3GetVTable(db
14b80 2c 20 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a  , pTab)->pMod->z
14b90 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Name;.#endif.   
14ba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
14bb0 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
14bc0 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  & iDb==1 ){.    
14bd0 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
14be0 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
14bf0 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
14c00 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
14c10 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
14c20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14c30 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
14c40 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
14c50 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61   code, pTab->zNa
14c60 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20  me, zArg2, zDb) 
14c70 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
14c80 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
14c90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
14ca0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
14cb0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
14cc0 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ETE, pTab->zName
14cd0 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
14ce0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14cf0 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
14d00 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
14d10 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
14d20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
14d30 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20  lite_", 7)==0 . 
14d40 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
14d50 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d  NICmp(pTab->zNam
14d60 65 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 22  e, "sqlite_stat"
14d70 2c 20 31 31 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 11)!=0 ){.    
14d80 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14d90 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
14da0 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f  s may not be dro
14db0 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  pped", pTab->zNa
14dc0 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
14dd0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
14de0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
14df0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
14e00 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41  * Ensure DROP TA
14e10 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20  BLE is not used 
14e20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44  on a view, and D
14e30 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20  ROP VIEW is not 
14e40 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74  used.  ** on a t
14e50 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
14e60 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d   isView && pTab-
14e70 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
14e80 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14e90 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
14ea0 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65  DROP TABLE to de
14eb0 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20  lete table %s", 
14ec0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
14ed0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
14ee0 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  _table;.  }.  if
14ef0 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61  ( !isView && pTa
14f00 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
14f10 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
14f20 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
14f30 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65  ROP VIEW to dele
14f40 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61  te view %s", pTa
14f50 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
14f60 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
14f70 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ble;.  }.#endif.
14f80 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
14f90 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
14fa0 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
14fb0 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20   master table.  
14fc0 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  ** on disk..  */
14fd0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
14fe0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
14ff0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
15000 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
15010 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
15020 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   1, iDb);.    sq
15030 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61  lite3ClearStatTa
15040 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62  bles(pParse, iDb
15050 2c 20 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a  , "tbl", pTab->z
15060 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
15070 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50  e3FkDropTable(pP
15080 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61  arse, pName, pTa
15090 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  b);.    sqlite3C
150a0 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 70 50 61  odeDropTable(pPa
150b0 72 73 65 2c 20 70 54 61 62 2c 20 69 44 62 2c 20  rse, pTab, iDb, 
150c0 69 73 56 69 65 77 29 3b 0a 20 20 7d 0a 0a 65 78  isView);.  }..ex
150d0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20  it_drop_table:. 
150e0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
150f0 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29  elete(db, pName)
15100 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
15110 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
15120 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  d to create a ne
15130 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e  w foreign key on
15140 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75   the table.** cu
15150 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
15160 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72  nstruction.  pFr
15170 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73  omCol determines
15180 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a   which columns.*
15190 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * in the current
151a0 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20   table point to 
151b0 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e  the foreign key.
151c0 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30    If pFromCol==0
151d0 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74   then.** connect
151e0 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20   the key to the 
151f0 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65  last column inse
15200 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68  rted.  pTo is th
15210 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65  e name of.** the
15220 20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64 20   table referred 
15230 74 6f 20 28 61 2e 6b 2e 61 20 74 68 65 20 22 70  to (a.k.a the "p
15240 61 72 65 6e 74 22 20 74 61 62 6c 65 29 2e 20 20  arent" table).  
15250 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74  pToCol is a list
15260 0a 2a 2a 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  .** of tables in
15270 20 74 68 65 20 70 61 72 65 6e 74 20 70 54 6f 20   the parent pTo 
15280 74 61 62 6c 65 2e 20 20 66 6c 61 67 73 20 63 6f  table.  flags co
15290 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e  ntains all.** in
152a0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
152b0 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  the conflict res
152c0 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
152d0 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  ms specified.** 
152e0 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45  in the ON DELETE
152f0 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20  , ON UPDATE and 
15300 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65  ON INSERT clause
15310 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79  s..**.** An FKey
15320 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72   structure is cr
15330 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20  eated and added 
15340 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
15350 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20  rently.** under 
15360 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20  construction in 
15370 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  the pParse->pNew
15380 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a  Table field..**.
15390 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b  ** The foreign k
153a0 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d  ey is set for IM
153b0 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69  MEDIATE processi
153c0 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e  ng.  A subsequen
153d0 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c  t call.** to sql
153e0 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
153f0 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e  Key() might chan
15400 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45 52  ge this to DEFER
15410 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  RED..*/.void sql
15420 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67  ite3CreateForeig
15430 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  nKey(.  Parse *p
15440 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
15450 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
15460 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
15470 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c  FromCol,  /* Col
15480 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62  umns in this tab
15490 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  le that point to
154a0 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
154b0 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20    Token *pTo,   
154c0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
154d0 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  f the other tabl
154e0 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
154f0 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43  *pToCol,    /* C
15500 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74  olumns in the ot
15510 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  her table */.  i
15520 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
15530 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20      /* Conflict 
15540 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
15550 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73  ithms. */.){.  s
15560 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
15570 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66  rse->db;.#ifndef
15580 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
15590 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20  EIGN_KEY.  FKey 
155a0 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b  *pFKey = 0;.  FK
155b0 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54  ey *pNextTo;.  T
155c0 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65  able *p = pParse
155d0 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
155e0 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
155f0 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20  i;.  int nCol;. 
15600 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73   char *z;..  ass
15610 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20  ert( pTo!=0 );. 
15620 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f   if( p==0 || IN_
15630 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67  DECLARE_VTAB ) g
15640 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66  oto fk_end;.  if
15650 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
15660 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  .    int iCol = 
15670 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69  p->nCol-1;.    i
15680 66 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29  f( NEVER(iCol<0)
15690 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
156a0 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26      if( pToCol &
156b0 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21  & pToCol->nExpr!
156c0 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
156d0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
156e0 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79  se, "foreign key
156f0 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20   on %s".        
15700 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65   " should refere
15710 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c  nce only one col
15720 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22  umn of table %T"
15730 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43  ,.         p->aC
15740 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20  ol[iCol].zName, 
15750 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  pTo);.      goto
15760 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20   fk_end;.    }. 
15770 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d     nCol = 1;.  }
15780 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20  else if( pToCol 
15790 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
157a0 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  !=pFromCol->nExp
157b0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
157c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
157d0 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72  .        "number
157e0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66   of columns in f
157f0 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20  oreign key does 
15800 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75  not match the nu
15810 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20  mber of ".      
15820 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68    "columns in th
15830 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
15840 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66  le");.    goto f
15850 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  k_end;.  }else{.
15860 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d      nCol = pFrom
15870 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a  Col->nExpr;.  }.
15880 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
15890 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c  (*pFKey) + (nCol
158a0 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79  -1)*sizeof(pFKey
158b0 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f  ->aCol[0]) + pTo
158c0 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70  ->n + 1;.  if( p
158d0 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
158e0 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e  (i=0; i<pToCol->
158f0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
15900 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69     nByte += sqli
15910 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43  te3Strlen30(pToC
15920 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20  ol->a[i].zName) 
15930 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  + 1;.    }.  }. 
15940 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   pFKey = sqlite3
15950 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
15960 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
15970 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  pFKey==0 ){.    
15980 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
15990 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20  .  pFKey->pFrom 
159a0 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e  = p;.  pFKey->pN
159b0 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b  extFrom = p->pFK
159c0 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a  ey;.  z = (char*
159d0 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43  )&pFKey->aCol[nC
159e0 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54  ol];.  pFKey->zT
159f0 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28  o = z;.  memcpy(
15a00 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e  z, pTo->z, pTo->
15a10 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20  n);.  z[pTo->n] 
15a20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  = 0;.  sqlite3De
15a30 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d  quote(z);.  z +=
15a40 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b   pTo->n+1;.  pFK
15a50 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b  ey->nCol = nCol;
15a60 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
15a70 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d  =0 ){.    pFKey-
15a80 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d  >aCol[0].iFrom =
15a90 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65   p->nCol-1;.  }e
15aa0 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
15ab0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
15ac0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
15ad0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
15ae0 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
15af0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
15b00 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b  StrICmp(p->aCol[
15b10 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43  j].zName, pFromC
15b20 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  ol->a[i].zName)=
15b30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
15b40 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  pFKey->aCol[i].i
15b50 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  From = j;.      
15b60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
15b70 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
15b80 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f     if( j>=p->nCo
15b90 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
15ba0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15bb0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
15bc0 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20  "unknown column 
15bd0 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67  \"%s\" in foreig
15be0 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
15bf0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46  ", .          pF
15c00 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
15c10 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
15c20 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20  o fk_end;.      
15c30 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
15c40 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
15c50 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
15c60 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
15c70 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
15c80 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  en30(pToCol->a[i
15c90 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
15ca0 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  pFKey->aCol[i].z
15cb0 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d  Col = z;.      m
15cc0 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d  emcpy(z, pToCol-
15cd0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b  >a[i].zName, n);
15ce0 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b  .      z[n] = 0;
15cf0 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b  .      z += n+1;
15d00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
15d10 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
15d20 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63   0;.  pFKey->aAc
15d30 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66  tion[0] = (u8)(f
15d40 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20 20 20  lags & 0xff);   
15d50 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44           /* ON D
15d60 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a  ELETE action */.
15d70 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e    pFKey->aAction
15d80 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61 67  [1] = (u8)((flag
15d90 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29  s >> 8 ) & 0xff)
15da0 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54  ;    /* ON UPDAT
15db0 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61  E action */..  a
15dc0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
15dd0 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
15de0 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  , 0, p->pSchema)
15df0 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20   );.  pNextTo = 
15e00 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48  (FKey *)sqlite3H
15e10 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53  ashInsert(&p->pS
15e20 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c  chema->fkeyHash,
15e30 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a   .      pFKey->z
15e40 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b 65  To, (void *)pFKe
15e50 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  y.  );.  if( pNe
15e60 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20  xtTo==pFKey ){. 
15e70 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
15e80 6c 74 28 64 62 29 3b 0a 20 20 20 20 67 6f 74 6f  lt(db);.    goto
15e90 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69   fk_end;.  }.  i
15ea0 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20  f( pNextTo ){.  
15eb0 20 20 61 73 73 65 72 74 28 20 70 4e 65 78 74 54    assert( pNextT
15ec0 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b  o->pPrevTo==0 );
15ed0 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  .    pFKey->pNex
15ee0 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20  tTo = pNextTo;. 
15ef0 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65     pNextTo->pPre
15f00 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d  vTo = pFKey;.  }
15f10 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
15f20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74  foreign key to t
15f30 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20  he table as the 
15f40 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a  last step..  */.
15f50 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b    p->pFKey = pFK
15f60 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b  ey;.  pFKey = 0;
15f70 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69  ..fk_end:.  sqli
15f80 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 46  te3DbFree(db, pF
15f90 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  Key);.#endif /* 
15fa0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
15fb0 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
15fc0 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  ) */.  sqlite3Ex
15fd0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
15fe0 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71   pFromCol);.  sq
15ff0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
16000 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b  ete(db, pToCol);
16010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
16020 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
16030 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c   when an INITIAL
16040 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20  LY IMMEDIATE or 
16050 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
16060 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  ED.** clause is 
16070 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  seen as part of 
16080 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  a foreign key de
16090 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69  finition.  The i
160a0 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72  sDeferred.** par
160b0 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20  ameter is 1 for 
160c0 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
160d0 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49  ED and 0 for INI
160e0 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
160f0 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f  ..** The behavio
16100 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  r of the most re
16110 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66  cently created f
16120 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64  oreign key is ad
16130 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64  justed.** accord
16140 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ingly..*/.void s
16150 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
16160 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61  gnKey(Parse *pPa
16170 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72  rse, int isDefer
16180 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  red){.#ifndef SQ
16190 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
161a0 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70  N_KEY.  Table *p
161b0 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  Tab;.  FKey *pFK
161c0 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20  ey;.  if( (pTab 
161d0 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
161e0 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65  ble)==0 || (pFKe
161f0 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29  y = pTab->pFKey)
16200 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
16210 61 73 73 65 72 74 28 20 69 73 44 65 66 65 72 72  assert( isDeferr
16220 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72  ed==0 || isDefer
16230 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a  red==1 ); /* EV:
16240 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a   R-30323-21917 *
16250 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  /.  pFKey->isDef
16260 65 72 72 65 64 20 3d 20 28 75 38 29 69 73 44 65  erred = (u8)isDe
16270 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d  ferred;.#endif.}
16280 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
16290 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
162a0 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c  erase and refill
162b0 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54   index *pIdx.  T
162c0 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  his is.** used t
162d0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  o initialize a n
162e0 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ewly created ind
162f0 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75  ex or to recompu
16300 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  te the.** conten
16310 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e  t of an index in
16320 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52   response to a R
16330 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
16340 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74  **.** if memRoot
16350 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61  Page is not nega
16360 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  tive, it means t
16370 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73  hat the index is
16380 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65   newly.** create
16390 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  d.  The register
163a0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65   specified by me
163b0 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69  mRootPage contai
163c0 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  ns the.** root p
163d0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
163e0 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d  e index.  If mem
163f0 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61  RootPage is nega
16400 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tive, then.** th
16410 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
16420 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20  exists and must 
16430 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
16440 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64  e being refilled
16450 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74   and.** the root
16460 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
16470 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b  the index is tak
16480 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e  en from pIndex->
16490 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tnum..*/.static 
164a0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69  void sqlite3Refi
164b0 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  llIndex(Parse *p
164c0 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
164d0 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f  ndex, int memRoo
164e0 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20  tPage){.  Table 
164f0 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
16500 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20  pTable;  /* The 
16510 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e  table that is in
16520 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  dexed */.  int i
16530 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
16540 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
16550 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
16560 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  or pTab */.  int
16570 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e   iIdx = pParse->
16580 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
16590 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
165a0 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20   for pIndex */. 
165b0 20 69 6e 74 20 69 53 6f 72 74 65 72 3b 20 20 20   int iSorter;   
165c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165d0 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 65 64  /* Cursor opened
165e0 20 62 79 20 4f 70 65 6e 53 6f 72 74 65 72 20 28   by OpenSorter (
165f0 69 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20  if in use) */.  
16600 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
16610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16620 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70  * Address of top
16630 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e   of loop */.  in
16640 74 20 61 64 64 72 32 3b 20 20 20 20 20 20 20 20  t addr2;        
16650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16660 41 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20  Address to jump 
16670 74 6f 20 66 6f 72 20 6e 65 78 74 20 69 74 65 72  to for next iter
16680 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74  ation */.  int t
16690 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
166a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
166b0 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20  t page of index 
166c0 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 74 49 64  */.  int iPartId
166d0 78 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20  xLabel;         
166e0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74      /* Jump to t
166f0 68 69 73 20 6c 61 62 65 6c 20 74 6f 20 73 6b 69  his label to ski
16700 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20 56 64 62  p a row */.  Vdb
16710 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
16720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
16730 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
16740 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  o this virtual m
16750 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49  achine */.  KeyI
16760 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20  nfo *pKey;      
16770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
16780 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20  yInfo for index 
16790 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
167a0 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rd;             
167b0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
167c0 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 65  holding assemble
167d0 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  d index record *
167e0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
167f0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
16800 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
16810 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
16820 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
16830 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
16840 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  x(db, pIndex->pS
16850 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
16860 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
16870 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
16880 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
16890 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
168a0 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78  _REINDEX, pIndex
168b0 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20  ->zName, 0,.    
168c0 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
168d0 44 62 53 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20  DbSName ) ){.   
168e0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
168f0 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72  dif..  /* Requir
16900 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  e a write-lock o
16910 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 70  n the table to p
16920 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70 65 72  erform this oper
16930 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ation */.  sqlit
16940 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
16950 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
16960 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e  num, 1, pTab->zN
16970 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  ame);..  v = sql
16980 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
16990 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
169a0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
169b0 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29  memRootPage>=0 )
169c0 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d  {.    tnum = mem
169d0 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73  RootPage;.  }els
169e0 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49  e{.    tnum = pI
169f0 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 0a  ndex->tnum;.  }.
16a00 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
16a10 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
16a20 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a  Parse, pIndex);.
16a30 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 21 3d    assert( pKey!=
16a40 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
16a50 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
16a60 3e 6e 45 72 72 20 29 3b 0a 0a 20 20 2f 2a 20 4f  >nErr );..  /* O
16a70 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63  pen the sorter c
16a80 75 72 73 6f 72 20 69 66 20 77 65 20 61 72 65 20  ursor if we are 
16a90 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20  to use one. */. 
16aa0 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72 73   iSorter = pPars
16ab0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c  e->nTab++;.  sql
16ac0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
16ad0 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c  , OP_SorterOpen,
16ae0 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70 49 6e   iSorter, 0, pIn
16af0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63  dex->nKeyCol, (c
16b00 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20  har*).          
16b10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16b20 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
16b30 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
16b40 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74  .  /* Open the t
16b50 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75  able. Loop throu
16b60 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74  gh all rows of t
16b70 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65 72 74  he table, insert
16b80 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72  ing index.  ** r
16b90 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65 20  ecords into the 
16ba0 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c  sorter. */.  sql
16bb0 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
16bc0 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
16bd0 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
16be0 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  ad);.  addr1 = s
16bf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16c00 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
16c10 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  Tab, 0); VdbeCov
16c20 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65 67 52  erage(v);.  regR
16c30 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
16c40 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
16c50 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 6e  );..  sqlite3Gen
16c60 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50  erateIndexKey(pP
16c70 61 72 73 65 2c 70 49 6e 64 65 78 2c 69 54 61 62  arse,pIndex,iTab
16c80 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c 26 69 50  ,regRecord,0,&iP
16c90 61 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29  artIdxLabel,0,0)
16ca0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16cb0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
16cc0 65 72 49 6e 73 65 72 74 2c 20 69 53 6f 72 74 65  erInsert, iSorte
16cd0 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  r, regRecord);. 
16ce0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50   sqlite3ResolveP
16cf0 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72  artIdxLabel(pPar
16d00 73 65 2c 20 69 50 61 72 74 49 64 78 4c 61 62 65  se, iPartIdxLabe
16d10 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l);.  sqlite3Vdb
16d20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
16d30 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b  xt, iTab, addr1+
16d40 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
16d50 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
16d60 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
16d70 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52  dr1);.  if( memR
16d80 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c 69  ootPage<0 ) sqli
16d90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16da0 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c   OP_Clear, tnum,
16db0 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
16dc0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
16dd0 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78  _OpenWrite, iIdx
16de0 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20  , tnum, iDb, .  
16df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e00 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20    (char *)pKey, 
16e10 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73  P4_KEYINFO);.  s
16e20 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
16e30 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c  P5(v, OPFLAG_BUL
16e40 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61  KCSR|((memRootPa
16e50 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32  ge>=0)?OPFLAG_P2
16e60 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64  ISREG:0));..  ad
16e70 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
16e80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
16e90 72 74 65 72 53 6f 72 74 2c 20 69 53 6f 72 74 65  rterSort, iSorte
16ea0 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  r, 0); VdbeCover
16eb0 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20 49 73  age(v);.  if( Is
16ec0 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64  UniqueIndex(pInd
16ed0 65 78 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  ex) ){.    int j
16ee0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
16ef0 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
16f00 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  3;.    sqlite3Vd
16f10 62 65 47 6f 74 6f 28 76 2c 20 6a 32 29 3b 0a 20  beGoto(v, j2);. 
16f20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
16f30 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
16f40 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
16f50 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
16f60 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70 61  , OP_SorterCompa
16f70 72 65 2c 20 69 53 6f 72 74 65 72 2c 20 6a 32 2c  re, iSorter, j2,
16f80 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20 20 20   regRecord,.    
16f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fa0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65       pIndex->nKe
16fb0 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  yCol); VdbeCover
16fc0 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
16fd0 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61  te3UniqueConstra
16fe0 69 6e 74 28 70 50 61 72 73 65 2c 20 4f 45 5f 41  int(pParse, OE_A
16ff0 62 6f 72 74 2c 20 70 49 6e 64 65 78 29 3b 0a 20  bort, pIndex);. 
17000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
17010 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
17020 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
17030 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
17040 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  AddOp3(v, OP_Sor
17050 74 65 72 44 61 74 61 2c 20 69 53 6f 72 74 65 72  terData, iSorter
17060 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 69 49 64  , regRecord, iId
17070 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  x);.  sqlite3Vdb
17080 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4c 61  eAddOp3(v, OP_La
17090 73 74 2c 20 69 49 64 78 2c 20 30 2c 20 2d 31 29  st, iIdx, 0, -1)
170a0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
170b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
170c0 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67  nsert, iIdx, reg
170d0 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
170e0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
170f0 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
17100 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74  RESULT);.  sqlit
17110 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
17120 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
17130 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
17140 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
17150 6f 72 74 65 72 4e 65 78 74 2c 20 69 53 6f 72 74  orterNext, iSort
17160 65 72 2c 20 61 64 64 72 32 29 3b 20 56 64 62 65  er, addr2); Vdbe
17170 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
17180 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
17190 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20  re(v, addr1);.. 
171a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
171b0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
171c0 69 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  iTab);.  sqlite3
171d0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
171e0 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a 20  _Close, iIdx);. 
171f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17200 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
17210 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  iSorter);.}../*.
17220 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68 65 61 70  ** Allocate heap
17230 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 61   space to hold a
17240 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 77  n Index object w
17250 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73  ith nCol columns
17260 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65  ..**.** Increase
17270 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
17280 73 69 7a 65 20 74 6f 20 70 72 6f 76 69 64 65 20  size to provide 
17290 61 6e 20 65 78 74 72 61 20 6e 45 78 74 72 61 20  an extra nExtra 
172a0 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38 2d 62 79  bytes.** of 8-by
172b0 74 65 20 61 6c 69 67 6e 65 64 20 73 70 61 63 65  te aligned space
172c0 20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65 78   after the Index
172d0 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75   object and retu
172e0 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  rn a.** pointer 
172f0 74 6f 20 74 68 69 73 20 65 78 74 72 61 20 73 70  to this extra sp
17300 61 63 65 20 69 6e 20 2a 70 70 45 78 74 72 61 2e  ace in *ppExtra.
17310 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
17320 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f  e3AllocateIndexO
17330 62 6a 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33  bject(.  sqlite3
17340 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a   *db,         /*
17350 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
17360 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36 20 6e 43  tion */.  i16 nC
17370 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ol,            /
17380 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
17390 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
173a0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
173b0 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
173c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
173d0 74 65 73 20 6f 66 20 65 78 74 72 61 20 73 70 61  tes of extra spa
173e0 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f 0a 20  ce to alloc */. 
173f0 20 63 68 61 72 20 2a 2a 70 70 45 78 74 72 61 20   char **ppExtra 
17400 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
17410 20 74 6f 20 74 68 65 20 22 65 78 74 72 61 22 20   to the "extra" 
17420 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e  space */.){.  In
17430 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20  dex *p;         
17440 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
17450 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a  index object */.
17460 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
17470 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
17480 6f 66 20 73 70 61 63 65 20 66 6f 72 20 49 6e 64  of space for Ind
17490 65 78 20 6f 62 6a 65 63 74 20 2b 20 61 72 72 61  ex object + arra
174a0 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74 65 20 3d  ys */..  nByte =
174b0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49   ROUND8(sizeof(I
174c0 6e 64 65 78 29 29 20 2b 20 20 20 20 20 20 20 20  ndex)) +        
174d0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
174e0 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20 20  tructure  */.   
174f0 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69         ROUND8(si
17500 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c  zeof(char*)*nCol
17510 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ) +         /* I
17520 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20  ndex.azColl     
17530 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55  */.          ROU
17540 4e 44 38 28 73 69 7a 65 6f 66 28 4c 6f 67 45 73  ND8(sizeof(LogEs
17550 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20  t)*(nCol+1) +   
17560 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77    /* Index.aiRow
17570 4c 6f 67 45 73 74 20 20 20 2a 2f 0a 20 20 20 20  LogEst   */.    
17580 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
17590 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 20 2b 20  eof(i16)*nCol + 
175a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
175b0 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a  dex.aiColumn   *
175c0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
175d0 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43     sizeof(u8)*nC
175e0 6f 6c 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ol);            
175f0 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f   /* Index.aSortO
17600 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d 20 73 71  rder */.  p = sq
17610 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
17620 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b 20 6e 45  o(db, nByte + nE
17630 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70 20 29  xtra);.  if( p )
17640 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 45 78 74  {.    char *pExt
17650 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29 2b  ra = ((char*)p)+
17660 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e  ROUND8(sizeof(In
17670 64 65 78 29 29 3b 0a 20 20 20 20 70 2d 3e 61 7a  dex));.    p->az
17680 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  Coll = (const ch
17690 61 72 2a 2a 29 70 45 78 74 72 61 3b 20 70 45 78  ar**)pExtra; pEx
176a0 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69  tra += ROUND8(si
176b0 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c  zeof(char*)*nCol
176c0 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52 6f 77 4c  );.    p->aiRowL
176d0 6f 67 45 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a  ogEst = (LogEst*
176e0 29 70 45 78 74 72 61 3b 20 70 45 78 74 72 61 20  )pExtra; pExtra 
176f0 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74  += sizeof(LogEst
17700 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20  )*(nCol+1);.    
17710 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69  p->aiColumn = (i
17720 31 36 2a 29 70 45 78 74 72 61 3b 20 20 20 20 20  16*)pExtra;     
17730 20 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65    pExtra += size
17740 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20  of(i16)*nCol;.  
17750 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20    p->aSortOrder 
17760 3d 20 28 75 38 2a 29 70 45 78 74 72 61 3b 0a 20  = (u8*)pExtra;. 
17770 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20     p->nColumn = 
17780 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65  nCol;.    p->nKe
17790 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b  yCol = nCol - 1;
177a0 0a 20 20 20 20 2a 70 70 45 78 74 72 61 20 3d 20  .    *ppExtra = 
177b0 28 28 63 68 61 72 2a 29 70 29 20 2b 20 6e 42 79  ((char*)p) + nBy
177c0 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  te;.  }.  return
177d0 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   p;.}../*.** Cre
177e0 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20  ate a new index 
177f0 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65  for an SQL table
17800 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32  .  pName1.pName2
17810 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
17820 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e  the index .** an
17830 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68  d pTblList is th
17840 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
17850 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
17860 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68  e indexed.  Both
17870 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c   will .** be NUL
17880 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20  L for a primary 
17890 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  key or an index 
178a0 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
178b0 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20  to satisfy a.** 
178c0 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
178d0 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e  t.  If pTable an
178e0 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c  d pIndex are NUL
178f0 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70  L, use pParse->p
17900 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74  NewTable.** as t
17910 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
17920 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d  ndexed.  pParse-
17930 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20  >pNewTable is a 
17940 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a  table that is.**
17950 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
17960 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
17970 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
17980 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
17990 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
179a0 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
179b0 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74   indexed.  pList
179c0 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66   will be NULL if
179d0 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72   this.** is a pr
179e0 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69  imary key or uni
179f0 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f  que-constraint o
17a00 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
17a10 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a  t column added.*
17a20 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  * to the table c
17a30 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
17a40 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a  onstruction.  .*
17a50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
17a60 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72  eateIndex(.  Par
17a70 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
17a80 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  /* All informati
17a90 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61  on about this pa
17aa0 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  rse */.  Token *
17ab0 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46  pName1,     /* F
17ac0 69 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64  irst part of ind
17ad0 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20  ex name. May be 
17ae0 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
17af0 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
17b00 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69  Second part of i
17b10 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
17b20 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c  e NULL */.  SrcL
17b30 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f  ist *pTblName, /
17b40 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78  * Table to index
17b50 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  . Use pParse->pN
17b60 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a  ewTable if 0 */.
17b70 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
17b80 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  t,   /* A list o
17b90 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
17ba0 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
17bb0 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20   onError,       
17bc0 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f  /* OE_Abort, OE_
17bd0 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61  Ignore, OE_Repla
17be0 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a  ce, or OE_None *
17bf0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  /.  Token *pStar
17c00 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52  t,     /* The CR
17c10 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
17c20 62 65 67 69 6e 73 20 74 68 69 73 20 73 74 61 74  begins this stat
17c30 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20  ement */.  Expr 
17c40 2a 70 50 49 57 68 65 72 65 2c 20 20 20 20 2f 2a  *pPIWhere,    /*
17c50 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f   WHERE clause fo
17c60 72 20 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65  r partial indice
17c70 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  s */.  int sortO
17c80 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72  rder,     /* Sor
17c90 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69 6d 61  t order of prima
17ca0 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c 69 73  ry key when pLis
17cb0 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  t==NULL */.  int
17cc0 20 69 66 4e 6f 74 45 78 69 73 74 2c 20 20 20 20   ifNotExist,    
17cd0 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20 69 66  /* Omit error if
17ce0 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
17cf0 78 69 73 74 73 20 2a 2f 0a 20 20 75 38 20 69 64  xists */.  u8 id
17d00 78 54 79 70 65 20 20 20 20 20 20 20 20 20 2f 2a  xType         /*
17d10 20 54 68 65 20 69 6e 64 65 78 20 74 79 70 65 20   The index type 
17d20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
17d30 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Tab = 0;     /* 
17d40 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
17d50 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
17d60 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a  pIndex = 0;   /*
17d70 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
17d80 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68   created */.  ch
17d90 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20  ar *zName = 0;  
17da0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
17db0 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
17dc0 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
17dd0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
17de0 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61  haracters in zNa
17df0 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  me */.  int i, j
17e00 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  ;.  DbFixer sFix
17e10 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ;        /* For 
17e20 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61  assigning databa
17e30 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62  se names to pTab
17e40 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  le */.  int sort
17e50 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20  OrderMask;   /* 
17e60 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20  1 to honor DESC 
17e70 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20  in index.  0 to 
17e80 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c  ignore. */.  sql
17e90 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
17ea0 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62  e->db;.  Db *pDb
17eb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
17ec0 20 54 68 65 20 73 70 65 63 69 66 69 63 20 74 61   The specific ta
17ed0 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
17ee0 68 65 20 69 6e 64 65 78 65 64 20 64 61 74 61 62  he indexed datab
17ef0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ase */.  int iDb
17f00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
17f10 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   Index of the da
17f20 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20 62  tabase that is b
17f30 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a  eing written */.
17f40 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d    Token *pName =
17f50 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c   0;    /* Unqual
17f60 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
17f70 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74  e index to creat
17f80 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78  e */.  struct Ex
17f90 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69  prList_item *pLi
17fa0 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c  stItem; /* For l
17fb0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73  ooping over pLis
17fc0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  t */.  int nExtr
17fd0 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  a = 0;          
17fe0 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
17ff0 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a   allocated for z
18000 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74  Extra[] */.  int
18010 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20 20 20 20   nExtraCol;     
18020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18030 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
18040 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20   columns needed 
18050 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72  */.  char *zExtr
18060 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  a = 0;          
18070 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73        /* Extra s
18080 70 61 63 65 20 61 66 74 65 72 20 74 68 65 20 49  pace after the I
18090 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ndex object */. 
180a0 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b   Index *pPk = 0;
180b0 20 20 20 20 20 20 2f 2a 20 50 52 49 4d 41 52 59        /* PRIMARY
180c0 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72 20 57   KEY index for W
180d0 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
180e0 6c 65 73 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62  les */..  if( db
180f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
18100 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
18110 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
18120 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
18130 20 20 7d 0a 20 20 69 66 28 20 49 4e 5f 44 45 43    }.  if( IN_DEC
18140 4c 41 52 45 5f 56 54 41 42 20 26 26 20 69 64 78  LARE_VTAB && idx
18150 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58  Type!=SQLITE_IDX
18160 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 20  TYPE_PRIMARYKEY 
18170 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
18180 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18190 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f   }.  if( SQLITE_
181a0 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
181b0 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
181c0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
181d0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
181e0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
181f0 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
18200 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
18210 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20  .  Return early 
18220 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  if not found..  
18230 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  */.  if( pTblNam
18240 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e!=0 ){..    /* 
18250 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74  Use the two-part
18260 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64   index name to d
18270 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74  etermine the dat
18280 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f  abase .    ** to
18290 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   search for the 
182a0 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65  table. 'Fix' the
182b0 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
182c0 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65  his db.    ** be
182d0 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20  fore looking up 
182e0 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  the table..    *
182f0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  /.    assert( pN
18300 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29  ame1 && pName2 )
18310 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
18320 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
18330 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
18340 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
18350 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20      if( iDb<0 ) 
18360 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
18370 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65  _index;.    asse
18380 72 74 28 20 70 4e 61 6d 65 20 26 26 20 70 4e 61  rt( pName && pNa
18390 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64 65  me->z );..#ifnde
183a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45  f SQLITE_OMIT_TE
183b0 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74  MPDB.    /* If t
183c0 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61  he index name wa
183d0 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63  s unqualified, c
183e0 68 65 63 6b 20 69 66 20 74 68 65 20 74 61 62 6c  heck if the tabl
183f0 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65  e.    ** is a te
18400 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c  mp table. If so,
18410 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
18420 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64  e to 1. Do not d
18430 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66  o this.    ** if
18440 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20   initialising a 
18450 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
18460 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
18470 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
18480 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 73  {.      pTab = s
18490 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f  qlite3SrcListLoo
184a0 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c  kup(pParse, pTbl
184b0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
184c0 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26   pName2->n==0 &&
184d0 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70   pTab && pTab->p
184e0 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b  Schema==db->aDb[
184f0 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  1].pSchema ){.  
18500 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20        iDb = 1;. 
18510 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
18520 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  dif..    sqlite3
18530 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
18540 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64  Parse, iDb, "ind
18550 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  ex", pName);.   
18560 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 53   if( sqlite3FixS
18570 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54  rcList(&sFix, pT
18580 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  blName) ){.     
18590 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   /* Because the 
185a0 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74  parser construct
185b0 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20  s pTblName from 
185c0 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66  a single identif
185d0 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71  ier,.      ** sq
185e0 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 20  lite3FixSrcList 
185f0 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20  can never fail. 
18600 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
18610 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  0);.    }.    pT
18620 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
18630 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
18640 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61 6d 65  se, 0, &pTblName
18650 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73  ->a[0]);.    ass
18660 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
18670 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54 61 62  ailed==0 || pTab
18680 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
18690 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  Tab==0 ) goto ex
186a0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
186b0 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20  .    if( iDb==1 
186c0 26 26 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  && db->aDb[iDb].
186d0 70 53 63 68 65 6d 61 21 3d 70 54 61 62 2d 3e 70  pSchema!=pTab->p
186e0 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
186f0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18700 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
18710 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 72 65 61      "cannot crea
18720 74 65 20 61 20 54 45 4d 50 20 69 6e 64 65 78 20  te a TEMP index 
18730 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c  on non-TEMP tabl
18740 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20  e \"%s\"",.     
18750 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
18760 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  e);.      goto e
18770 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18780 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18790 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
187a0 29 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50  ) pPk = sqlite3P
187b0 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
187c0 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Tab);.  }else{. 
187d0 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
187e0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
187f0 74 28 20 70 53 74 61 72 74 3d 3d 30 20 29 3b 0a  t( pStart==0 );.
18800 20 20 20 20 70 54 61 62 20 3d 20 70 50 61 72 73      pTab = pPars
18810 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
18820 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67 6f    if( !pTab ) go
18830 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18840 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20  ndex;.    iDb = 
18850 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
18860 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
18870 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70  Schema);.  }.  p
18880 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
18890 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  b];..  assert( p
188a0 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Tab!=0 );.  asse
188b0 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
188c0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  ==0 );.  if( sql
188d0 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
188e0 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
188f0 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20  e_", 7)==0 .    
18900 20 20 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62     && db->init.b
18910 75 73 79 3d 3d 30 0a 23 69 66 20 53 51 4c 49 54  usy==0.#if SQLIT
18920 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
18930 41 54 49 4f 4e 0a 20 20 20 20 20 20 20 26 26 20  ATION.       && 
18940 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54  sqlite3UserAuthT
18950 61 62 6c 65 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  able(pTab->zName
18960 29 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20  )==0.#endif.    
18970 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
18980 4e 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61  NICmp(&pTab->zNa
18990 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f  me[7],"altertab_
189a0 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  ",9)!=0 ){.    s
189b0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
189c0 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
189d0 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
189e0 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  xed", pTab->zNam
189f0 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
18a00 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
18a10 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
18a20 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69  TE_OMIT_VIEW.  i
18a30 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
18a40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
18a50 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
18a60 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62  "views may not b
18a70 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20  e indexed");.   
18a80 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18a90 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e  e_index;.  }.#en
18aa0 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
18ab0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
18ac0 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72  ABLE.  if( IsVir
18ad0 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
18ae0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
18af0 67 28 70 50 61 72 73 65 2c 20 22 76 69 72 74 75  g(pParse, "virtu
18b00 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f  al tables may no
18b10 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a  t be indexed");.
18b20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
18b30 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
18b40 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a  #endif..  /*.  *
18b50 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20  * Find the name 
18b60 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d  of the index.  M
18b70 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
18b80 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e  s not already an
18b90 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78  other.  ** index
18ba0 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74   or table with t
18bb0 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a  he same name.  .
18bc0 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74    **.  ** Except
18bd0 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20  ion:  If we are 
18be0 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65  reading the name
18bf0 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69  s of permanent i
18c00 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a  ndices from the.
18c10 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74    ** sqlite_mast
18c20 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73  er table (becaus
18c30 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
18c40 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65  cess changed the
18c50 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a   schema) and.  *
18c60 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64  * one of the ind
18c70 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65  ex names collide
18c80 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  s with the name 
18c90 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  of a temporary t
18ca0 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64  able or.  ** ind
18cb0 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ex, then we will
18cc0 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f   continue to pro
18cd0 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e  cess this index.
18ce0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e  .  **.  ** If pN
18cf0 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
18d00 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a  that we are.  **
18d10 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
18d20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55  primary key or U
18d30 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
18d40 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  .  We have to in
18d50 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77  vent our.  ** ow
18d60 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  n name..  */.  i
18d70 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
18d80 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
18d90 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
18da0 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   pName);.    if(
18db0 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f   zName==0 ) goto
18dc0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18dd0 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
18de0 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20  pName->z!=0 );. 
18df0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
18e00 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  !=sqlite3CheckOb
18e10 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  jectName(pParse,
18e20 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20   zName) ){.     
18e30 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18e40 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
18e50 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
18e60 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69  .busy ){.      i
18e70 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  f( sqlite3FindTa
18e80 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  ble(db, zName, 0
18e90 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
18ea0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18eb0 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
18ec0 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c  s already a tabl
18ed0 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61  e named %s", zNa
18ee0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
18ef0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18f00 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
18f10 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
18f20 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
18f30 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 44 62 53  zName, pDb->zDbS
18f40 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
18f50 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73    if( !ifNotExis
18f60 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
18f70 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
18f80 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61  rse, "index %s a
18f90 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
18fa0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  zName);.      }e
18fb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
18fc0 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
18fd0 75 73 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73  usy );.        s
18fe0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
18ff0 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
19000 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Db);.      }.   
19010 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
19020 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
19030 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
19040 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  t n;.    Index *
19050 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70  pLoop;.    for(p
19060 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65  Loop=pTab->pInde
19070 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70  x, n=1; pLoop; p
19080 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78  Loop=pLoop->pNex
19090 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e  t, n++){}.    zN
190a0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
190b0 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65  intf(db, "sqlite
190c0 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64  _autoindex_%s_%d
190d0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
190e0 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  n);.    if( zNam
190f0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  e==0 ){.      go
19100 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
19110 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ndex;.    }..   
19120 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e   /* Automatic in
19130 64 65 78 20 6e 61 6d 65 73 20 67 65 6e 65 72 61  dex names genera
19140 74 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  ted from within 
19150 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
19160 76 74 61 62 28 29 0a 20 20 20 20 2a 2a 20 6d 75  vtab().    ** mu
19170 73 74 20 68 61 76 65 20 6e 61 6d 65 73 20 74 68  st have names th
19180 61 74 20 61 72 65 20 64 69 73 74 69 6e 63 74 20  at are distinct 
19190 66 72 6f 6d 20 6e 6f 72 6d 61 6c 20 61 75 74 6f  from normal auto
191a0 6d 61 74 69 63 20 69 6e 64 65 78 20 6e 61 6d 65  matic index name
191b0 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  s..    ** The fo
191c0 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e  llowing statemen
191d0 74 20 63 6f 6e 76 65 72 74 73 20 22 73 71 6c 69  t converts "sqli
191e0 74 65 33 5f 61 75 74 6f 69 6e 64 65 78 2e 2e 2e  te3_autoindex...
191f0 22 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 22 73  " into.    ** "s
19200 71 6c 69 74 65 33 5f 62 75 74 6f 69 6e 64 65 78  qlite3_butoindex
19210 2e 2e 2e 22 20 69 6e 20 6f 72 64 65 72 20 74 6f  ..." in order to
19220 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 73 20   make the names 
19230 64 69 73 74 69 6e 63 74 2e 0a 20 20 20 20 2a 2a  distinct..    **
19240 20 54 68 65 20 22 76 74 61 62 5f 65 72 72 2e 74   The "vtab_err.t
19250 65 73 74 22 20 74 65 73 74 20 64 65 6d 6f 6e 73  est" test demons
19260 74 72 61 74 65 73 20 74 68 65 20 6e 65 65 64 20  trates the need 
19270 6f 66 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  of this statemen
19280 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 4e  t. */.    if( IN
19290 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20  _DECLARE_VTAB ) 
192a0 7a 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a 20 20 7d 0a  zName[7]++;.  }.
192b0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
192c0 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f  authorization to
192d0 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78   create an index
192e0 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
192f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
19300 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
19310 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
19320 20 3d 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65   = pDb->zDbSName
19330 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
19340 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
19350 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
19360 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
19370 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Db), 0, zDb) ){.
19380 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
19390 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
193a0 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49    }.    i = SQLI
193b0 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b  TE_CREATE_INDEX;
193c0 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
193d0 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
193e0 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ) i = SQLITE_CRE
193f0 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ATE_TEMP_INDEX;.
19400 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
19410 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
19420 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d   i, zName, pTab-
19430 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
19440 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
19450 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
19460 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
19470 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30    /* If pList==0
19480 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  , it means this 
19490 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
194a0 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69  ed to make a pri
194b0 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75  mary.  ** key ou
194c0 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f  t of the last co
194d0 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68  lumn added to th
194e0 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
194f0 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a  nstruction..  **
19500 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b   So create a fak
19510 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61  e list to simula
19520 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20  te this..  */.  
19530 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
19540 20 20 20 20 54 6f 6b 65 6e 20 70 72 65 76 43 6f      Token prevCo
19550 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f  l;.    sqlite3To
19560 6b 65 6e 49 6e 69 74 28 26 70 72 65 76 43 6f 6c  kenInit(&prevCol
19570 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61  , pTab->aCol[pTa
19580 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65  b->nCol-1].zName
19590 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  );.    pList = s
195a0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
195b0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 0a  pend(pParse, 0,.
195c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
195d0 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
195e0 62 2c 20 54 4b 5f 49 44 2c 20 26 70 72 65 76 43  b, TK_ID, &prevC
195f0 6f 6c 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28  ol, 0));.    if(
19600 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
19610 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19620 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
19630 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20  pList->nExpr==1 
19640 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
19650 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64  prListSetSortOrd
19660 65 72 28 70 4c 69 73 74 2c 20 73 6f 72 74 4f 72  er(pList, sortOr
19670 64 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  der);.  }else{. 
19680 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
19690 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50  stCheckLength(pP
196a0 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 22 69 6e  arse, pList, "in
196b0 64 65 78 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  dex");.  }..  /*
196c0 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
196d0 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70  many bytes of sp
196e0 61 63 65 20 61 72 65 20 72 65 71 75 69 72 65 64  ace are required
196f0 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63   to store explic
19700 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66  itly.  ** specif
19710 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ied collation se
19720 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20  quence names..  
19730 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
19740 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
19750 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
19760 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  xpr = pList->a[i
19770 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ].pExpr;.    ass
19780 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b  ert( pExpr!=0 );
19790 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
197a0 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
197b0 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b  {.      nExtra +
197c0 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74  = (1 + sqlite3St
197d0 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e  rlen30(pExpr->u.
197e0 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a  zToken));.    }.
197f0 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20    }..  /* .  ** 
19800 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  Allocate the ind
19810 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20  ex structure. . 
19820 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71   */.  nName = sq
19830 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
19840 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f  ame);.  nExtraCo
19850 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e  l = pPk ? pPk->n
19860 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70 49  KeyCol : 1;.  pI
19870 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 41 6c  ndex = sqlite3Al
19880 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63  locateIndexObjec
19890 74 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45 78  t(db, pList->nEx
198a0 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c 0a  pr + nExtraCol,.
198b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198d0 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e 45        nName + nE
198e0 78 74 72 61 20 2b 20 31 2c 20 26 7a 45 78 74 72  xtra + 1, &zExtr
198f0 61 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  a);.  if( db->ma
19900 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
19910 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
19920 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
19930 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
19940 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e  TE_ALIGNMENT(pIn
19950 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  dex->aiRowLogEst
19960 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ) );.  assert( E
19970 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
19980 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  ENT(pIndex->azCo
19990 6c 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65 78 2d  ll) );.  pIndex-
199a0 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61 3b  >zName = zExtra;
199b0 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e 61  .  zExtra += nNa
199c0 6d 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79  me + 1;.  memcpy
199d0 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20  (pIndex->zName, 
199e0 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b  zName, nName+1);
199f0 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
19a00 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
19a10 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75  ex->onError = (u
19a20 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e  8)onError;.  pIn
19a30 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  dex->uniqNotNull
19a40 20 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e   = onError!=OE_N
19a50 6f 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69  one;.  pIndex->i
19a60 64 78 54 79 70 65 20 3d 20 69 64 78 54 79 70 65  dxType = idxType
19a70 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  ;.  pIndex->pSch
19a80 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ema = db->aDb[iD
19a90 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 49  b].pSchema;.  pI
19aa0 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20  ndex->nKeyCol = 
19ab0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
19ac0 69 66 28 20 70 50 49 57 68 65 72 65 20 29 7b 0a  if( pPIWhere ){.
19ad0 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
19ae0 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28  veSelfReference(
19af0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43  pParse, pTab, NC
19b00 5f 50 61 72 74 49 64 78 2c 20 70 50 49 57 68 65  _PartIdx, pPIWhe
19b10 72 65 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e 64  re, 0);.    pInd
19b20 65 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  ex->pPartIdxWher
19b30 65 20 3d 20 70 50 49 57 68 65 72 65 3b 0a 20 20  e = pPIWhere;.  
19b40 20 20 70 50 49 57 68 65 72 65 20 3d 20 30 3b 0a    pPIWhere = 0;.
19b50 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
19b60 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
19b70 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
19b80 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
19b90 74 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f  to see if we sho
19ba0 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72  uld honor DESC r
19bb0 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78  equests on index
19bc0 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20   columns.  */.  
19bd0 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
19be0 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ->file_format>=4
19bf0 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65   ){.    sortOrde
19c00 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a  rMask = -1;   /*
19c10 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20   Honor DESC */. 
19c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74   }else{.    sort
19c30 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20  OrderMask = 0;  
19c40 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43    /* Ignore DESC
19c50 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e   */.  }..  /* An
19c60 61 6c 79 7a 65 20 74 68 65 20 6c 69 73 74 20 6f  alyze the list o
19c70 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  f expressions th
19c80 61 74 20 66 6f 72 6d 20 74 68 65 20 74 65 72 6d  at form the term
19c90 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  s of the index a
19ca0 6e 64 0a 20 20 2a 2a 20 72 65 70 6f 72 74 20 61  nd.  ** report a
19cb0 6e 79 20 65 72 72 6f 72 73 2e 20 20 49 6e 20 74  ny errors.  In t
19cc0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
19cd0 68 65 72 65 20 74 68 65 20 65 78 70 72 65 73 73  here the express
19ce0 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 0a 20  ion is exactly. 
19cf0 20 2a 2a 20 61 20 74 61 62 6c 65 20 63 6f 6c 75   ** a table colu
19d00 6d 6e 2c 20 73 74 6f 72 65 20 74 68 61 74 20 63  mn, store that c
19d10 6f 6c 75 6d 6e 20 69 6e 20 61 69 43 6f 6c 75 6d  olumn in aiColum
19d20 6e 5b 5d 2e 20 20 46 6f 72 20 67 65 6e 65 72 61  n[].  For genera
19d30 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 20  l expressions,. 
19d40 20 2a 2a 20 70 6f 70 75 6c 61 74 65 20 70 49 6e   ** populate pIn
19d50 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 61 6e  dex->aColExpr an
19d60 64 20 73 74 6f 72 65 20 58 4e 5f 45 58 50 52 20  d store XN_EXPR 
19d70 28 2d 32 29 20 69 6e 20 61 69 43 6f 6c 75 6d 6e  (-2) in aiColumn
19d80 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  []..  **.  ** TO
19d90 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e  DO: Issue a warn
19da0 69 6e 67 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f  ing if two or mo
19db0 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  re columns of th
19dc0 65 20 69 6e 64 65 78 20 61 72 65 20 69 64 65 6e  e index are iden
19dd0 74 69 63 61 6c 2e 0a 20 20 2a 2a 20 54 4f 44 4f  tical..  ** TODO
19de0 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e  : Issue a warnin
19df0 67 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 70  g if the table p
19e00 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73  rimary key is us
19e10 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
19e20 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6b 65 79  e.  ** index key
19e30 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
19e40 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73  , pListItem=pLis
19e50 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  t->a; i<pList->n
19e60 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74  Expr; i++, pList
19e70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
19e80 72 20 2a 70 43 45 78 70 72 3b 20 20 20 20 20 20  r *pCExpr;      
19e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19ea0 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20 65 78  he i-th index ex
19eb0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
19ec0 69 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f 72  int requestedSor
19ed0 74 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20 2f  tOrder;        /
19ee0 2a 20 41 53 43 20 6f 72 20 44 45 53 43 20 6f 6e  * ASC or DESC on
19ef0 20 74 68 65 20 69 2d 74 68 20 65 78 70 72 65 73   the i-th expres
19f00 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  sion */.    cons
19f10 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20  t char *zColl;  
19f20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
19f30 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
19f40 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 73 71   name */..    sq
19f50 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28  lite3StringToId(
19f60 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
19f70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
19f80 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e  solveSelfReferen
19f90 63 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ce(pParse, pTab,
19fa0 20 4e 43 5f 49 64 78 45 78 70 72 2c 20 70 4c 69   NC_IdxExpr, pLi
19fb0 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 30  stItem->pExpr, 0
19fc0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
19fd0 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65  e->nErr ) goto e
19fe0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19ff0 3b 0a 20 20 20 20 70 43 45 78 70 72 20 3d 20 73  ;.    pCExpr = s
1a000 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
1a010 6c 6c 61 74 65 28 70 4c 69 73 74 49 74 65 6d 2d  llate(pListItem-
1a020 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  >pExpr);.    if(
1a030 20 70 43 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f   pCExpr->op!=TK_
1a040 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
1a050 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65  if( pTab==pParse
1a060 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20  ->pNewTable ){. 
1a070 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1a080 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1a090 65 78 70 72 65 73 73 69 6f 6e 73 20 70 72 6f 68  expressions proh
1a0a0 69 62 69 74 65 64 20 69 6e 20 50 52 49 4d 41 52  ibited in PRIMAR
1a0b0 59 20 4b 45 59 20 61 6e 64 20 22 0a 20 20 20 20  Y KEY and ".    
1a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0d0 20 20 20 20 20 20 20 20 20 20 20 20 22 55 4e 49              "UNI
1a0e0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 22  QUE constraints"
1a0f0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
1a100 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1a110 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
1a120 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 43 6f   if( pIndex->aCo
1a130 6c 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  lExpr==0 ){.    
1a140 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43      ExprList *pC
1a150 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  opy = sqlite3Exp
1a160 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4c 69  rListDup(db, pLi
1a170 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  st, 0);.        
1a180 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72  pIndex->aColExpr
1a190 20 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20 20 20   = pCopy;.      
1a1a0 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
1a1b0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
1a1c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
1a1d0 70 79 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  py!=0 );.       
1a1e0 20 20 20 70 4c 69 73 74 49 74 65 6d 20 3d 20 26     pListItem = &
1a1f0 70 43 6f 70 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20  pCopy->a[i];.   
1a200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1a210 20 20 20 20 20 6a 20 3d 20 58 4e 5f 45 58 50 52       j = XN_EXPR
1a220 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  ;.      pIndex->
1a230 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e  aiColumn[i] = XN
1a240 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e  _EXPR;.      pIn
1a250 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  dex->uniqNotNull
1a260 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1a270 0a 20 20 20 20 20 20 6a 20 3d 20 70 43 45 78 70  .      j = pCExp
1a280 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
1a290 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 30 78 37    assert( j<=0x7
1a2a0 66 66 66 20 29 3b 0a 20 20 20 20 20 20 69 66 28  fff );.      if(
1a2b0 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   j<0 ){.        
1a2c0 6a 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  j = pTab->iPKey;
1a2d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1a2e0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e   pTab->aCol[j].n
1a2f0 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  otNull==0 ){.   
1a300 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69       pIndex->uni
1a310 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  qNotNull = 0;.  
1a320 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64      }.      pInd
1a330 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
1a340 3d 20 28 69 31 36 29 6a 3b 0a 20 20 20 20 7d 0a  = (i16)j;.    }.
1a350 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20      zColl = 0;. 
1a360 20 20 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d     if( pListItem
1a370 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ->pExpr->op==TK_
1a380 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20  COLLATE ){.     
1a390 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20   int nColl;.    
1a3a0 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49    zColl = pListI
1a3b0 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54  tem->pExpr->u.zT
1a3c0 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c  oken;.      nCol
1a3d0 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  l = sqlite3Strle
1a3e0 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a  n30(zColl) + 1;.
1a3f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 45        assert( nE
1a400 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20  xtra>=nColl );. 
1a410 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 78 74       memcpy(zExt
1a420 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c  ra, zColl, nColl
1a430 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  );.      zColl =
1a440 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20 7a   zExtra;.      z
1a450 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a  Extra += nColl;.
1a460 20 20 20 20 20 20 6e 45 78 74 72 61 20 2d 3d 20        nExtra -= 
1a470 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  nColl;.    }else
1a480 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20   if( j>=0 ){.   
1a490 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d     zColl = pTab-
1a4a0 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a  >aCol[j].zColl;.
1a4b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a      }.    if( !z
1a4c0 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 73  Coll ) zColl = s
1a4d0 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b  qlite3StrBINARY;
1a4e0 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
1a4f0 69 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69  it.busy && !sqli
1a500 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
1a510 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20  (pParse, zColl) 
1a520 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
1a530 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1a540 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
1a550 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a  x->azColl[i] = z
1a560 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73  Coll;.    reques
1a570 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70  tedSortOrder = p
1a580 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  ListItem->sortOr
1a590 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d  der & sortOrderM
1a5a0 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d  ask;.    pIndex-
1a5b0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
1a5c0 20 28 75 38 29 72 65 71 75 65 73 74 65 64 53 6f   (u8)requestedSo
1a5d0 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  rtOrder;.  }..  
1a5e0 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 74 61  /* Append the ta
1a5f0 62 6c 65 20 6b 65 79 20 74 6f 20 74 68 65 20 65  ble key to the e
1a600 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  nd of the index.
1a610 20 20 46 6f 72 20 57 49 54 48 4f 55 54 20 52 4f    For WITHOUT RO
1a620 57 49 44 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20  WID.  ** tables 
1a630 28 77 68 65 6e 20 70 50 6b 21 3d 30 29 20 74 68  (when pPk!=0) th
1a640 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64  is will be the d
1a650 65 63 6c 61 72 65 64 20 50 52 49 4d 41 52 59 20  eclared PRIMARY 
1a660 4b 45 59 2e 20 20 46 6f 72 0a 20 20 2a 2a 20 6e  KEY.  For.  ** n
1a670 6f 72 6d 61 6c 20 74 61 62 6c 65 73 20 28 77 68  ormal tables (wh
1a680 65 6e 20 70 50 6b 3d 3d 30 29 20 74 68 69 73 20  en pPk==0) this 
1a690 77 69 6c 6c 20 62 65 20 74 68 65 20 72 6f 77 69  will be the rowi
1a6a0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
1a6b0 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  k ){.    for(j=0
1a6c0 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  ; j<pPk->nKeyCol
1a6d0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; j++){.      in
1a6e0 74 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c  t x = pPk->aiCol
1a6f0 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73  umn[j];.      as
1a700 73 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20  sert( x>=0 );.  
1a710 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d      if( hasColum
1a720 6e 28 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  n(pIndex->aiColu
1a730 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  mn, pIndex->nKey
1a740 43 6f 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20 20  Col, x) ){.     
1a750 20 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75     pIndex->nColu
1a760 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c  mn--; .      }el
1a770 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64  se{.        pInd
1a780 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
1a790 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  = x;.        pIn
1a7a0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
1a7b0 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b   pPk->azColl[j];
1a7c0 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1a7d0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
1a7e0 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72   pPk->aSortOrder
1a7f0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b  [j];.        i++
1a800 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a810 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70      assert( i==p
1a820 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
1a830 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1a840 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
1a850 69 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20  i] = XN_ROWID;. 
1a860 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c     pIndex->azCol
1a870 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 53 74  l[i] = sqlite3St
1a880 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 20 20 73  rBINARY;.  }.  s
1a890 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77  qlite3DefaultRow
1a8a0 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 20 20 69  Est(pIndex);.  i
1a8b0 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  f( pParse->pNewT
1a8c0 61 62 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d 61  able==0 ) estima
1a8d0 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49 6e  teIndexWidth(pIn
1a8e0 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  dex);..  /* If t
1a8f0 68 69 73 20 69 6e 64 65 78 20 63 6f 6e 74 61 69  his index contai
1a900 6e 73 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  ns every column 
1a910 6f 66 20 69 74 73 20 74 61 62 6c 65 2c 20 74 68  of its table, th
1a920 65 6e 20 6d 61 72 6b 0a 20 20 2a 2a 20 69 74 20  en mark.  ** it 
1a930 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  as a covering in
1a940 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  dex */.  assert(
1a950 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
1a960 0a 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e  .      || pTab->
1a970 69 50 4b 65 79 3c 30 20 7c 7c 20 73 71 6c 69 74  iPKey<0 || sqlit
1a980 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
1a990 70 49 6e 64 65 78 2c 20 70 54 61 62 2d 3e 69 50  pIndex, pTab->iP
1a9a0 4b 65 79 29 3e 3d 30 20 29 3b 0a 20 20 69 66 28  Key)>=0 );.  if(
1a9b0 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 26 26 20   pTblName!=0 && 
1a9c0 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  pIndex->nColumn>
1a9d0 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  =pTab->nCol ){. 
1a9e0 20 20 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76     pIndex->isCov
1a9f0 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 66  ering = 1;.    f
1aa00 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
1aa10 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
1aa20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69    if( j==pTab->i
1aa30 50 4b 65 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b  PKey ) continue;
1aa40 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1aa50 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
1aa60 70 49 6e 64 65 78 2c 6a 29 3e 3d 30 20 29 20 63  pIndex,j)>=0 ) c
1aa70 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
1aa80 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e  Index->isCoverin
1aa90 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  g = 0;.      bre
1aaa0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
1aab0 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73   if( pTab==pPars
1aac0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a  e->pNewTable ){.
1aad0 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74      /* This rout
1aae0 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c  ine has been cal
1aaf0 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e  led to create an
1ab00 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
1ab10 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73   as a.    ** res
1ab20 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59  ult of a PRIMARY
1ab30 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
1ab40 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d  lause on a colum
1ab50 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72  n definition, or
1ab60 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52  .    ** a PRIMAR
1ab70 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
1ab80 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67  clause following
1ab90 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69   the column defi
1aba0 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20  nitions..    ** 
1abb0 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20  i.e. one of:.   
1abc0 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54   **.    ** CREAT
1abd0 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d  E TABLE t(x PRIM
1abe0 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20  ARY KEY, y);.   
1abf0 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
1ac00 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28   t(x, y, UNIQUE(
1ac10 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20  x, y));.    **. 
1ac20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79     ** Either way
1ac30 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
1ac40 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
1ac50 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e 20  ady has such an 
1ac60 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a  index. If.    **
1ac70 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65   so, don't bothe
1ac80 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73 20  r creating this 
1ac90 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61  one. This only a
1aca0 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a  pplies to.    **
1acb0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
1acc0 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20  reated indices. 
1acd0 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20  Users can do as 
1ace0 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a 20  they wish with. 
1acf0 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69     ** explicit i
1ad00 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20  ndices..    **. 
1ad10 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45     ** Two UNIQUE
1ad20 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20   or PRIMARY KEY 
1ad30 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
1ad40 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69 76  considered equiv
1ad50 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e  alent.    ** (an
1ad60 64 20 74 68 75 73 20 73 75 70 70 72 65 73 73 69  d thus suppressi
1ad70 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e  ng the second on
1ad80 65 29 20 65 76 65 6e 20 69 66 20 74 68 65 79 20  e) even if they 
1ad90 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 20  have different. 
1ada0 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72     ** sort order
1adb0 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
1adc0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
1add0 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e  fferent collatin
1ade0 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20 69  g sequences or i
1adf0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
1ae00 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73  .    ** the cons
1ae10 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e 20  traint occur in 
1ae20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 73  different orders
1ae30 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74  , then the const
1ae40 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20 2a  raints are.    *
1ae50 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73  * considered dis
1ae60 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20 72  tinct and both r
1ae70 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61 74  esult in separat
1ae80 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a  e indices..    *
1ae90 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
1aea0 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
1aeb0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
1aec0 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
1aed0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
1aee0 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   k;.      assert
1aef0 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  ( IsUniqueIndex(
1af00 70 49 64 78 29 20 29 3b 0a 20 20 20 20 20 20 61  pIdx) );.      a
1af10 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 64 78  ssert( pIdx->idx
1af20 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58  Type!=SQLITE_IDX
1af30 54 59 50 45 5f 41 50 50 44 45 46 20 29 3b 0a 20  TYPE_APPDEF );. 
1af40 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73 55       assert( IsU
1af50 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65  niqueIndex(pInde
1af60 78 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  x) );..      if(
1af70 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d   pIdx->nKeyCol!=
1af80 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20  pIndex->nKeyCol 
1af90 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1afa0 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64    for(k=0; k<pId
1afb0 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29  x->nKeyCol; k++)
1afc0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
1afd0 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20  char *z1;.      
1afe0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
1aff0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1b000 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
1b010 5b 6b 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  [k]>=0 );.      
1b020 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
1b030 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d  lumn[k]!=pIndex-
1b040 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62  >aiColumn[k] ) b
1b050 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31  reak;.        z1
1b060 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
1b070 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d  k];.        z2 =
1b080 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1b090 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k];.        if( 
1b0a0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1b0b0 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a  1, z2) ) break;.
1b0c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1b0d0 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  ( k==pIdx->nKeyC
1b0e0 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ol ){.        if
1b0f0 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
1b100 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  =pIndex->onError
1b110 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1b120 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   This constraint
1b130 20 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d   creates the sam
1b140 65 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65  e index as a pre
1b150 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20  vious.          
1b160 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70  ** constraint sp
1b170 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72  ecified somewher
1b180 65 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  e in the CREATE 
1b190 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
1b1a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f  .          ** Ho
1b1b0 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e  wever the ON CON
1b1c0 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72  FLICT clauses ar
1b1d0 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20  e different. If 
1b1e0 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20  both this .     
1b1f0 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
1b200 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69  nt and the previ
1b210 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63  ous equivalent c
1b220 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65  onstraint have e
1b230 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20  xplicit.        
1b240 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54    ** ON CONFLICT
1b250 20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73   clauses this is
1b260 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72   an error. Other
1b270 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20  wise, use the.  
1b280 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69          ** expli
1b290 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20  citly specified 
1b2a0 62 65 68 61 76 69 6f 72 20 66 6f 72 20 74 68 65  behavior for the
1b2b0 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
1b2c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
1b2d0 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72  f( !(pIdx->onErr
1b2e0 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c  or==OE_Default |
1b2f0 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  | pIndex->onErro
1b300 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29  r==OE_Default) )
1b310 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1b320 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1b330 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
1b340 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74         "conflict
1b350 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  ing ON CONFLICT 
1b360 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65  clauses specifie
1b370 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  d", 0);.        
1b380 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
1b390 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
1b3a0 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20  =OE_Default ){. 
1b3b0 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
1b3c0 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65  >onError = pInde
1b3d0 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  x->onError;.    
1b3e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b3f0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 64  }.        if( id
1b400 78 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44  xType==SQLITE_ID
1b410 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59  XTYPE_PRIMARYKEY
1b420 20 29 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65   ) pIdx->idxType
1b430 20 3d 20 69 64 78 54 79 70 65 3b 0a 20 20 20 20   = idxType;.    
1b440 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1b450 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1b460 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1b470 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77   /* Link the new
1b480 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
1b490 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e   to its table an
1b4a0 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20  d to the other. 
1b4b0 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   ** in-memory da
1b4c0 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
1b4d0 73 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  s. .  */.  asser
1b4e0 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
1b4f0 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  =0 );.  if( db->
1b500 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
1b510 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 61   Index *p;.    a
1b520 73 73 65 72 74 28 20 21 49 4e 5f 44 45 43 4c 41  ssert( !IN_DECLA
1b530 52 45 5f 56 54 41 42 20 29 3b 0a 20 20 20 20 61  RE_VTAB );.    a
1b540 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
1b550 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
1b560 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  , 0, pIndex->pSc
1b570 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 70 20 3d  hema) );.    p =
1b580 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
1b590 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68  rt(&pIndex->pSch
1b5a0 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20  ema->idxHash, . 
1b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5c0 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d           pIndex-
1b5d0 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 29 3b  >zName, pIndex);
1b5e0 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
1b5f0 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
1b600 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c  Index );  /* Mal
1b610 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
1b620 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71  iled */.      sq
1b630 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
1b640 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  );.      goto ex
1b650 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1b660 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66  .    }.    db->f
1b670 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
1b680 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
1b690 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d    if( pTblName!=
1b6a0 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  0 ){.      pInde
1b6b0 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  x->tnum = db->in
1b6c0 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20  it.newTnum;.    
1b6d0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
1b6e0 68 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69  his is the initi
1b6f0 61 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  al CREATE INDEX 
1b700 73 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 43 52  statement (or CR
1b710 45 41 54 45 20 54 41 42 4c 45 20 69 66 20 74 68  EATE TABLE if th
1b720 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20  e.  ** index is 
1b730 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78  an implied index
1b740 20 66 6f 72 20 61 20 55 4e 49 51 55 45 20 6f 72   for a UNIQUE or
1b750 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
1b760 73 74 72 61 69 6e 74 29 20 74 68 65 6e 0a 20 20  straint) then.  
1b770 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20 74 6f 20  ** emit code to 
1b780 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  allocate the ind
1b790 65 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64  ex rootpage on d
1b7a0 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20  isk and make an 
1b7b0 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 74  entry for.  ** t
1b7c0 68 65 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20  he index in the 
1b7d0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
1b7e0 62 6c 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ble and populate
1b7f0 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 0a   the index with.
1b800 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 42    ** content.  B
1b810 75 74 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  ut, do not do th
1b820 69 73 20 69 66 20 77 65 20 61 72 65 20 73 69 6d  is if we are sim
1b830 70 6c 79 20 72 65 61 64 69 6e 67 20 74 68 65 20  ply reading the 
1b840 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20  sqlite_master.  
1b850 2a 2a 20 74 61 62 6c 65 20 74 6f 20 70 61 72 73  ** table to pars
1b860 65 20 74 68 65 20 73 63 68 65 6d 61 2c 20 6f 72  e the schema, or
1b870 20 69 66 20 74 68 69 73 20 69 6e 64 65 78 20 69   if this index i
1b880 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  s the PRIMARY KE
1b890 59 20 69 6e 64 65 78 0a 20 20 2a 2a 20 6f 66 20  Y index.  ** of 
1b8a0 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
1b8b0 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  table..  **.  **
1b8c0 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20   If pTblName==0 
1b8d0 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e  it means this in
1b8e0 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64  dex is generated
1b8f0 20 61 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 50   as an implied P
1b900 52 49 4d 41 52 59 20 4b 45 59 0a 20 20 2a 2a 20  RIMARY KEY.  ** 
1b910 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20  or UNIQUE index 
1b920 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  in a CREATE TABL
1b930 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69  E statement.  Si
1b940 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  nce the table.  
1b950 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ** has just been
1b960 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e   created, it con
1b970 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e  tains no data an
1b980 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74  d the index init
1b990 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
1b9a0 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70  step can be skip
1b9b0 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  ped..  */.  else
1b9c0 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
1b9d0 61 62 29 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 21  ab) || pTblName!
1b9e0 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =0 ){.    Vdbe *
1b9f0 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  v;.    char *zSt
1ba00 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d  mt;.    int iMem
1ba10 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1ba20 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  m;..    v = sqli
1ba30 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1ba40 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
1ba50 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
1ba60 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20  ate_index;..    
1ba70 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
1ba80 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
1ba90 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 20 20 20  e, 1, iDb);..   
1baa0 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72   /* Create the r
1bab0 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20  ootpage for the 
1bac0 69 6e 64 65 78 20 75 73 69 6e 67 20 43 72 65 61  index using Crea
1bad0 74 65 49 6e 64 65 78 2e 20 42 75 74 20 62 65 66  teIndex. But bef
1bae0 6f 72 65 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67  ore.    ** doing
1baf0 20 73 6f 2c 20 63 6f 64 65 20 61 20 4e 6f 6f 70   so, code a Noop
1bb00 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64   instruction and
1bb10 20 73 74 6f 72 65 20 69 74 73 20 61 64 64 72 65   store its addre
1bb20 73 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 49 6e  ss in .    ** In
1bb30 64 65 78 2e 74 6e 75 6d 2e 20 54 68 69 73 20 69  dex.tnum. This i
1bb40 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63 61  s required in ca
1bb50 73 65 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  se this index is
1bb60 20 61 63 74 75 61 6c 6c 79 20 61 20 0a 20 20 20   actually a .   
1bb70 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
1bb80 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 69 73  and the table is
1bb90 20 61 63 74 75 61 6c 6c 79 20 61 20 57 49 54 48   actually a WITH
1bba0 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e  OUT ROWID table.
1bbb0 20 49 6e 20 0a 20 20 20 20 2a 2a 20 74 68 61 74   In .    ** that
1bbc0 20 63 61 73 65 20 74 68 65 20 63 6f 6e 76 65 72   case the conver
1bbd0 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54  tToWithoutRowidT
1bbe0 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 20 77  able() routine w
1bbf0 69 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20 20 20  ill replace.    
1bc00 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69 74 68  ** the Noop with
1bc10 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20   a Goto to jump 
1bc20 6f 76 65 72 20 74 68 65 20 56 44 42 45 20 63 6f  over the VDBE co
1bc30 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 65 6c  de generated bel
1bc40 6f 77 2e 20 2a 2f 0a 20 20 20 20 70 49 6e 64 65  ow. */.    pInde
1bc50 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65  x->tnum = sqlite
1bc60 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
1bc70 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 73 71 6c  P_Noop);.    sql
1bc80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1bc90 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  , OP_CreateIndex
1bca0 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20  , iDb, iMem);.. 
1bcb0 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65     /* Gather the
1bcc0 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
1bcd0 66 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44  f the CREATE IND
1bce0 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74  EX statement int
1bcf0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74  o.    ** the zSt
1bd00 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  mt variable.    
1bd10 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61 72  */.    if( pStar
1bd20 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t ){.      int n
1bd30 20 3d 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d   = (int)(pParse-
1bd40 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20  >sLastToken.z - 
1bd50 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72  pName->z) + pPar
1bd60 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e  se->sLastToken.n
1bd70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d  ;.      if( pNam
1bd80 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29  e->z[n-1]==';' )
1bd90 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a 20 41   n--;.      /* A
1bda0 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74   named index wit
1bdb0 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52  h an explicit CR
1bdc0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1bdd0 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ment */.      zS
1bde0 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
1bdf0 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54 45  intf(db, "CREATE
1be00 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a  %s INDEX %.*s",.
1be10 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d          onError=
1be20 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20  =OE_None ? "" : 
1be30 22 20 55 4e 49 51 55 45 22 2c 20 6e 2c 20 70 4e  " UNIQUE", n, pN
1be40 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c  ame->z);.    }el
1be50 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
1be60 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
1be70 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49  created by a PRI
1be80 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
1be90 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  UE constraint */
1bea0 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20  .      /* zStmt 
1beb0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
1bec0 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a  (""); */.      z
1bed0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Stmt = 0;.    }.
1bee0 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65  .    /* Add an e
1bef0 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d  ntry in sqlite_m
1bf00 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69  aster for this i
1bf10 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ndex.    */.    
1bf20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
1bf30 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
1bf40 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
1bf50 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69   %Q.%s VALUES('i
1bf60 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c  ndex',%Q,%Q,#%d,
1bf70 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64  %Q);",.        d
1bf80 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
1bf90 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
1bfa0 45 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  E,.        pInde
1bfb0 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  x->zName,.      
1bfc0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
1bfd0 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20         iMem,.   
1bfe0 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29       zStmt.    )
1bff0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1c000 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a  ree(db, zStmt);.
1c010 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65  .    /* Fill the
1c020 20 69 6e 64 65 78 20 77 69 74 68 20 64 61 74 61   index with data
1c030 20 61 6e 64 20 72 65 70 61 72 73 65 20 74 68 65   and reparse the
1c040 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e   schema. Code an
1c050 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a   OP_Expire.    *
1c060 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
1c070 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64  all pre-compiled
1c080 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20   statements..   
1c090 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c   */.    if( pTbl
1c0a0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Name ){.      sq
1c0b0 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
1c0c0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
1c0d0 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71   iMem);.      sq
1c0e0 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
1c0f0 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
1c100 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c110 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f  eAddParseSchemaO
1c120 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20  p(v, iDb,.      
1c130 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
1c140 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27  f(db, "name='%q'
1c150 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78   AND type='index
1c160 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  '", pIndex->zNam
1c170 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e));.      sqlit
1c180 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
1c190 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20 20 20 20  OP_Expire);.    
1c1a0 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  }..    sqlite3Vd
1c1b0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49  beJumpHere(v, pI
1c1c0 6e 64 65 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 7d  ndex->tnum);.  }
1c1d0 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69  ..  /* When addi
1c1e0 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74  ng an index to t
1c1f0 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63  he list of indic
1c200 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20  es for a table, 
1c210 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61  make.  ** sure a
1c220 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c  ll indices label
1c230 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f  ed OE_Replace co
1c240 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f  me after all tho
1c250 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20  se labeled.  ** 
1c260 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73  OE_Ignore.  This
1c270 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
1c280 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f  r the correct co
1c290 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a 20  nstraint check. 
1c2a0 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 28   ** processing (
1c2b0 69 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  in sqlite3Genera
1c2c0 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63  teConstraintChec
1c2d0 6b 73 28 29 29 20 61 73 20 70 61 72 74 20 6f 66  ks()) as part of
1c2e0 0a 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e 64  .  ** UPDATE and
1c2f0 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
1c300 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28  ts.  .  */.  if(
1c310 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c   db->init.busy |
1c320 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b  | pTblName==0 ){
1c330 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72  .    if( onError
1c340 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20  !=OE_Replace || 
1c350 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a  pTab->pIndex==0.
1c360 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62           || pTab
1c370 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ->pIndex->onErro
1c380 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a  r==OE_Replace){.
1c390 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
1c3a0 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  ext = pTab->pInd
1c3b0 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  ex;.      pTab->
1c3c0 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b  pIndex = pIndex;
1c3d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c3e0 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20    Index *pOther 
1c3f0 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
1c400 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74        while( pOt
1c410 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f  her->pNext && pO
1c420 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45  ther->pNext->onE
1c430 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
1c440 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68   ){.        pOth
1c450 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  er = pOther->pNe
1c460 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
1c470 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
1c480 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
1c490 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70  .      pOther->p
1c4a0 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20  Next = pIndex;. 
1c4b0 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20     }.    pIndex 
1c4c0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
1c4d0 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65  lean up before e
1c4e0 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63  xiting */.exit_c
1c4f0 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69  reate_index:.  i
1c500 66 28 20 70 49 6e 64 65 78 20 29 20 66 72 65 65  f( pIndex ) free
1c510 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
1c520 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1c530 44 65 6c 65 74 65 28 64 62 2c 20 70 50 49 57 68  Delete(db, pPIWh
1c540 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ere);.  sqlite3E
1c550 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
1c560 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  , pList);.  sqli
1c570 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1c580 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a  (db, pTblName);.
1c590 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1c5a0 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, zName);.}../
1c5b0 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e  *.** Fill the In
1c5c0 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61  dex.aiRowEst[] a
1c5d0 72 72 61 79 20 77 69 74 68 20 64 65 66 61 75 6c  rray with defaul
1c5e0 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  t information - 
1c5f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74  information.** t
1c600 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 77  o be used when w
1c610 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74  e have not run t
1c620 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  he ANALYZE comma
1c630 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45  nd..**.** aiRowE
1c640 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65  st[0] is suppose
1c650 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
1c660 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
1c670 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  nts in the index
1c680 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f  ..** Since we do
1c690 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73   not know, guess
1c6a0 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52   1 million.  aiR
1c6b0 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65  owEst[1] is an e
1c6c0 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a  stimate of the.*
1c6d0 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
1c6e0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68   in the table th
1c6f0 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72  at match any par
1c700 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66  ticular value of
1c710 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f   the.** first co
1c720 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
1c730 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20  x.  aiRowEst[2] 
1c740 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
1c750 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  f the number.** 
1c760 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74  of rows that mat
1c770 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  ch any particula
1c780 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  r combination of
1c790 20 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c   the first 2 col
1c7a0 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69  umns.** of the i
1c7b0 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f  ndex.  And so fo
1c7c0 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c  rth.  It must al
1c7d0 77 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65  ways be the case
1c7e0 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20   that.*.**      
1c7f0 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d       aiRowEst[N]
1c800 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a  <=aiRowEst[N-1].
1c810 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52  **           aiR
1c820 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a  owEst[N]>=1.**.*
1c830 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61  * Apart from tha
1c840 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c  t, we have littl
1c850 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64  e to go on besid
1c860 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20  es intuition as 
1c870 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45  to.** how aiRowE
1c880 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69  st[] should be i
1c890 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65  nitialized.  The
1c8a0 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74   numbers generat
1c8b0 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62  ed here.** are b
1c8c0 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20  ased on typical 
1c8d0 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20  values found in 
1c8e0 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a  actual indices..
1c8f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
1c900 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64  efaultRowEst(Ind
1c910 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20  ex *pIdx){.  /* 
1c920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
1c930 30 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c 20 20  0,  9,  8,  7,  
1c940 36 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56  6 */.  LogEst aV
1c950 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c  al[] = { 33, 32,
1c960 20 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20   30, 28, 26 };. 
1c970 20 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70 49 64   LogEst *a = pId
1c980 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a  x->aiRowLogEst;.
1c990 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49    int nCopy = MI
1c9a0 4e 28 41 72 72 61 79 53 69 7a 65 28 61 56 61 6c  N(ArraySize(aVal
1c9b0 29 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  ), pIdx->nKeyCol
1c9c0 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  );.  int i;..  /
1c9d0 2a 20 49 6e 64 65 78 65 73 20 77 69 74 68 20 64  * Indexes with d
1c9e0 65 66 61 75 6c 74 20 72 6f 77 20 65 73 74 69 6d  efault row estim
1c9f0 61 74 65 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20  ates should not 
1ca00 68 61 76 65 20 73 74 61 74 31 20 64 61 74 61 20  have stat1 data 
1ca10 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 49  */.  assert( !pI
1ca20 64 78 2d 3e 68 61 73 53 74 61 74 31 20 29 3b 0a  dx->hasStat1 );.
1ca30 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69  .  /* Set the fi
1ca40 72 73 74 20 65 6e 74 72 79 20 28 6e 75 6d 62 65  rst entry (numbe
1ca50 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
1ca60 20 69 6e 64 65 78 29 20 74 6f 20 74 68 65 20 65   index) to the e
1ca70 73 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e  stimated .  ** n
1ca80 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1ca90 20 74 68 65 20 74 61 62 6c 65 2c 20 6f 72 20 68   the table, or h
1caa0 61 6c 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  alf the number o
1cab0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
1cac0 62 6c 65 0a 20 20 2a 2a 20 66 6f 72 20 61 20 70  ble.  ** for a p
1cad0 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 20 20 20  artial index.   
1cae0 42 75 74 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74  But do not let t
1caf0 68 65 20 65 73 74 69 6d 61 74 65 20 64 72 6f 70  he estimate drop
1cb00 20 62 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a 20 20   below 10. */.  
1cb10 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61  a[0] = pIdx->pTa
1cb20 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b  ble->nRowLogEst;
1cb30 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61  .  if( pIdx->pPa
1cb40 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 29 20  rtIdxWhere!=0 ) 
1cb50 61 5b 30 5d 20 2d 3d 20 31 30 3b 20 20 61 73 73  a[0] -= 10;  ass
1cb60 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33  ert( 10==sqlite3
1cb70 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 69  LogEst(2) );.  i
1cb80 66 28 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30  f( a[0]<33 ) a[0
1cb90 5d 20 3d 20 33 33 3b 20 20 20 20 20 20 20 20 20  ] = 33;         
1cba0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1cbb0 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   33==sqlite3LogE
1cbc0 73 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  st(10) );..  /* 
1cbd0 45 73 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b  Estimate that a[
1cbe0 31 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69  1] is 10, a[2] i
1cbf0 73 20 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20  s 9, a[3] is 8, 
1cc00 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20  a[4] is 7, a[5] 
1cc10 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61  is.  ** 6 and ea
1cc20 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 76 61  ch subsequent va
1cc30 6c 75 65 20 28 69 66 20 61 6e 79 29 20 69 73 20  lue (if any) is 
1cc40 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  5.  */.  memcpy(
1cc50 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f  &a[1], aVal, nCo
1cc60 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74  py*sizeof(LogEst
1cc70 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70  ));.  for(i=nCop
1cc80 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b  y+1; i<=pIdx->nK
1cc90 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  eyCol; i++){.   
1cca0 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20   a[i] = 23;     
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1ccc0 73 73 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74  ssert( 23==sqlit
1ccd0 65 33 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20  e3LogEst(5) );. 
1cce0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d   }..  assert( 0=
1ccf0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
1cd00 29 20 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69  ) );.  if( IsUni
1cd10 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29  queIndex(pIdx) )
1cd20 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   a[pIdx->nKeyCol
1cd30 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = 0;.}../*.** 
1cd40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
1cd50 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69  l drop an existi
1cd60 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20  ng named index. 
1cd70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
1cd80 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
1cd90 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65  DROP INDEX state
1cda0 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
1cdb0 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50  lite3DropIndex(P
1cdc0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
1cdd0 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
1cde0 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49  t ifExists){.  I
1cdf0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
1ce00 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
1ce10 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1ce20 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
1ce30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1ce40 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20  e->nErr==0 );   
1ce50 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20  /* Never called 
1ce60 77 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72  with prior error
1ce70 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d  s */.  if( db->m
1ce80 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1ce90 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1cea0 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61  p_index;.  }.  a
1ceb0 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
1cec0 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53  rc==1 );.  if( S
1ced0 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
1cee0 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
1cef0 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  se) ){.    goto 
1cf00 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1cf10 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
1cf20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
1cf30 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  (db, pName->a[0]
1cf40 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
1cf50 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
1cf60 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
1cf70 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78  ){.    if( !ifEx
1cf80 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71  ists ){.      sq
1cf90 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1cfa0 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
1cfb0 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65  ndex: %S", pName
1cfc0 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1cfd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
1cfe0 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68  deVerifyNamedSch
1cff0 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ema(pParse, pNam
1d000 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
1d010 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  e);.    }.    pP
1d020 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
1d030 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  a = 1;.    goto 
1d040 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1d050 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
1d060 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49  x->idxType!=SQLI
1d070 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45  TE_IDXTYPE_APPDE
1d080 46 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  F ){.    sqlite3
1d090 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1d0a0 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74   "index associat
1d0b0 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22  ed with UNIQUE "
1d0c0 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41  .      "or PRIMA
1d0d0 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
1d0e0 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  t cannot be drop
1d0f0 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f  ped", 0);.    go
1d100 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1d110 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  ex;.  }.  iDb = 
1d120 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
1d130 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d  ndex(db, pIndex-
1d140 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64  >pSchema);.#ifnd
1d150 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1d160 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
1d170 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20  .    int code = 
1d180 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45  SQLITE_DROP_INDE
1d190 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  X;.    Table *pT
1d1a0 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
1d1b0 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ble;.    const c
1d1c0 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
1d1d0 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
1d1e0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1d1f0 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
1d200 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
1d210 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1d220 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1d230 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
1d240 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
1d250 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1d260 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  p_index;.    }. 
1d270 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
1d280 50 44 42 20 26 26 20 69 44 62 20 29 20 63 6f 64  PDB && iDb ) cod
1d290 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
1d2a0 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
1d2b0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1d2c0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
1d2d0 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  e, pIndex->zName
1d2e0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
1d2f0 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
1d300 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1d310 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
1d320 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
1d330 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
1d340 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  e the index and 
1d350 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
1d360 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73  table */.  v = s
1d370 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1d380 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
1d390 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
1d3a0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
1d3b0 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
1d3c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  ;.    sqlite3Nes
1d3d0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
1d3e0 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20  .       "DELETE 
1d3f0 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
1d400 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79 70   name=%Q AND typ
1d410 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20 20 20  e='index'",.    
1d420 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
1d430 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52  zDbSName, MASTER
1d440 5f 4e 41 4d 45 2c 20 70 49 6e 64 65 78 2d 3e 7a  _NAME, pIndex->z
1d450 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Name.    );.    
1d460 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74  sqlite3ClearStat
1d470 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69  Tables(pParse, i
1d480 44 62 2c 20 22 69 64 78 22 2c 20 70 49 6e 64 65  Db, "idx", pInde
1d490 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  x->zName);.    s
1d4a0 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
1d4b0 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
1d4c0 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  .    destroyRoot
1d4d0 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Page(pParse, pIn
1d4e0 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  dex->tnum, iDb);
1d4f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d500 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f  AddOp4(v, OP_Dro
1d510 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20  pIndex, iDb, 0, 
1d520 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  0, pIndex->zName
1d530 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  , 0);.  }..exit_
1d540 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71  drop_index:.  sq
1d550 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1d560 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d  te(db, pName);.}
1d570 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69  ../*.** pArray i
1d580 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
1d590 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63  n array of objec
1d5a0 74 73 2e 20 45 61 63 68 20 6f 62 6a 65 63 74 20  ts. Each object 
1d5b0 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20  in the.** array 
1d5c0 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73  is szEntry bytes
1d5d0 20 69 6e 20 73 69 7a 65 2e 20 54 68 69 73 20 72   in size. This r
1d5e0 6f 75 74 69 6e 65 20 75 73 65 73 20 73 71 6c 69  outine uses sqli
1d5f0 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a  te3DbRealloc().*
1d600 2a 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20  * to extend the 
1d610 61 72 72 61 79 20 73 6f 20 74 68 61 74 20 74 68  array so that th
1d620 65 72 65 20 69 73 20 73 70 61 63 65 20 66 6f 72  ere is space for
1d630 20 61 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 74   a new object at
1d640 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20   the end..**.** 
1d650 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
1d660 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70  on is called, *p
1d670 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73 20  nEntry contains 
1d680 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
1d690 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72 72 61 79   of.** the array
1d6a0 20 28 69 6e 20 65 6e 74 72 69 65 73 20 2d 20 73   (in entries - s
1d6b0 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  o the allocation
1d6c0 20 69 73 20 28 28 2a 70 6e 45 6e 74 72 79 29 20   is ((*pnEntry) 
1d6d0 2a 20 73 7a 45 6e 74 72 79 29 20 62 79 74 65 73  * szEntry) bytes
1d6e0 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a  .** in total)..*
1d6f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 61 6c  *.** If the real
1d700 6c 6f 63 28 29 20 69 73 20 73 75 63 63 65 73 73  loc() is success
1d710 66 75 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20  ful (i.e. if no 
1d720 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63  OOM condition oc
1d730 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70  curs), the.** sp
1d740 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
1d750 72 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  r the new object
1d760 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45   is zeroed, *pnE
1d770 6e 74 72 79 20 75 70 64 61 74 65 64 20 74 6f 0a  ntry updated to.
1d780 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e  ** reflect the n
1d790 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  ew size of the a
1d7a0 72 72 61 79 20 61 6e 64 20 61 20 70 6f 69 6e 74  rray and a point
1d7b0 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 61 6c  er to the new al
1d7c0 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75  location.** retu
1d7d0 72 6e 65 64 2e 20 2a 70 49 64 78 20 69 73 20 73  rned. *pIdx is s
1d7e0 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
1d7f0 6f 66 20 74 68 65 20 6e 65 77 20 61 72 72 61 79  of the new array
1d800 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20 63   entry in this c
1d810 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ase..**.** Other
1d820 77 69 73 65 2c 20 69 66 20 74 68 65 20 72 65 61  wise, if the rea
1d830 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a 70  lloc() fails, *p
1d840 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 2d 31  Idx is set to -1
1d850 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61 69  , *pnEntry remai
1d860 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  ns.** unchanged 
1d870 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 70 41  and a copy of pA
1d880 72 72 61 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a  rray returned..*
1d890 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 41  /.void *sqlite3A
1d8a0 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
1d8b0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1d8c0 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1d8d0 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c  to notify of mal
1d8e0 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a  loc failures */.
1d8f0 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c 20    void *pArray, 
1d900 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
1d910 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74 20  objects.  Might 
1d920 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a  be reallocated *
1d930 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c  /.  int szEntry,
1d940 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1d950 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20   each object in 
1d960 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  the array */.  i
1d970 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20  nt *pnEntry,    
1d980 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62   /* Number of ob
1d990 6a 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20  jects currently 
1d9a0 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  in use */.  int 
1d9b0 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a  *pIdx         /*
1d9c0 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65 78   Write the index
1d9d0 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68   of a new slot h
1d9e0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ere */.){.  char
1d9f0 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 2a   *z;.  int n = *
1da00 70 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28 20 28  pnEntry;.  if( (
1da10 6e 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b  n & (n-1))==0 ){
1da20 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 28 6e  .    int sz = (n
1da30 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a  ==0) ? 1 : 2*n;.
1da40 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d      void *pNew =
1da50 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
1da60 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20 73 7a  c(db, pArray, sz
1da70 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69  *szEntry);.    i
1da80 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1da90 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a      *pIdx = -1;.
1daa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 72        return pAr
1dab0 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ray;.    }.    p
1dac0 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20  Array = pNew;.  
1dad0 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70  }.  z = (char*)p
1dae0 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28  Array;.  memset(
1daf0 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c  &z[n * szEntry],
1db00 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20   0, szEntry);.  
1db10 2a 70 49 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a  *pIdx = n;.  ++*
1db20 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72  pnEntry;.  retur
1db30 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a  n pArray;.}../*.
1db40 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
1db50 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67  element to the g
1db60 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72  iven IdList.  Cr
1db70 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73  eate a new IdLis
1db80 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
1db90 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c  .**.** A new IdL
1dba0 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
1dbb0 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c   or NULL if mall
1dbc0 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49  oc() fails..*/.I
1dbd0 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64  dList *sqlite3Id
1dbe0 4c 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74  ListAppend(sqlit
1dbf0 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a  e3 *db, IdList *
1dc00 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
1dc10 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  oken){.  int i;.
1dc20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1dc30 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
1dc40 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
1dc50 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c  o(db, sizeof(IdL
1dc60 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
1dc70 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1dc80 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
1dc90 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72  ->a = sqlite3Arr
1dca0 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
1dcb0 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73    db,.      pLis
1dcc0 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65  t->a,.      size
1dcd0 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c  of(pList->a[0]),
1dce0 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e  .      &pList->n
1dcf0 49 64 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29  Id,.      &i.  )
1dd00 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20  ;.  if( i<0 ){. 
1dd10 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
1dd20 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
1dd30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
1dd40 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b  .  }.  pList->a[
1dd50 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
1dd60 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1dd70 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72  db, pToken);.  r
1dd80 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
1dd90 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
1dda0 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
1ddb0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
1ddc0 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
1ddd0 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b   IdList *pList){
1dde0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1ddf0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1de00 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
1de10 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
1de20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
1de30 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
1de40 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
1de50 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1de60 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  db, pList->a);. 
1de70 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
1de80 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
1de90 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1dea0 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20   index in pList 
1deb0 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  of the identifie
1dec0 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65  r named zId.  Re
1ded0 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f  turn -1.** if no
1dee0 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  t found..*/.int 
1def0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
1df00 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  ex(IdList *pList
1df10 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
1df20 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ame){.  int i;. 
1df30 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1df40 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72  return -1;.  for
1df50 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1df60 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Id; i++){.    if
1df70 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1df80 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
1df90 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  me, zName)==0 ) 
1dfa0 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
1dfb0 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
1dfc0 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20 73  .** Expand the s
1dfd0 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
1dfe0 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 72 63  or the given Src
1dff0 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a  List object by.*
1e000 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74 72  * creating nExtr
1e010 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67 69  a new slots begi
1e020 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74 2e  nning at iStart.
1e030 20 20 69 53 74 61 72 74 20 69 73 20 7a 65 72 6f    iStart is zero
1e040 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73   based..** New s
1e050 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64 2e  lots are zeroed.
1e060 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1e070 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53 72  le, suppose a Sr
1e080 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20  cList initially 
1e090 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e 74  contains two ent
1e0a0 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f  ries: A,B..** To
1e0b0 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65 6e   append 3 new en
1e0c0 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20 65  tries onto the e
1e0d0 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a  nd, do this:.**.
1e0e0 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63  **    sqlite3Src
1e0f0 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20  ListEnlarge(db, 
1e100 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b  pSrclist, 3, 2);
1e110 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  .**.** After the
1e120 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20 77   call above it w
1e130 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41  ould contain:  A
1e140 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e  , B, nil, nil, n
1e150 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 53  il..** If the iS
1e160 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68 61  tart argument ha
1e170 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61 64  d been 1 instead
1e180 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65 20   of 2, then the 
1e190 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20  result.** would 
1e1a0 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e  have been:  A, n
1e1b0 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e  il, nil, nil, B.
1e1c0 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68 65    To prepend the
1e1d0 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74   new slots,.** t
1e1e0 68 65 20 69 53 74 61 72 74 20 76 61 6c 75 65 20  he iStart value 
1e1f0 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65  would be 0.  The
1e200 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f 75   result then wou
1e210 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e  ld.** be: nil, n
1e220 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a  il, nil, A, B..*
1e230 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
1e240 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
1e250 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69 73  s the SrcList is
1e260 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 65   unchanged.  The
1e270 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  .** db->mallocFa
1e280 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20 62  iled flag will b
1e290 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a  e set to true..*
1e2a0 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
1e2b0 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
1e2c0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1e2d0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1e2e0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  se connection to
1e2f0 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65   notify of OOM e
1e300 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69  rrors */.  SrcLi
1e310 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a  st *pSrc,     /*
1e320 20 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f 20   The SrcList to 
1e330 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20  be enlarged */. 
1e340 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
1e350 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e360 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61 64   new slots to ad
1e370 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a  d to pSrc->a[] *
1e380 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20 20  /.  int iStart  
1e390 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1e3a0 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  in pSrc->a[] of 
1e3b0 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a  first new slot *
1e3c0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  /.){.  int i;.. 
1e3d0 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
1e3e0 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70  ing on calling p
1e3f0 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61  arameters */.  a
1e400 73 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 30  ssert( iStart>=0
1e410 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45   );.  assert( nE
1e420 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73  xtra>=1 );.  ass
1e430 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a  ert( pSrc!=0 );.
1e440 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74    assert( iStart
1e450 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a  <=pSrc->nSrc );.
1e460 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
1e470 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65 20  dditional space 
1e480 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69  if needed */.  i
1e490 66 28 20 28 75 33 32 29 70 53 72 63 2d 3e 6e 53  f( (u32)pSrc->nS
1e4a0 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e  rc+nExtra>pSrc->
1e4b0 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72  nAlloc ){.    Sr
1e4c0 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20  cList *pNew;.   
1e4d0 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53   int nAlloc = pS
1e4e0 72 63 2d 3e 6e 53 72 63 2a 32 2b 6e 45 78 74 72  rc->nSrc*2+nExtr
1e4f0 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b  a;.    int nGot;
1e500 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
1e510 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
1e520 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20   pSrc,.         
1e530 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53        sizeof(*pS
1e540 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29  rc) + (nAlloc-1)
1e550 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b  *sizeof(pSrc->a[
1e560 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  0]) );.    if( p
1e570 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1e580 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
1e590 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1e5a0 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20    return pSrc;. 
1e5b0 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20     }.    pSrc = 
1e5c0 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d  pNew;.    nGot =
1e5d0 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f   (sqlite3DbMallo
1e5e0 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20  cSize(db, pNew) 
1e5f0 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29  - sizeof(*pSrc))
1e600 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b  /sizeof(pSrc->a[
1e610 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d  0])+1;.    pSrc-
1e620 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74 3b 0a  >nAlloc = nGot;.
1e630 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65    }..  /* Move e
1e640 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74 68  xisting slots th
1e650 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68  at come after th
1e660 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64  e newly inserted
1e670 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20   slots.  ** out 
1e680 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20  of the way */.  
1e690 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
1e6a0 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20 69  -1; i>=iStart; i
1e6b0 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61  --){.    pSrc->a
1e6c0 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53 72  [i+nExtra] = pSr
1e6d0 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70  c->a[i];.  }.  p
1e6e0 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45 78  Src->nSrc += nEx
1e6f0 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20  tra;..  /* Zero 
1e700 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61  the newly alloca
1e710 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d  ted slots */.  m
1e720 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b 69  emset(&pSrc->a[i
1e730 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f  Start], 0, sizeo
1e740 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45  f(pSrc->a[0])*nE
1e750 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69  xtra);.  for(i=i
1e760 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74 2b  Start; i<iStart+
1e770 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20  nExtra; i++){.  
1e780 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75    pSrc->a[i].iCu
1e790 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  rsor = -1;.  }..
1e7a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f    /* Return a po
1e7b0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e 6c  inter to the enl
1e7c0 61 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a 2f  arged SrcList */
1e7d0 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a  .  return pSrc;.
1e7e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  }.../*.** Append
1e7f0 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d   a new table nam
1e800 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53  e to the given S
1e810 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  rcList.  Create 
1e820 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66  a new SrcList if
1e830 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20  .** need be.  A 
1e840 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65  new entry is cre
1e850 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c  ated in the SrcL
1e860 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 61 62  ist even if pTab
1e870 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  le is NULL..**.*
1e880 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73 20 72  * A SrcList is r
1e890 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
1e8a0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
1e8b0 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68 65 20  OOM error.  The 
1e8c0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c  returned.** SrcL
1e8d0 69 73 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ist might be the
1e8e0 20 73 61 6d 65 20 61 73 20 74 68 65 20 53 72 63   same as the Src
1e8f0 4c 69 73 74 20 74 68 61 74 20 77 61 73 20 69 6e  List that was in
1e900 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20  put or it might 
1e910 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e  be.** a new one.
1e920 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f    If an OOM erro
1e930 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74  r does occurs, t
1e940 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61  hen the prior va
1e950 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20  lue of pList.** 
1e960 74 68 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f  that is input to
1e970 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1e980 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66   automatically f
1e990 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  reed..**.** If p
1e9a0 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  Database is not 
1e9b0 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  null, it means t
1e9c0 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61  hat the table ha
1e9d0 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a  s an optional.**
1e9e0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70   database name p
1e9f0 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69  refix.  Like thi
1ea00 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61  s:  "database.ta
1ea10 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61  ble".  The pData
1ea20 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  base.** points t
1ea30 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  o the table name
1ea40 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20   and the pTable 
1ea50 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61  points to the da
1ea60 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20  tabase name..** 
1ea70 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  The SrcList.a[].
1ea80 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66  zName field is f
1ea90 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74  illed with the t
1eaa0 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20  able name which 
1eab0 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72  might.** come fr
1eac0 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44  om pTable (if pD
1ead0 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29  atabase is NULL)
1eae0 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61   or from pDataba
1eaf0 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74  se.  .** SrcList
1eb00 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69  .a[].zDatabase i
1eb10 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
1eb20 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
1eb30 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20  from pTable,.** 
1eb40 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20  or with NULL if 
1eb50 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73  no database is s
1eb60 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
1eb70 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1eb80 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69  if call like thi
1eb90 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
1eba0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1ebb0 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a  ppend(D,A,B,0);.
1ebc0 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20  **.** Then B is 
1ebd0 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  a table name and
1ebe0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1ebf0 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65  me is unspecifie
1ec00 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a  d.  If called.**
1ec10 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1ec20 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
1ec30 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
1ec40 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54  ,A,B,C);.**.** T
1ec50 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62  hen C is the tab
1ec60 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73  le name and B is
1ec70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1ec80 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64 65 66  me.  If C is def
1ec90 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20  ined.** then so 
1eca0 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72 20  is B.  In other 
1ecb0 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72 20  words, we never 
1ecc0 68 61 76 65 20 61 20 63 61 73 65 20 77 68 65 72  have a case wher
1ecd0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
1ece0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1ecf0 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a  ppend(D,A,0,C);.
1ed00 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c  **.** Both pTabl
1ed10 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 20  e and pDatabase 
1ed20 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62  are assumed to b
1ed30 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79 20  e quoted.  They 
1ed40 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20  are dequoted.** 
1ed50 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64 64  before being add
1ed60 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73  ed to the SrcLis
1ed70 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  t..*/.SrcList *s
1ed80 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1ed90 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  end(.  sqlite3 *
1eda0 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  db,        /* Co
1edb0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
1edc0 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69  fy of malloc fai
1edd0 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69  lures */.  SrcLi
1ede0 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
1edf0 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73  * Append to this
1ee00 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63   SrcList. NULL c
1ee10 72 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63  reates a new Src
1ee20 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  List */.  Token 
1ee30 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a  *pTable,      /*
1ee40 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64   Table to append
1ee50 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
1ee60 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74  tabase    /* Dat
1ee70 61 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62  abase of the tab
1ee80 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  le */.){.  struc
1ee90 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1eea0 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28  pItem;.  assert(
1eeb0 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c   pDatabase==0 ||
1eec0 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f   pTable!=0 );  /
1eed0 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 43 20  * Cannot have C 
1eee0 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20 61  without B */.  a
1eef0 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
1ef00 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1ef10 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
1ef20 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1ef30 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72  NN(db, sizeof(Sr
1ef40 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  cList) );.    if
1ef50 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1ef60 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
1ef70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20  ->nAlloc = 1;.  
1ef80 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 3d 20    pList->nSrc = 
1ef90 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70  1;.    memset(&p
1efa0 4c 69 73 74 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73  List->a[0], 0, s
1efb0 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
1efc0 5d 29 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  ]));.    pList->
1efd0 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d  a[0].iCursor = -
1efe0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
1eff0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 53  pList = sqlite3S
1f000 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
1f010 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69 73  , pList, 1, pLis
1f020 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 7d 0a 20 20  t->nSrc);.  }.  
1f030 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1f040 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
1f050 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1f060 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
1f070 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1f080 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
1f090 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  >a[pList->nSrc-1
1f0a0 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61  ];.  if( pDataba
1f0b0 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d  se && pDatabase-
1f0c0 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61  >z==0 ){.    pDa
1f0d0 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
1f0e0 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
1f0f0 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  ){.    Token *pT
1f100 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b  emp = pDatabase;
1f110 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
1f120 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61   pTable;.    pTa
1f130 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d  ble = pTemp;.  }
1f140 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  .  pItem->zName 
1f150 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1f160 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c  mToken(db, pTabl
1f170 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61  e);.  pItem->zDa
1f180 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
1f190 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1f1a0 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  , pDatabase);.  
1f1b0 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
1f1c0 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64  ./*.** Assign Vd
1f1d0 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20 6e  beCursor index n
1f1e0 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74 61  umbers to all ta
1f1f0 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73  bles in a SrcLis
1f200 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
1f210 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
1f220 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61  rsors(Parse *pPa
1f230 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  rse, SrcList *pL
1f240 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
1f250 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1f260 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61  item *pItem;.  a
1f270 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70  ssert(pList || p
1f280 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1f290 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
1f2a0 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
1f2b0 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(i=0, pItem=pLi
1f2c0 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
1f2d0 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
1f2e0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1f2f0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30  Item->iCursor>=0
1f300 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1f310 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  pItem->iCursor =
1f320 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
1f330 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1f340 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
1f350 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
1f360 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
1f370 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
1f380 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a  pSelect->pSrc);.
1f390 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f3a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
1f3b0 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c  e an entire SrcL
1f3c0 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  ist including al
1f3d0 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75  l its substructu
1f3e0 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
1f3f0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1f400 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
1f410 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
1f420 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1f430 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1f440 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
1f450 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1f460 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
1f470 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
1f480 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
1f490 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
1f4a0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1f4b0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
1f4c0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1f4d0 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
1f4e0 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
1f4f0 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
1f500 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
1f510 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
1f520 49 6e 64 65 78 65 64 42 79 20 29 20 73 71 6c 69  IndexedBy ) sqli
1f530 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1f540 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  tem->u1.zIndexed
1f550 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  By);.    if( pIt
1f560 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
1f570 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   ) sqlite3ExprLi
1f580 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  stDelete(db, pIt
1f590 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29  em->u1.pFuncArg)
1f5a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
1f5b0 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 49 74  eteTable(db, pIt
1f5c0 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73  em->pTab);.    s
1f5d0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
1f5e0 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53  te(db, pItem->pS
1f5f0 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69  elect);.    sqli
1f600 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1f610 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20  , pItem->pOn);. 
1f620 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
1f630 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
1f640 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20  ->pUsing);.  }. 
1f650 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
1f660 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
1f670 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1f680 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
1f690 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61 64  the parser to ad
1f6a0 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20  d a new term to 
1f6b0 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20  the.** end of a 
1f6c0 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61  growing FROM cla
1f6d0 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70 61  use.  The "p" pa
1f6e0 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 70  rameter is the p
1f6f0 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52  art of.** the FR
1f700 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20 68  OM clause that h
1f710 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1f720 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70  constructed.  "p
1f730 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  " is NULL.** if 
1f740 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1f750 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52  t term of the FR
1f760 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62  OM clause.  pTab
1f770 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65  le and pDatabase
1f780 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65  .** are the name
1f790 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e   of the table an
1f7a0 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  d database named
1f7b0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1f7c0 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61  use term..** pDa
1f7d0 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69  tabase is NULL i
1f7e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  f the database n
1f7f0 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69 73  ame qualifier is
1f800 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a   missing - the.*
1f810 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49  * usual case.  I
1f820 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20 61  f the term has a
1f830 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41  n alias, then pA
1f840 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74  lias points to t
1f850 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65  he.** alias toke
1f860 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20  n.  If the term 
1f870 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74  is a subquery, t
1f880 68 65 6e 20 70 53 75 62 71 75 65 72 79 20 69 73  hen pSubquery is
1f890 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73   the.** SELECT s
1f8a0 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68  tatement that th
1f8b0 65 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64  e subquery encod
1f8c0 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20  es.  The pTable 
1f8d0 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  and.** pDatabase
1f8e0 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
1f8f0 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72  NULL for subquer
1f900 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e  ies.  The pOn an
1f910 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61  d pUsing.** para
1f920 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20 63  meters are the c
1f930 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e  ontent of the ON
1f940 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
1f950 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  es..**.** Return
1f960 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77   a new SrcList w
1f970 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20  hich encodes is 
1f980 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68  the FROM with th
1f990 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64  e new.** term ad
1f9a0 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ded..*/.SrcList 
1f9b0 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
1f9c0 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20  ppendFromTerm(. 
1f9d0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1f9e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1f9f0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1fa00 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20   SrcList *p,    
1fa10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1fa20 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74 68 65  left part of the
1fa30 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72   FROM clause alr
1fa40 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54  eady seen */.  T
1fa50 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20  oken *pTable,   
1fa60 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1fa70 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61  f the table to a
1fa80 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63  dd to the FROM c
1fa90 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  lause */.  Token
1faa0 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20 20   *pDatabase,    
1fab0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1fac0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
1fad0 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a  ining pTable */.
1fae0 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c    Token *pAlias,
1faf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1fb00 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
1fb10 20 6f 66 20 74 68 65 20 41 53 20 73 75 62 65 78   of the AS subex
1fb20 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65  pression */.  Se
1fb30 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c  lect *pSubquery,
1fb40 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75        /* A subqu
1fb50 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63  ery used in plac
1fb60 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d  e of a table nam
1fb70 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e  e */.  Expr *pOn
1fb80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1fb90 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  * The ON clause 
1fba0 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49  of a join */.  I
1fbb0 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20  dList *pUsing   
1fbc0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53         /* The US
1fbd0 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ING clause of a 
1fbe0 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  join */.){.  str
1fbf0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1fc00 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
1fc10 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1fc20 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26  >db;.  if( !p &&
1fc30 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29   (pOn || pUsing)
1fc40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1fc50 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1fc60 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69  "a JOIN clause i
1fc70 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  s required befor
1fc80 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70  e %s", .      (p
1fc90 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49  On ? "ON" : "USI
1fca0 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  NG").    );.    
1fcb0 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d  goto append_from
1fcc0 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20  _error;.  }.  p 
1fcd0 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1fce0 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54  Append(db, p, pT
1fcf0 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29  able, pDatabase)
1fd00 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
1fd10 4e 45 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30  NEVER(p->nSrc==0
1fd20 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70  ) ){.    goto ap
1fd30 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b  pend_from_error;
1fd40 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
1fd50 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
1fd60 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c 69 61  .  assert( pAlia
1fd70 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41  s!=0 );.  if( pA
1fd80 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70  lias->n ){.    p
1fd90 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
1fda0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1fdb0 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b  ken(db, pAlias);
1fdc0 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53  .  }.  pItem->pS
1fdd0 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65 72  elect = pSubquer
1fde0 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20  y;.  pItem->pOn 
1fdf0 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e  = pOn;.  pItem->
1fe00 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b  pUsing = pUsing;
1fe10 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61  .  return p;.. a
1fe20 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
1fe30 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  :.  assert( p==0
1fe40 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
1fe50 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29  rDelete(db, pOn)
1fe60 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
1fe70 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69  tDelete(db, pUsi
1fe80 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ng);.  sqlite3Se
1fe90 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1fea0 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74  Subquery);.  ret
1feb0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1fec0 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42  Add an INDEXED B
1fed0 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44  Y or NOT INDEXED
1fee0 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d   clause to the m
1fef0 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
1ff00 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f  ed .** element o
1ff10 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
1ff20 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
1ff30 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
1ff40 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ff50 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79  SrcListIndexedBy
1ff60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1ff70 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65  SrcList *p, Toke
1ff80 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a  n *pIndexedBy){.
1ff90 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
1ffa0 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28  edBy!=0 );.  if(
1ffb0 20 70 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e   p && ALWAYS(p->
1ffc0 6e 53 72 63 3e 30 29 20 29 7b 0a 20 20 20 20 73  nSrc>0) ){.    s
1ffd0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1ffe0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
1fff0 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
20000 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
20010 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  >fg.notIndexed==
20020 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
20030 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
20040 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20  exedBy==0 );.   
20050 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
20060 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20  fg.isTabFunc==0 
20070 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
20080 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21  xedBy->n==1 && !
20090 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b  pIndexedBy->z ){
200a0 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54  .      /* A "NOT
200b0 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65   INDEXED" clause
200c0 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53   was supplied. S
200d0 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20  ee parse.y .    
200e0 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22    ** construct "
200f0 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72  indexed_opt" for
20100 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20   details. */.   
20110 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74     pItem->fg.not
20120 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20  Indexed = 1;.   
20130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
20140 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  tem->u1.zIndexed
20150 42 79 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  By = sqlite3Name
20160 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
20170 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79  ->db, pIndexedBy
20180 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
20190 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 3d  fg.isIndexedBy =
201a0 20 28 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64   (pItem->u1.zInd
201b0 65 78 65 64 42 79 21 3d 30 29 3b 0a 20 20 20 20  exedBy!=0);.    
201c0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
201d0 64 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66  dd the list of f
201e0 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
201f0 73 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74  s to the SrcList
20200 20 65 6e 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20   entry for a.** 
20210 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e  table-valued-fun
20220 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
20230 71 6c 69 74 65 33 53 72 63 4c 69 73 74 46 75 6e  qlite3SrcListFun
20240 63 41 72 67 73 28 50 61 72 73 65 20 2a 70 50 61  cArgs(Parse *pPa
20250 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c  rse, SrcList *p,
20260 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
20270 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
20280 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
20290 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
202a0 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
202b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
202c0 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  em->fg.notIndexe
202d0 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
202e0 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
202f0 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a  IndexedBy==0 );.
20300 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
20310 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m->fg.isTabFunc=
20320 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  =0 );.    pItem-
20330 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 70  >u1.pFuncArg = p
20340 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d  List;.    pItem-
20350 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 3d 20  >fg.isTabFunc = 
20360 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
20370 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
20380 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
20390 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a  , pList);.  }.}.
203a0 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c  ./*.** When buil
203b0 64 69 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63  ding up a FROM c
203c0 6c 61 75 73 65 20 69 6e 20 74 68 65 20 70 61 72  lause in the par
203d0 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ser, the join op
203e0 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69  erator.** is ini
203f0 74 69 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20  tially attached 
20400 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  to the left oper
20410 61 6e 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f  and.  But the co
20420 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
20430 65 78 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e  expects the join
20440 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20   operator to be 
20450 6f 6e 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  on the right ope
20460 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74  rand.  This rout
20470 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c  ine.** Shifts al
20480 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73  l join operators
20490 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
204a0 67 68 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72  ght for an entir
204b0 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65  e FROM.** clause
204c0 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a  ..**.** Example:
204d0 20 53 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69   Suppose the joi
204e0 6e 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  n is like this:.
204f0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
20500 41 20 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20  A natural cross 
20510 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65  join B.**.** The
20520 20 6f 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61   operator is "na
20530 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e  tural cross join
20540 22 2e 20 20 54 68 65 20 41 20 61 6e 64 20 42 20  ".  The A and B 
20550 6f 70 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f  operands are sto
20560 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30  red.** in p->a[0
20570 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72  ] and p->a[1], r
20580 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68  espectively.  Th
20590 65 20 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c  e parser initial
205a0 6c 79 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a  ly stores the.**
205b0 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 41   operator with A
205c0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
205d0 73 68 69 66 74 73 20 74 68 61 74 20 6f 70 65 72  shifts that oper
205e0 61 74 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a  ator over to B..
205f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
20600 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54  rcListShiftJoinT
20610 79 70 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b  ype(SrcList *p){
20620 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
20630 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
20640 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b  =p->nSrc-1; i>0;
20650 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i--){.      p->
20660 61 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  a[i].fg.jointype
20670 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e   = p->a[i-1].fg.
20680 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a  jointype;.    }.
20690 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a      p->a[0].fg.j
206a0 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d  ointype = 0;.  }
206b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
206c0 74 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72  te VDBE code for
206d0 20 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65   a BEGIN stateme
206e0 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
206f0 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74  te3BeginTransact
20700 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
20710 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20  e, int type){.  
20720 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
20730 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b  dbe *v;.  int i;
20740 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
20750 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20  se!=0 );.  db = 
20760 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
20770 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
20780 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
20790 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
207a0 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
207b0 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29  , "BEGIN", 0, 0)
207c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
207d0 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65    }.  v = sqlite
207e0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
207f0 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74  ;.  if( !v ) ret
20800 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 3d  urn;.  if( type=
20810 3d 54 4b 5f 49 4d 4d 45 44 49 41 54 45 20 7c 7c  =TK_IMMEDIATE ||
20820 20 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53   type==TK_EXCLUS
20830 49 56 45 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  IVE ){.    for(i
20840 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
20850 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
20860 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20870 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
20880 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43  i, (type==TK_EXC
20890 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20  LUSIVE)+1);.    
208a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
208b0 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20  sBtree(v, i);.  
208c0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
208d0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
208e0 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c  P_AutoCommit, 0,
208f0 20 30 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 43 4f   0, (type==TK_CO
20900 4e 43 55 52 52 45 4e 54 29 29 3b 0a 7d 0a 0a 2f  NCURRENT));.}../
20910 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
20920 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20 43 4f  BE code for a CO
20930 4d 4d 49 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  MMIT statement..
20940 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
20950 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e  ommitTransaction
20960 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
20970 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
20980 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
20990 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
209a0 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  arse->db!=0 );. 
209b0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
209c0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
209d0 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
209e0 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
209f0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
20a00 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74  .  }.  v = sqlit
20a10 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
20a20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
20a30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20a40 4f 70 31 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  Op1(v, OP_AutoCo
20a50 6d 6d 69 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a  mmit, 1);.  }.}.
20a60 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
20a70 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20  VDBE code for a 
20a80 52 4f 4c 4c 42 41 43 4b 20 73 74 61 74 65 6d 65  ROLLBACK stateme
20a90 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
20aa0 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73  te3RollbackTrans
20ab0 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
20ac0 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
20ad0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
20ae0 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
20af0 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d  rt( pParse->db!=
20b00 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
20b10 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
20b20 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
20b30 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43  ACTION, "ROLLBAC
20b40 4b 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  K", 0, 0) ){.   
20b50 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76   return;.  }.  v
20b60 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
20b70 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
20b80 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
20b90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20ba0 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c  P_AutoCommit, 1,
20bb0 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   1);.  }.}../*.*
20bc0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
20bd0 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
20be0 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 74 20   parser when it 
20bf0 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64  parses a command
20c00 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72   to create,.** r
20c10 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
20c20 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f  ck an SQL savepo
20c30 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  int. .*/.void sq
20c40 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50  lite3Savepoint(P
20c50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
20c60 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  t op, Token *pNa
20c70 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  me){.  char *zNa
20c80 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
20c90 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
20ca0 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  ->db, pName);.  
20cb0 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
20cc0 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
20cd0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
20ce0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
20cf0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
20d00 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20  TION.    static 
20d10 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e  const char * con
20d20 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47  st az[] = { "BEG
20d30 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20  IN", "RELEASE", 
20d40 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20  "ROLLBACK" };.  
20d50 20 20 61 73 73 65 72 74 28 20 21 53 41 56 45 50    assert( !SAVEP
20d60 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41  OINT_BEGIN && SA
20d70 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d  VEPOINT_RELEASE=
20d80 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f  =1 && SAVEPOINT_
20d90 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23  ROLLBACK==2 );.#
20da0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21 76  endif.    if( !v
20db0 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43   || sqlite3AuthC
20dc0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
20dd0 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61  ITE_SAVEPOINT, a
20de0 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29  z[op], zName, 0)
20df0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
20e00 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
20e10 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
20e20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
20e30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20e40 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65  ddOp4(v, OP_Save
20e50 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c  point, op, 0, 0,
20e60 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d   zName, P4_DYNAM
20e70 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  IC);.  }.}../*.*
20e80 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
20e90 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73  TEMP database is
20ea0 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61   open and availa
20eb0 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65  ble for use.  Re
20ec0 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
20ed0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c  er of errors.  L
20ee0 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  eave any error m
20ef0 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70  essages in the p
20f00 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
20f10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
20f20 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
20f30 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
20f40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
20f50 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
20f60 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ( db->aDb[1].pBt
20f70 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ==0 && !pParse->
20f80 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69  explain ){.    i
20f90 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65  nt rc;.    Btree
20fa0 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74 69   *pBt;.    stati
20fb0 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67  c const int flag
20fc0 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53  s = .          S
20fd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
20fe0 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  RITE |.         
20ff0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
21000 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
21010 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
21020 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20  USIVE |.        
21030 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
21040 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20  LETEONCLOSE |.  
21050 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
21060 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20  PEN_TEMP_DB;..  
21070 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
21080 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73  reeOpen(db->pVfs
21090 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20 30  , 0, db, &pBt, 0
210a0 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
210b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
210c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
210d0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
210e0 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   "unable to open
210f0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74   a temporary dat
21100 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20  abase ".        
21110 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e  "file for storin
21120 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  g temporary tabl
21130 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72  es");.      pPar
21140 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20  se->rc = rc;.   
21150 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
21160 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31   }.    db->aDb[1
21170 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ].pBt = pBt;.   
21180 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
21190 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20  [1].pSchema );. 
211a0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f     if( SQLITE_NO
211b0 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  MEM==sqlite3Btre
211c0 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 42 74  eSetPageSize(pBt
211d0 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69  , db->nextPagesi
211e0 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20  ze, -1, 0) ){.  
211f0 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
21200 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72  ult(db);.      r
21210 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
21220 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
21230 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
21240 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
21250 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77   schema cookie w
21260 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 76  ill need to be v
21270 65 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20 64  erified.** for d
21280 61 74 61 62 61 73 65 20 69 44 62 2e 20 20 54 68  atabase iDb.  Th
21290 65 20 63 6f 64 65 20 74 6f 20 61 63 74 75 61 6c  e code to actual
212a0 6c 79 20 76 65 72 69 66 79 20 74 68 65 20 73 63  ly verify the sc
212b0 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77  hema cookie.** w
212c0 69 6c 6c 20 6f 63 63 75 72 20 61 74 20 74 68 65  ill occur at the
212d0 20 65 6e 64 20 6f 66 20 74 68 65 20 74 6f 70 2d   end of the top-
212e0 6c 65 76 65 6c 20 56 44 42 45 20 61 6e 64 20 77  level VDBE and w
212f0 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
21300 0a 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20 73 71  .** later, by sq
21310 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
21320 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  g()..*/.void sql
21330 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
21340 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
21350 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
21360 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
21370 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
21380 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
21390 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ..  assert( iDb>
213a0 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72 73 65  =0 && iDb<pParse
213b0 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  ->db->nDb );.  a
213c0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
213d0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21  b->aDb[iDb].pBt!
213e0 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a  =0 || iDb==1 );.
213f0 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 53 51    assert( iDb<SQ
21400 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
21410 44 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  D+2 );.  assert(
21420 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
21430 74 65 78 48 65 6c 64 28 70 50 61 72 73 65 2d 3e  texHeld(pParse->
21440 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
21450 20 69 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28   if( DbMaskTest(
21460 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69  pToplevel->cooki
21470 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20 29  eMask, iDb)==0 )
21480 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28  {.    DbMaskSet(
21490 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69  pToplevel->cooki
214a0 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 20  eMask, iDb);.   
214b0 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
214c0 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
214d0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
214e0 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f  TempDatabase(pTo
214f0 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  plevel);.    }. 
21500 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61   }.}../*.** If a
21510 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e  rgument zDb is N
21520 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73  ULL, then call s
21530 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
21540 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63  Schema() for eac
21550 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64  h .** attached d
21560 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69  atabase. Otherwi
21570 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f  se, invoke it fo
21580 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  r the database n
21590 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a  amed zDb only..*
215a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
215b0 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68  deVerifyNamedSch
215c0 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
215d0 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
215e0 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db){.  sqlite3 *
215f0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
21600 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
21610 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
21620 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44  i++){.    Db *pD
21630 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
21640 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
21650 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d  t && (!zDb || 0=
21660 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
21670 7a 44 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61  zDb, pDb->zDbSNa
21680 6d 65 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71  me)) ){.      sq
21690 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
216a0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29  chema(pParse, i)
216b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
216c0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
216d0 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65  BE code that pre
216e0 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20  pares for doing 
216f0 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61  an operation tha
21700 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67  t.** might chang
21710 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  e the database..
21720 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
21730 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20  ne starts a new 
21740 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77  transaction if w
21750 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64  e are not alread
21760 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72  y within.** a tr
21770 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77  ansaction.  If w
21780 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69  e are already wi
21790 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
217a0 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b  on, then a check
217b0 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20  point.** is set 
217c0 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d  if the setStatem
217d0 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  ent parameter is
217e0 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70   true.  A checkp
217f0 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  oint should.** b
21800 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74  e set for operat
21810 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20  ions that might 
21820 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63  fail (due to a c
21830 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20  onstraint) part 
21840 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68  of.** the way th
21850 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20  rough and which 
21860 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64  will need to und
21870 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69  o some writes wi
21880 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a  thout having to.
21890 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** rollback the 
218a0 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  whole transactio
218b0 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f  n.  For operatio
218c0 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e  ns where all con
218d0 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20  straints.** can 
218e0 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72  be checked befor
218f0 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72  e any changes ar
21900 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  e made to the da
21910 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65  tabase, it is ne
21920 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79  ver.** necessary
21930 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65   to undo a write
21940 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f   and the checkpo
21950 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  int should not b
21960 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  e set..*/.void s
21970 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
21980 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
21990 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74  *pParse, int set
219a0 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69  Statement, int i
219b0 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  Db){.  Parse *pT
219c0 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
219d0 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
219e0 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
219f0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
21a00 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
21a10 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70    DbMaskSet(pTop
21a20 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b  level->writeMask
21a30 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65  , iDb);.  pTople
21a40 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  vel->isMultiWrit
21a50 65 20 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e  e |= setStatemen
21a60 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69  t;.}../*.** Indi
21a70 63 61 74 65 20 74 68 61 74 20 74 68 65 20 73 74  cate that the st
21a80 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c  atement currentl
21a90 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
21aa0 74 69 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65  tion might write
21ab0 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  .** more than on
21ac0 65 20 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65  e entry (example
21ad0 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72  : deleting one r
21ae0 6f 77 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e  ow then insertin
21af0 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e  g another,.** in
21b00 73 65 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65  serting multiple
21b10 20 72 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65   rows in a table
21b20 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61  , or inserting a
21b30 20 72 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65   row and index e
21b40 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61  ntries.).** If a
21b50 6e 20 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61  n abort occurs a
21b60 66 74 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65  fter some of the
21b70 73 65 20 77 72 69 74 65 73 20 68 61 76 65 20 63  se writes have c
21b80 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69  ompleted, then i
21b90 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63  t will.** be nec
21ba0 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74  essary to undo t
21bb0 68 65 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69  he completed wri
21bc0 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tes..*/.void sql
21bd0 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50  ite3MultiWrite(P
21be0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
21bf0 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
21c00 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
21c10 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
21c20 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69  ;.  pToplevel->i
21c30 73 4d 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b  sMultiWrite = 1;
21c40 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63  .}../* .** The c
21c50 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61  ode generator ca
21c60 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
21c70 20 69 66 20 69 73 20 64 69 73 63 6f 76 65 72 73   if is discovers
21c80 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70   that it is.** p
21c90 6f 73 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74  ossible to abort
21ca0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69   a statement pri
21cb0 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  or to completion
21cc0 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a  .  In order to .
21cd0 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20  ** perform this 
21ce0 61 62 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f  abort without co
21cf0 72 72 75 70 74 69 6e 67 20 74 68 65 20 64 61 74  rrupting the dat
21d00 61 62 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74  abase, we need t
21d10 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74  o make.** sure t
21d20 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
21d30 74 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62  t is protected b
21d40 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  y a statement tr
21d50 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
21d60 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65   Technically, we
21d70 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65   only need to se
21d80 74 20 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66  t the mayAbort f
21d90 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73  lag if the.** is
21da0 4d 75 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20  MultiWrite flag 
21db0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73  was previously s
21dc0 65 74 2e 20 20 54 68 65 72 65 20 69 73 20 61 20  et.  There is a 
21dd0 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a  time dependency.
21de0 2a 2a 20 73 75 63 68 20 74 68 61 74 20 74 68 65  ** such that the
21df0 20 61 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75   abort must occu
21e00 72 20 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74  r after the mult
21e10 69 77 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61  iwrite.  This ma
21e20 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74  kes.** some stat
21e30 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67  ements involving
21e40 20 74 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e   the REPLACE con
21e50 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
21e60 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f   algorithm.** go
21e70 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72   a little faster
21e80 2e 20 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64  .  But taking ad
21e90 76 61 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20  vantage of this 
21ea0 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a  time dependency.
21eb0 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65  ** makes it more
21ec0 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72   difficult to pr
21ed0 6f 76 65 20 74 68 61 74 20 74 68 65 20 63 6f 64  ove that the cod
21ee0 65 20 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e  e is correct (in
21ef0 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c   .** particular,
21f00 20 69 74 20 70 72 65 76 65 6e 74 73 20 75 73 20   it prevents us 
21f10 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20  from writing an 
21f20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70  effective.** imp
21f30 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73  lementation of s
21f40 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
21f50 62 6f 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77  bort()) and so w
21f60 65 20 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a  e have chosen.**
21f70 20 74 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66   to take the saf
21f80 65 20 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70  e route and skip
21f90 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
21fa0 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
21fb0 65 33 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65  e3MayAbort(Parse
21fc0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72   *pParse){.  Par
21fd0 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
21fe0 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
21ff0 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
22000 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62  pToplevel->mayAb
22010 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ort = 1;.}../*.*
22020 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c  * Code an OP_Hal
22030 74 20 74 68 61 74 20 63 61 75 73 65 73 20 74 68  t that causes th
22040 65 20 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e  e vdbe to return
22050 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   an SQLITE_CONST
22060 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20  RAINT.** error. 
22070 54 68 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61  The onError para
22080 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73  meter determines
22090 20 77 68 69 63 68 20 28 69 66 20 61 6e 79 29 20   which (if any) 
220a0 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
220b0 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65  .** and/or curre
220c0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
220d0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
220e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61  /.void sqlite3Ha
220f0 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ltConstraint(.  
22100 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
22110 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
22120 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72  text */.  int er
22130 72 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20 65  rCode,      /* e
22140 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f  xtended error co
22150 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  de */.  int onEr
22160 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ror,      /* Con
22170 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a  straint type */.
22180 20 20 63 68 61 72 20 2a 70 34 2c 20 20 20 20 20    char *p4,     
22190 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73      /* Error mes
221a0 73 61 67 65 20 2a 2f 0a 20 20 69 38 20 70 34 74  sage */.  i8 p4t
221b0 79 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ype,        /* P
221c0 34 5f 53 54 41 54 49 43 20 6f 72 20 50 34 5f 54  4_STATIC or P4_T
221d0 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38  RANSIENT */.  u8
221e0 20 70 35 45 72 72 6d 73 67 20 20 20 20 20 20 20   p5Errmsg       
221f0 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20 74 79 70  /* P5_ErrMsg typ
22200 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  e */.){.  Vdbe *
22210 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
22220 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
22230 73 65 72 74 28 20 28 65 72 72 43 6f 64 65 26 30  sert( (errCode&0
22240 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
22250 53 54 52 41 49 4e 54 20 29 3b 0a 20 20 69 66 28  STRAINT );.  if(
22260 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f   onError==OE_Abo
22270 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rt ){.    sqlite
22280 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
22290 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
222a0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
222b0 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20  _Halt, errCode, 
222c0 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20  onError, 0, p4, 
222d0 70 34 74 79 70 65 29 3b 0a 20 20 73 71 6c 69 74  p4type);.  sqlit
222e0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
222f0 2c 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a  , p5Errmsg);.}..
22300 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
22310 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 55 4e 49  _Halt due to UNI
22320 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b  QUE or PRIMARY K
22330 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69  EY constraint vi
22340 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  olation..*/.void
22350 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f   sqlite3UniqueCo
22360 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
22370 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
22380 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
22390 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
223a0 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74  r,      /* Const
223b0 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20  raint type */.  
223c0 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
223d0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
223e0 68 61 74 20 74 72 69 67 67 65 72 73 20 74 68 65  hat triggers the
223f0 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29   constraint */.)
22400 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  {.  char *zErr;.
22410 20 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63    int j;.  StrAc
22420 63 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54 61  cum errMsg;.  Ta
22430 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64 78  ble *pTab = pIdx
22440 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c  ->pTable;..  sql
22450 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
22460 28 26 65 72 72 4d 73 67 2c 20 70 50 61 72 73 65  (&errMsg, pParse
22470 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 32 30 30 29  ->db, 0, 0, 200)
22480 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 61 43  ;.  if( pIdx->aC
22490 6f 6c 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  olExpr ){.    sq
224a0 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 65 72  lite3XPrintf(&er
224b0 72 4d 73 67 2c 20 22 69 6e 64 65 78 20 27 25 71  rMsg, "index '%q
224c0 27 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  '", pIdx->zName)
224d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
224e0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
224f0 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  nKeyCol; j++){. 
22500 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b       char *zCol;
22510 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22520 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
22530 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f  >=0 );.      zCo
22540 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  l = pTab->aCol[p
22550 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
22560 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69  ].zName;.      i
22570 66 28 20 6a 20 29 20 73 71 6c 69 74 65 33 53 74  f( j ) sqlite3St
22580 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 65 72  rAccumAppend(&er
22590 72 4d 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b 0a  rMsg, ", ", 2);.
225a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
225b0 69 6e 74 66 28 26 65 72 72 4d 73 67 2c 20 22 25  intf(&errMsg, "%
225c0 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s.%s", pTab->zNa
225d0 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d  me, zCol);.    }
225e0 0a 20 20 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71  .  }.  zErr = sq
225f0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
22600 69 73 68 28 26 65 72 72 4d 73 67 29 3b 0a 20 20  ish(&errMsg);.  
22610 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
22620 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 0a 20  raint(pParse, . 
22630 20 20 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49     IsPrimaryKeyI
22640 6e 64 65 78 28 70 49 64 78 29 20 3f 20 53 51 4c  ndex(pIdx) ? SQL
22650 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
22660 52 49 4d 41 52 59 4b 45 59 20 0a 20 20 20 20 20  RIMARYKEY .     
22670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22680 20 20 20 20 20 20 20 3a 20 53 51 4c 49 54 45 5f         : SQLITE_
22690 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55  CONSTRAINT_UNIQU
226a0 45 2c 0a 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20  E,.    onError, 
226b0 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zErr, P4_DYNAMIC
226c0 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55  , P5_ConstraintU
226d0 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  nique);.}.../*.*
226e0 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c  * Code an OP_Hal
226f0 74 20 64 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69  t due to non-uni
22700 71 75 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f  que rowid..*/.vo
22710 69 64 20 73 71 6c 69 74 65 33 52 6f 77 69 64 43  id sqlite3RowidC
22720 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
22730 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
22740 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
22750 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  t */.  int onErr
22760 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66  or,      /* Conf
22770 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
22780 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54  algorithm */.  T
22790 61 62 6c 65 20 2a 70 54 61 62 20 20 20 20 20 20  able *pTab      
227a0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 77 69   /* The table wi
227b0 74 68 20 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75  th the non-uniqu
227c0 65 20 72 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20  e rowid */ .){. 
227d0 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69   char *zMsg;.  i
227e0 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 54 61  nt rc;.  if( pTa
227f0 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20  b->iPKey>=0 ){. 
22800 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
22810 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
22820 3e 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54  >db, "%s.%s", pT
22830 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
22840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22850 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
22860 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61  pTab->iPKey].zNa
22870 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  me);.    rc = SQ
22880 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
22890 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65  PRIMARYKEY;.  }e
228a0 6c 73 65 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20  lse{.    zMsg = 
228b0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
228c0 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72  Parse->db, "%s.r
228d0 6f 77 69 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  owid", pTab->zNa
228e0 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  me);.    rc = SQ
228f0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
22900 52 4f 57 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c  ROWID;.  }.  sql
22910 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
22920 6e 74 28 70 50 61 72 73 65 2c 20 72 63 2c 20 6f  nt(pParse, rc, o
22930 6e 45 72 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34  nError, zMsg, P4
22940 5f 44 59 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20  _DYNAMIC,.      
22950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22960 20 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55    P5_ConstraintU
22970 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nique);.}../*.**
22980 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
22990 20 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65   pIndex uses the
229a0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
229b0 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75  nce pColl.  Retu
229c0 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74  rn.** true if it
229d0 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20   does and false 
229e0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
229f0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
22a00 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
22a10 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74  tatic int collat
22a20 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63  ionMatch(const c
22a30 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65  har *zColl, Inde
22a40 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e  x *pIndex){.  in
22a50 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  t i;.  assert( z
22a60 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72  Coll!=0 );.  for
22a70 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e  (i=0; i<pIndex->
22a80 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
22a90 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
22aa0 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
22ab0 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  l[i];.    assert
22ac0 28 20 7a 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78  ( z!=0 || pIndex
22ad0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20  ->aiColumn[i]<0 
22ae0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
22af0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d  x->aiColumn[i]>=
22b00 30 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53  0 && 0==sqlite3S
22b10 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29  trICmp(z, zColl)
22b20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
22b30 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
22b40 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
22b50 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70  if../*.** Recomp
22b60 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
22b70 6f 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65  of pTab that use
22b80 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
22b90 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a  equence pColl..*
22ba0 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68  * If pColl==0 th
22bb0 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c  en recompute all
22bc0 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62   indices of pTab
22bd0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
22be0 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
22bf0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69  .static void rei
22c00 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20  ndexTable(Parse 
22c10 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
22c20 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74  pTab, char const
22c30 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65   *zColl){.  Inde
22c40 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
22c50 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
22c60 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
22c70 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66  ith pTab */..  f
22c80 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e  or(pIndex=pTab->
22c90 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
22ca0 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70  pIndex=pIndex->p
22cb0 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a  Next){.    if( z
22cc0 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61  Coll==0 || colla
22cd0 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c  tionMatch(zColl,
22ce0 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20   pIndex) ){.    
22cf0 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
22d00 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
22d10 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
22d20 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
22d30 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
22d40 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
22d50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
22d60 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
22d70 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
22d80 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20  pIndex, -1);.   
22d90 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
22da0 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
22db0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
22dc0 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c  all tables in al
22dd0 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72  l databases wher
22de0 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73  e the.** indices
22df0 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69   use the collati
22e00 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
22e10 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20  l.  If pColl==0 
22e20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a  then recompute.*
22e30 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76  * all indices ev
22e40 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66  erywhere..*/.#if
22e50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22e60 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
22e70 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61  void reindexData
22e80 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61  bases(Parse *pPa
22e90 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20  rse, char const 
22ea0 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70  *zColl){.  Db *p
22eb0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
22ec0 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
22ed0 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
22ee0 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
22ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22f00 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
22f10 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  ex number */.  s
22f20 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
22f30 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68  rse->db;   /* Th
22f40 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
22f50 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45  ction */.  HashE
22f60 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20  lem *k;         
22f70 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
22f80 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65  oping over table
22f90 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61  s in pDb */.  Ta
22fa0 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
22fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
22fc0 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
22fd0 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  base */..  asser
22fe0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
22ff0 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64  oldsAllMutexes(d
23000 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65 64  b) );  /* Needed
23010 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
23020 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62 3d  ss */.  for(iDb=
23030 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20  0, pDb=db->aDb; 
23040 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62  iDb<db->nDb; iDb
23050 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20  ++, pDb++){.    
23060 61 73 73 65 72 74 28 20 70 44 62 21 3d 30 20 29  assert( pDb!=0 )
23070 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69  ;.    for(k=sqli
23080 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62  teHashFirst(&pDb
23090 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
230a0 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74  sh);  k; k=sqlit
230b0 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20  eHashNext(k)){. 
230c0 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62       pTab = (Tab
230d0 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  le*)sqliteHashDa
230e0 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69  ta(k);.      rei
230f0 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
23100 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  , pTab, zColl);.
23110 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
23120 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
23130 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
23140 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e  REINDEX command.
23150 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  .**.**        RE
23160 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20  INDEX           
23170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23180 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20   -- 1.**        
23190 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74  REINDEX  <collat
231a0 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20  ion>            
231b0 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20     -- 2.**      
231c0 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74    REINDEX  ?<dat
231d0 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61  abase>.?<tablena
231e0 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20  me>  -- 3.**    
231f0 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64      REINDEX  ?<d
23200 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78  atabase>.?<index
23210 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a  name>  -- 4.**.*
23220 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20  * Form 1 causes 
23230 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
23240 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
23250 62 61 73 65 73 20 74 6f 20 62 65 20 72 65 62 75  bases to be rebu
23260 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72  ilt..** Form 2 r
23270 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69  ebuilds all indi
23280 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  ces in all datab
23290 61 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68  ases that use th
232a0 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61  e named.** colla
232b0 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ting function.  
232c0 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65  Forms 3 and 4 re
232d0 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20  build the named 
232e0 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20  index or all.** 
232f0 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
23300 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
23310 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e  d table..*/.#ifn
23320 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23330 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c  REINDEX.void sql
23340 69 74 65 33 52 65 69 6e 64 65 78 28 50 61 72 73  ite3Reindex(Pars
23350 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
23360 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20   *pName1, Token 
23370 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c  *pName2){.  Coll
23380 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
23390 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
233a0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
233b0 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f   be reindexed, o
233c0 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72  r NULL */.  char
233d0 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
233e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
233f0 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
23400 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dex */.  const c
23410 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20  har *zDb;       
23420 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
23430 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
23440 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
23450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23460 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
23470 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e  database */.  In
23480 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
23490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
234a0 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
234b0 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20   with pTab */.  
234c0 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
234d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
234e0 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
234f0 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
23500 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
23510 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
23520 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
23530 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tion */.  Token 
23540 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20  *pObjName;      
23550 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
23560 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
23570 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65  dex to be reinde
23580 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61  xed */..  /* Rea
23590 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
235a0 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72  chema. If an err
235b0 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
235c0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
235d0 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20  e.  ** and code 
235e0 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
235f0 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  turn NULL. */.  
23600 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
23610 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
23620 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
23630 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69  return;.  }..  i
23640 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a  f( pName1==0 ){.
23650 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
23660 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b  ases(pParse, 0);
23670 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
23680 65 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28 70  else if( NEVER(p
23690 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61  Name2==0) || pNa
236a0 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  me2->z==0 ){.   
236b0 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20   char *zColl;.  
236c0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
236d0 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c  ->z );.    zColl
236e0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
236f0 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
23700 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  db, pName1);.   
23710 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65   if( !zColl ) re
23720 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  turn;.    pColl 
23730 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
23740 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
23750 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20  , zColl, 0);.   
23760 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
23770 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
23780 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f  ases(pParse, zCo
23790 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
237a0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f  e3DbFree(db, zCo
237b0 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ll);.      retur
237c0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  n;.    }.    sql
237d0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
237e0 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62  Coll);.  }.  iDb
237f0 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
23800 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
23810 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
23820 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ObjName);.  if( 
23830 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb<0 ) return;.
23840 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d    z = sqlite3Nam
23850 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
23860 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ObjName);.  if( 
23870 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
23880 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69   zDb = db->aDb[i
23890 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
238a0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
238b0 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a  ndTable(db, z, z
238c0 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20  Db);.  if( pTab 
238d0 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61  ){.    reindexTa
238e0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
238f0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
23900 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
23910 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
23920 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
23930 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
23940 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74  z, zDb);.  sqlit
23950 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
23960 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
23970 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
23980 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
23990 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
239a0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69  .    sqlite3Refi
239b0 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
239c0 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20  pIndex, -1);.   
239d0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
239e0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
239f0 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
23a00 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f  o identify the o
23a10 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e  bject to be rein
23a20 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69  dexed");.}.#endi
23a30 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
23a40 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
23a50 75 72 65 20 74 68 61 74 20 69 73 20 61 70 70 72  ure that is appr
23a60 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
23a70 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a  given Index..**.
23a80 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68  ** The caller sh
23a90 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69  ould invoke sqli
23aa0 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
23ab0 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65  ) on the returne
23ac0 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77 68 65 6e  d object.** when
23ad0 20 69 74 20 68 61 73 20 66 69 6e 69 73 68 65 64   it has finished
23ae0 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65   using it..*/.Ke
23af0 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65  yInfo *sqlite3Ke
23b00 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 50 61 72  yInfoOfIndex(Par
23b10 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
23b20 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20  x *pIdx){.  int 
23b30 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  i;.  int nCol = 
23b40 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  pIdx->nColumn;. 
23b50 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64 78   int nKey = pIdx
23b60 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65 79  ->nKeyCol;.  Key
23b70 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 69 66  Info *pKey;.  if
23b80 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
23b90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
23ba0 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75   pIdx->uniqNotNu
23bb0 6c 6c 20 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d  ll ){.    pKey =
23bc0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
23bd0 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
23be0 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79   nKey, nCol-nKey
23bf0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
23c00 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65  pKey = sqlite3Ke
23c10 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73  yInfoAlloc(pPars
23c20 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b  e->db, nCol, 0);
23c30 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b 65 79 20  .  }.  if( pKey 
23c40 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
23c50 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
23c60 72 69 74 65 61 62 6c 65 28 70 4b 65 79 29 20 29  riteable(pKey) )
23c70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
23c80 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
23c90 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
23ca0 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
23cb0 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70 4b  oll[i];.      pK
23cc0 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 7a  ey->aColl[i] = z
23cd0 43 6f 6c 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72  Coll==sqlite3Str
23ce0 42 49 4e 41 52 59 20 3f 20 30 20 3a 0a 20 20 20  BINARY ? 0 :.   
23cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d00 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61       sqlite3Loca
23d10 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
23d20 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
23d30 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pKey->aSortOrder
23d40 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  [i] = pIdx->aSor
23d50 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d  tOrder[i];.    }
23d60 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
23d70 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73  >nErr ){.      s
23d80 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
23d90 65 66 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  ef(pKey);.      
23da0 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pKey = 0;.    }.
23db0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65    }.  return pKe
23dc0 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  y;.}..#ifndef SQ
23dd0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a  LITE_OMIT_CTE./*
23de0 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
23df0 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63  e is invoked onc
23e00 65 20 70 65 72 20 43 54 45 20 62 79 20 74 68 65  e per CTE by the
23e10 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 70 61   parser while pa
23e20 72 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49 54 48  rsing a .** WITH
23e30 20 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57 69 74   clause. .*/.Wit
23e40 68 20 2a 73 71 6c 69 74 65 33 57 69 74 68 41 64  h *sqlite3WithAd
23e50 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  d(.  Parse *pPar
23e60 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
23e70 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
23e80 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68  */.  With *pWith
23e90 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
23ea0 45 78 69 73 74 69 6e 67 20 57 49 54 48 20 63 6c  Existing WITH cl
23eb0 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ause, or NULL */
23ec0 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
23ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
23ee0 6d 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e  me of the common
23ef0 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72  -table */.  Expr
23f00 4c 69 73 74 20 2a 70 41 72 67 6c 69 73 74 2c 20  List *pArglist, 
23f10 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20      /* Optional 
23f20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69 73 74  column name list
23f30 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a   for the table *
23f40 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 51 75 65  /.  Select *pQue
23f50 72 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51  ry          /* Q
23f60 75 65 72 79 20 75 73 65 64 20 74 6f 20 69 6e 69  uery used to ini
23f70 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c  tialize the tabl
23f80 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
23f90 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
23fa0 64 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e 65 77  db;.  With *pNew
23fb0 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  ;.  char *zName;
23fc0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
23fd0 74 20 74 68 65 20 43 54 45 20 6e 61 6d 65 20 69  t the CTE name i
23fe0 73 20 75 6e 69 71 75 65 20 77 69 74 68 69 6e 20  s unique within 
23ff0 74 68 69 73 20 57 49 54 48 20 63 6c 61 75 73 65  this WITH clause
24000 2e 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73  . If.  ** not, s
24010 74 6f 72 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  tore an error in
24020 20 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63   the Parse struc
24030 74 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65  ture. */.  zName
24040 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
24050 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
24060 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
24070 28 20 7a 4e 61 6d 65 20 26 26 20 70 57 69 74 68  ( zName && pWith
24080 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
24090 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57     for(i=0; i<pW
240a0 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b  ith->nCte; i++){
240b0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
240c0 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c  e3StrICmp(zName,
240d0 20 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61   pWith->a[i].zNa
240e0 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
240f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
24100 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69  g(pParse, "dupli
24110 63 61 74 65 20 57 49 54 48 20 74 61 62 6c 65 20  cate WITH table 
24120 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65  name: %s", zName
24130 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
24140 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 57 69 74  .  }..  if( pWit
24150 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79  h ){.    int nBy
24160 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 57 69  te = sizeof(*pWi
24170 74 68 29 20 2b 20 28 73 69 7a 65 6f 66 28 70 57  th) + (sizeof(pW
24180 69 74 68 2d 3e 61 5b 31 5d 29 20 2a 20 70 57 69  ith->a[1]) * pWi
24190 74 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20 20 70  th->nCte);.    p
241a0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
241b0 65 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69 74 68  ealloc(db, pWith
241c0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
241d0 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  e{.    pNew = sq
241e0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
241f0 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 57  o(db, sizeof(*pW
24200 69 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ith));.  }.  ass
24210 65 72 74 28 20 28 70 4e 65 77 21 3d 30 20 26 26  ert( (pNew!=0 &&
24220 20 7a 4e 61 6d 65 21 3d 30 29 20 7c 7c 20 64 62   zName!=0) || db
24230 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
24240 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  ;..  if( db->mal
24250 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
24260 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
24270 44 65 6c 65 74 65 28 64 62 2c 20 70 41 72 67 6c  Delete(db, pArgl
24280 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
24290 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
242a0 2c 20 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73  , pQuery);.    s
242b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
242c0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65   zName);.    pNe
242d0 77 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c  w = pWith;.  }el
242e0 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  se{.    pNew->a[
242f0 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c  pNew->nCte].pSel
24300 65 63 74 20 3d 20 70 51 75 65 72 79 3b 0a 20 20  ect = pQuery;.  
24310 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
24320 6e 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41  nCte].pCols = pA
24330 72 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77  rglist;.    pNew
24340 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e  ->a[pNew->nCte].
24350 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
24360 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
24370 3e 6e 43 74 65 5d 2e 7a 43 74 65 45 72 72 20 3d  >nCte].zCteErr =
24380 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43   0;.    pNew->nC
24390 74 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  te++;.  }..  ret
243a0 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
243b0 2a 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74  ** Free the cont
243c0 65 6e 74 73 20 6f 66 20 74 68 65 20 57 69 74 68  ents of the With
243d0 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
243e0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
243f0 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
24400 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74 65  qlite3WithDelete
24410 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69  (sqlite3 *db, Wi
24420 74 68 20 2a 70 57 69 74 68 29 7b 0a 20 20 69 66  th *pWith){.  if
24430 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69  ( pWith ){.    i
24440 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
24450 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65  0; i<pWith->nCte
24460 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
24470 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 20 3d  ruct Cte *pCte =
24480 20 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20   &pWith->a[i];. 
24490 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
244a0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
244b0 43 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20  Cte->pCols);.   
244c0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
244d0 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d  Delete(db, pCte-
244e0 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
244f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
24500 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b  b, pCte->zName);
24510 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
24520 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 69  e3DbFree(db, pWi
24530 74 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  th);.  }.}.#endi
24540 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
24550 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a  LITE_OMIT_CTE) *
24560 2f 0a                                            /.