/ Hex Artifact Content
Login

Artifact a5402bf34cb8e4cde86f6c6fc0356a5d26a6d561b647464c13ef3366f545b56e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  =0 );..#ifdef SQ
07f0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
0800: 52 45 4e 54 0a 20 20 69 66 28 20 69 44 62 3d 3d  RENT.  if( iDb==
0810: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  1 ) return;.  if
0820: 28 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53  ( !sqlite3BtreeS
0830: 68 61 72 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  harable(pParse->
0840: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
0850: 29 20 29 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64  ) ) return;.#end
0860: 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  if.  for(i=0; i<
0870: 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c  pToplevel->nTabl
0880: 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  eLock; i++){.   
0890: 20 70 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d   p = &pToplevel-
08a0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
08b0: 20 20 20 20 69 66 28 20 70 2d 3e 69 44 62 3d 3d      if( p->iDb==
08c0: 69 44 62 20 26 26 20 70 2d 3e 69 54 61 62 3d 3d  iDb && p->iTab==
08d0: 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 2d  iTab ){.      p-
08e0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28  >isWriteLock = (
08f0: 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c  p->isWriteLock |
0900: 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a  | isWriteLock);.
0910: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
0920: 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65    }.  }..  nByte
0930: 73 20 3d 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  s = sizeof(Table
0940: 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70 6c 65 76  Lock) * (pToplev
0950: 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31  el->nTableLock+1
0960: 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
0970: 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a 20 20 20  aTableLock =.   
0980: 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c     sqlite3DbReal
0990: 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f 70 6c 65  locOrFree(pTople
09a0: 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70 6c 65 76  vel->db, pToplev
09b0: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 2c 20  el->aTableLock, 
09c0: 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20 70  nBytes);.  if( p
09d0: 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65  Toplevel->aTable
09e0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 20 3d 20  Lock ){.    p = 
09f0: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0a00: 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65 76 65 6c  leLock[pToplevel
0a10: 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b  ->nTableLock++];
0a20: 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d 20 69 44  .    p->iDb = iD
0a30: 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62 20 3d  b;.    p->iTab =
0a40: 20 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 73   iTab;.    p->is
0a50: 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69 73 57 72  WriteLock = isWr
0a60: 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 2d 3e  iteLock;.    p->
0a70: 7a 4c 6f 63 6b 4e 61 6d 65 20 3d 20 7a 4e 61 6d  zLockName = zNam
0a80: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
0a90: 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c  pToplevel->nTabl
0aa0: 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 73  eLock = 0;.    s
0ab0: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70  qlite3OomFault(p
0ac0: 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 29 3b 0a 20  Toplevel->db);. 
0ad0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0ae0: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0af0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b00: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b10: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b20: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0b30: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0b40: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0b50: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0b60: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0b70: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0b80: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0b90: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0ba0: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0bb0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0bc0: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0bd0: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0be0: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0bf0: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c00: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c10: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c20: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0c30: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0c40: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0c50: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0c60: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0c70: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0c80: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0c90: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0ca0: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0cb0: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cd0: 20 20 20 70 2d 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c     p->zLockName,
0ce0: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d   P4_STATIC);.  }
0cf0: 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69  .}.#else.  #defi
0d00: 6e 65 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ne codeTableLock
0d10: 73 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  s(x).#endif../*.
0d20: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
0d30: 66 20 74 68 65 20 67 69 76 65 6e 20 79 44 62 4d  f the given yDbM
0d40: 61 73 6b 20 6f 62 6a 65 63 74 20 69 73 20 65 6d  ask object is em
0d50: 70 74 79 20 2d 20 69 66 20 69 74 20 63 6f 6e 74  pty - if it cont
0d60: 61 69 6e 73 20 6e 6f 0a 2a 2a 20 31 20 62 69 74  ains no.** 1 bit
0d70: 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
0d80: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
0d90: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 29 20  DbMaskAllZero() 
0da0: 61 6e 64 20 44 62 4d 61 73 6b 4e 6f 74 5a 65 72  and DbMaskNotZer
0db0: 6f 28 29 0a 2a 2a 20 6d 61 63 72 6f 73 20 77 68  o().** macros wh
0dc0: 65 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  en SQLITE_MAX_AT
0dd0: 54 41 43 48 45 44 20 69 73 20 67 72 65 61 74 65  TACHED is greate
0de0: 72 20 74 68 61 6e 20 33 30 2e 0a 2a 2f 0a 23 69  r than 30..*/.#i
0df0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  f SQLITE_MAX_ATT
0e00: 41 43 48 45 44 3e 33 30 0a 69 6e 74 20 73 71 6c  ACHED>30.int sql
0e10: 69 74 65 33 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  ite3DbMaskAllZer
0e20: 6f 28 79 44 62 4d 61 73 6b 20 6d 29 7b 0a 20 20  o(yDbMask m){.  
0e30: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
0e40: 3b 20 69 3c 73 69 7a 65 6f 66 28 79 44 62 4d 61  ; i<sizeof(yDbMa
0e50: 73 6b 29 3b 20 69 2b 2b 29 20 69 66 28 20 6d 5b  sk); i++) if( m[
0e60: 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  i] ) return 0;. 
0e70: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
0e80: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
0e90: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
0ea0: 64 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65  d after a single
0eb0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68   SQL statement h
0ec0: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65  as been.** parse
0ed0: 64 20 61 6e 64 20 61 20 56 44 42 45 20 70 72 6f  d and a VDBE pro
0ee0: 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20  gram to execute 
0ef0: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20 68  that statement h
0f00: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65 70 61  as been.** prepa
0f10: 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  red.  This routi
0f20: 6e 65 20 70 75 74 73 20 74 68 65 20 66 69 6e 69  ne puts the fini
0f30: 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20 6f 6e  shing touches on
0f40: 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f   the.** VDBE pro
0f50: 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74 73 20  gram and resets 
0f60: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
0f70: 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e 65 78  ture for the nex
0f80: 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a  t.** parse..**.*
0f90: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61  * Note that if a
0fa0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
0fb0: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
0fc0: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e  e case that.** n
0fd0: 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20  o VDBE code was 
0fe0: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f  generated..*/.vo
0ff0: 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  id sqlite3Finish
1000: 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a 70 50  Coding(Parse *pP
1010: 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
1020: 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
1030: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1040: 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30  se->pToplevel==0
1050: 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
1060: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61  e->db;.  if( pPa
1070: 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20 72 65  rse->nested ) re
1080: 74 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e  turn;.  if( db->
1090: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
10a0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
10b0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
10c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
10d0: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
10e0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72  ITE_ERROR;.    r
10f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
1100: 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65 72 61   Begin by genera
1110: 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e  ting some termin
1120: 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20 74 68  ation code at th
1130: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a  e end of the.  *
1140: 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d 0a 20  * vdbe program. 
1150: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
1160: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1170: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ;.  assert( !pPa
1180: 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  rse->isMultiWrit
1190: 65 20 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  e .       || sql
11a0: 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61  ite3VdbeAssertMa
11b0: 79 41 62 6f 72 74 28 76 2c 20 70 50 61 72 73 65  yAbort(v, pParse
11c0: 2d 3e 6d 61 79 41 62 6f 72 74 29 29 3b 0a 20 20  ->mayAbort));.  
11d0: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
11e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
11f0: 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a 0a 23 69 66  , OP_Halt);..#if
1200: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
1210: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20  HENTICATION.    
1220: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  if( pParse->nTab
1230: 6c 65 4c 6f 63 6b 3e 30 20 26 26 20 64 62 2d 3e  leLock>0 && db->
1240: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
1250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 55 73 65        sqlite3Use
1260: 72 41 75 74 68 49 6e 69 74 28 64 62 29 3b 0a 20  rAuthInit(db);. 
1270: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74       if( db->aut
1280: 68 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54  h.authLevel<UAUT
1290: 48 5f 55 73 65 72 20 29 7b 0a 20 20 20 20 20 20  H_User ){.      
12a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12b0: 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 72 20  g(pParse, "user 
12c0: 6e 6f 74 20 61 75 74 68 65 6e 74 69 63 61 74 65  not authenticate
12d0: 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  d");.        pPa
12e0: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
12f0: 5f 41 55 54 48 5f 55 53 45 52 3b 0a 20 20 20 20  _AUTH_USER;.    
1300: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1310: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
1320: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f  ..    /* The coo
1330: 6b 69 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e  kie mask contain
1340: 73 20 6f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  s one bit for ea
1350: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
1360: 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42   open..    ** (B
1370: 69 74 20 30 20 69 73 20 66 6f 72 20 6d 61 69 6e  it 0 is for main
1380: 2c 20 62 69 74 20 31 20 69 73 20 66 6f 72 20 74  , bit 1 is for t
1390: 65 6d 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  emp, and so fort
13a0: 68 2e 29 20 20 42 69 74 73 20 61 72 65 0a 20 20  h.)  Bits are.  
13b0: 20 20 2a 2a 20 73 65 74 20 66 6f 72 20 65 61 63    ** set for eac
13c0: 68 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  h database that 
13d0: 69 73 20 75 73 65 64 2e 20 20 47 65 6e 65 72 61  is used.  Genera
13e0: 74 65 20 63 6f 64 65 20 74 6f 20 73 74 61 72 74  te code to start
13f0: 20 61 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61   a.    ** transa
1400: 63 74 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73  ction on each us
1410: 65 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ed database and 
1420: 74 6f 20 76 65 72 69 66 79 20 74 68 65 20 73 63  to verify the sc
1430: 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20  hema cookie.    
1440: 2a 2a 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20  ** on each used 
1450: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
1460: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
1470: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20  locFailed==0 .  
1480: 20 20 20 26 26 20 28 44 62 4d 61 73 6b 4e 6f 6e     && (DbMaskNon
1490: 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 63 6f 6f  Zero(pParse->coo
14a0: 6b 69 65 4d 61 73 6b 29 20 7c 7c 20 70 50 61 72  kieMask) || pPar
14b0: 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 29 0a  se->pConstExpr).
14c0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74      ){.      int
14d0: 20 69 44 62 2c 20 69 3b 0a 20 20 20 20 20 20 61   iDb, i;.      a
14e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
14f0: 62 65 47 65 74 4f 70 28 76 2c 20 30 29 2d 3e 6f  beGetOp(v, 0)->o
1500: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 29  pcode==OP_Init )
1510: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1520: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 30  dbeJumpHere(v, 0
1530: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62  );.      for(iDb
1540: 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  =0; iDb<db->nDb;
1550: 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20   iDb++){.       
1560: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1570: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 44 62  ;.        if( Db
1580: 4d 61 73 6b 54 65 73 74 28 70 50 61 72 73 65 2d  MaskTest(pParse-
1590: 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62  >cookieMask, iDb
15a0: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
15b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15c0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
15d0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 70   iDb);.        p
15e0: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
15f0: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  [iDb].pSchema;. 
1600: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1610: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 0a 20  beAddOp4Int(v,. 
1620: 20 20 20 20 20 20 20 20 20 4f 50 5f 54 72 61 6e           OP_Tran
1630: 73 61 63 74 69 6f 6e 2c 20 20 20 20 20 20 20 20  saction,        
1640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1650: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20  pcode */.       
1660: 20 20 20 69 44 62 2c 20 20 20 20 20 20 20 20 20     iDb,         
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
1690: 20 20 20 20 20 20 20 20 20 44 62 4d 61 73 6b 54           DbMaskT
16a0: 65 73 74 28 70 50 61 72 73 65 2d 3e 77 72 69 74  est(pParse->writ
16b0: 65 4d 61 73 6b 2c 69 44 62 29 2c 20 2f 2a 20 50  eMask,iDb), /* P
16c0: 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  2 */.          p
16d0: 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
16e0: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20 20 20 20  ookie,          
16f0: 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20    /* P3 */.     
1700: 20 20 20 20 20 70 53 63 68 65 6d 61 2d 3e 69 47       pSchema->iG
1710: 65 6e 65 72 61 74 69 6f 6e 20 20 20 20 20 20 20  eneration       
1720: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f          /* P4 */
1730: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
1740: 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74      if( db->init
1750: 2e 62 75 73 79 3d 3d 30 20 29 20 73 71 6c 69 74  .busy==0 ) sqlit
1760: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1770: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64  , 1);.        Vd
1780: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 0a 20 20  beComment((v,.  
1790: 20 20 20 20 20 20 20 20 20 20 20 20 22 75 73 65              "use
17a0: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 3d 25 64 22  sStmtJournal=%d"
17b0: 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f  , pParse->mayAbo
17c0: 72 74 20 26 26 20 70 50 61 72 73 65 2d 3e 69 73  rt && pParse->is
17d0: 4d 75 6c 74 69 57 72 69 74 65 29 29 3b 0a 20 20  MultiWrite));.  
17e0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
17f0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1800: 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 66 6f 72  LTABLE.      for
1810: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
1820: 6e 56 74 61 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b  nVtabLock; i++){
1830: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 76  .        char *v
1840: 74 61 62 20 3d 20 28 63 68 61 72 20 2a 29 73 71  tab = (char *)sq
1850: 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
1860: 62 2c 20 70 50 61 72 73 65 2d 3e 61 70 56 74 61  b, pParse->apVta
1870: 62 4c 6f 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20  bLock[i]);.     
1880: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1890: 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp4(v, OP_VBegi
18a0: 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74 61 62  n, 0, 0, 0, vtab
18b0: 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
18c0: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 72 73 65    }.      pParse
18d0: 2d 3e 6e 56 74 61 62 4c 6f 63 6b 20 3d 20 30 3b  ->nVtabLock = 0;
18e0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
18f0: 2a 20 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20 63  * Once all the c
1900: 6f 6f 6b 69 65 73 20 68 61 76 65 20 62 65 65 6e  ookies have been
1910: 20 76 65 72 69 66 69 65 64 20 61 6e 64 20 74 72   verified and tr
1920: 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65  ansactions opene
1930: 64 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74  d, .      ** obt
1940: 61 69 6e 20 74 68 65 20 72 65 71 75 69 72 65 64  ain the required
1950: 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68   table-locks. Th
1960: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e  is is a no-op un
1970: 6c 65 73 73 20 74 68 65 20 0a 20 20 20 20 20 20  less the .      
1980: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
1990: 66 65 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c  feature is enabl
19a0: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
19b0: 20 20 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b     codeTableLock
19c0: 73 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  s(pParse);..    
19d0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
19e0: 61 6e 79 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e  any AUTOINCREMEN
19f0: 54 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  T data structure
1a00: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
1a10: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
1a20: 65 33 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 42  e3AutoincrementB
1a30: 65 67 69 6e 28 70 50 61 72 73 65 29 3b 0a 0a 20  egin(pParse);.. 
1a40: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 63 6f 6e       /* Code con
1a50: 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
1a60: 73 20 74 68 61 74 20 77 68 65 72 65 20 66 61 63  s that where fac
1a70: 74 6f 72 65 64 20 6f 75 74 20 6f 66 20 69 6e 6e  tored out of inn
1a80: 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20  er loops */.    
1a90: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 43    if( pParse->pC
1aa0: 6f 6e 73 74 45 78 70 72 20 29 7b 0a 20 20 20 20  onstExpr ){.    
1ab0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
1ac0: 4c 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  L = pParse->pCon
1ad0: 73 74 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  stExpr;.        
1ae0: 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46  pParse->okConstF
1af0: 61 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  actor = 0;.     
1b00: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
1b10: 4c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  L->nExpr; i++){.
1b20: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1b30: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1b40: 2c 20 70 45 4c 2d 3e 61 5b 69 5d 2e 70 45 78 70  , pEL->a[i].pExp
1b50: 72 2c 20 70 45 4c 2d 3e 61 5b 69 5d 2e 75 2e 69  r, pEL->a[i].u.i
1b60: 43 6f 6e 73 74 45 78 70 72 52 65 67 29 3b 0a 20  ConstExprReg);. 
1b70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b80: 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c  ..      /* Final
1b90: 6c 79 2c 20 6a 75 6d 70 20 62 61 63 6b 20 74 6f  ly, jump back to
1ba0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1bb0: 66 20 74 68 65 20 65 78 65 63 75 74 61 62 6c 65  f the executable
1bc0: 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20   code. */.      
1bd0: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1be0: 76 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  v, 1);.    }.  }
1bf0: 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ...  /* Get the 
1c00: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65 61  VDBE program rea
1c10: 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  dy for execution
1c20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26  .  */.  if( v &&
1c30: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
1c40: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
1c50: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  ailed ){.    /* 
1c60: 41 20 6d 69 6e 69 6d 75 6d 20 6f 66 20 6f 6e 65  A minimum of one
1c70: 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 69   cursor is requi
1c80: 72 65 64 20 69 66 20 61 75 74 6f 69 6e 63 72 65  red if autoincre
1c90: 6d 65 6e 74 20 69 73 20 75 73 65 64 0a 20 20 20  ment is used.   
1ca0: 20 2a 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b   *  See ticket [
1cb0: 61 36 39 36 33 37 39 63 31 66 30 38 38 36 36 5d  a696379c1f08866]
1cc0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1cd0: 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 3d 3d 30  pParse->pAinc==0
1ce0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 54 61 62   || pParse->nTab
1cf0: 3e 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  >0 );.    sqlite
1d00: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76  3VdbeMakeReady(v
1d10: 2c 20 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70  , pParse);.    p
1d20: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1d30: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
1d40: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  {.    pParse->rc
1d50: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1d60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75  .  }.}../*.** Ru
1d70: 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 6e 64  n the parser and
1d80: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
1d90: 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20 6f  recursively in o
1da0: 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65  rder to generate
1db0: 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68 65  .** code for the
1dc0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 67   SQL statement g
1dd0: 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e  iven onto the en
1de0: 64 20 6f 66 20 74 68 65 20 70 50 61 72 73 65 20  d of the pParse 
1df0: 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72 65  context.** curre
1e00: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
1e10: 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74  ruction.  When t
1e20: 68 65 20 70 61 72 73 65 72 20 69 73 20 72 75 6e  he parser is run
1e30: 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20   recursively.** 
1e40: 74 68 69 73 20 77 61 79 2c 20 74 68 65 20 66 69  this way, the fi
1e50: 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e  nal OP_Halt is n
1e60: 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20  ot appended and 
1e70: 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a 61  other initializa
1e80: 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61  tion.** and fina
1e90: 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 61  lization steps a
1ea0: 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61 75  re omitted becau
1eb0: 73 65 20 74 68 6f 73 65 20 61 72 65 20 68 61 6e  se those are han
1ec0: 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20  dling by the.** 
1ed0: 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65 72  outermost parser
1ee0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72  ..**.** Not ever
1ef0: 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61 62  ything is nestab
1f00: 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c 69  le.  This facili
1f10: 74 79 20 69 73 20 64 65 73 69 67 6e 65 64 20 74  ty is designed t
1f20: 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45  o permit.** INSE
1f30: 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20  RT, UPDATE, and 
1f40: 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
1f50: 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54 45  s against SQLITE
1f60: 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a  _MASTER.  Use.**
1f70: 20 63 61 72 65 20 69 66 20 79 6f 75 20 64 65 63   care if you dec
1f80: 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75 73  ide to try to us
1f90: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  e this routine f
1fa0: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
1fb0: 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  rposes..*/.void 
1fc0: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
1fd0: 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
1fe0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
1ff0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
2000: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61  a_list ap;.  cha
2010: 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20  r *zSql;.  char 
2020: 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
2030: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
2040: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 63 68 61 72  arse->db;.  char
2050: 20 73 61 76 65 42 75 66 5b 50 41 52 53 45 5f 54   saveBuf[PARSE_T
2060: 41 49 4c 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20  AIL_SZ];..  if( 
2070: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
2080: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
2090: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c   pParse->nested<
20a0: 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e  10 );  /* Nestin
20b0: 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  g should only be
20c0: 20 6f 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74   of limited dept
20d0: 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28  h */.  va_start(
20e0: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
20f0: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d  zSql = sqlite3VM
2100: 50 72 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72 6d  Printf(db, zForm
2110: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
2120: 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71  d(ap);.  if( zSq
2130: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  l==0 ){.    retu
2140: 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f  rn;   /* A mallo
2150: 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
2160: 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72  ed */.  }.  pPar
2170: 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20  se->nested++;.  
2180: 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20  memcpy(saveBuf, 
2190: 50 41 52 53 45 5f 54 41 49 4c 28 70 50 61 72 73  PARSE_TAIL(pPars
21a0: 65 29 2c 20 50 41 52 53 45 5f 54 41 49 4c 5f 53  e), PARSE_TAIL_S
21b0: 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28 50 41 52  Z);.  memset(PAR
21c0: 53 45 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c  SE_TAIL(pParse),
21d0: 20 30 2c 20 50 41 52 53 45 5f 54 41 49 4c 5f 53   0, PARSE_TAIL_S
21e0: 5a 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e  Z);.  sqlite3Run
21f0: 50 61 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a  Parser(pParse, z
2200: 53 71 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  Sql, &zErrMsg);.
2210: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2220: 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  db, zErrMsg);.  
2230: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2240: 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70  , zSql);.  memcp
2250: 79 28 50 41 52 53 45 5f 54 41 49 4c 28 70 50 61  y(PARSE_TAIL(pPa
2260: 72 73 65 29 2c 20 73 61 76 65 42 75 66 2c 20 50  rse), saveBuf, P
2270: 41 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20  ARSE_TAIL_SZ);. 
2280: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d   pParse->nested-
2290: 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  -;.}..#if SQLITE
22a0: 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
22b0: 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  TION./*.** Retur
22c0: 6e 20 54 52 55 45 20 69 66 20 7a 54 61 62 6c 65  n TRUE if zTable
22d0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
22e0: 74 68 65 20 73 79 73 74 65 6d 20 74 61 62 6c 65  the system table
22f0: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
2300: 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 75 73 65 72  .** list of user
2310: 73 20 61 6e 64 20 74 68 65 69 72 20 61 63 63 65  s and their acce
2320: 73 73 20 63 72 65 64 65 6e 74 69 61 6c 73 2e 0a  ss credentials..
2330: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 73  */.int sqlite3Us
2340: 65 72 41 75 74 68 54 61 62 6c 65 28 63 6f 6e 73  erAuthTable(cons
2350: 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 29 7b  t char *zTable){
2360: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2370: 33 5f 73 74 72 69 63 6d 70 28 7a 54 61 62 6c 65  3_stricmp(zTable
2380: 2c 20 22 73 71 6c 69 74 65 5f 75 73 65 72 22 29  , "sqlite_user")
2390: 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ==0;.}.#endif../
23a0: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
23b0: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
23c0: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
23d0: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
23e0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
23f0: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
2400: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
2410: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
2420: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
2430: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
2440: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
2450: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
2460: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
2470: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
2480: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
2490: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
24a0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61   for the table a
24b0: 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  nd the.** first 
24c0: 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69  matching table i
24d0: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
24e0: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75   checking for du
24f0: 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a  plicate table.**
2500: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
2510: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
2520: 65 72 20 69 73 20 54 45 4d 50 20 66 69 72 73 74  er is TEMP first
2530: 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65  , then MAIN, the
2540: 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61  n any.** auxilia
2550: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
2560: 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54  ed using the ATT
2570: 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  ACH command..**.
2580: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
2590: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29  te3LocateTable()
25a0: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
25b0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c  te3FindTable(sql
25c0: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
25d0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
25e0: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61  st char *zDataba
25f0: 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20  se){.  Table *p 
2600: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  = 0;.  int i;.. 
2610: 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20   /* All mutexes 
2620: 61 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  are required for
2630: 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20   schema access. 
2640: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f   Make sure we ho
2650: 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73  ld them. */.  as
2660: 73 65 72 74 28 20 7a 44 61 74 61 62 61 73 65 21  sert( zDatabase!
2670: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72  =0 || sqlite3Btr
2680: 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65  eeHoldsAllMutexe
2690: 73 28 64 62 29 20 29 3b 0a 23 69 66 20 53 51 4c  s(db) );.#if SQL
26a0: 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
26b0: 49 43 41 54 49 4f 4e 0a 20 20 2f 2a 20 4f 6e 6c  ICATION.  /* Onl
26c0: 79 20 74 68 65 20 61 64 6d 69 6e 20 75 73 65 72  y the admin user
26d0: 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6b   is allowed to k
26e0: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73 71 6c  now that the sql
26f0: 69 74 65 5f 75 73 65 72 20 74 61 62 6c 65 0a 20  ite_user table. 
2700: 20 2a 2a 20 65 78 69 73 74 73 20 2a 2f 0a 20 20   ** exists */.  
2710: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
2720: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 41 64 6d  hLevel<UAUTH_Adm
2730: 69 6e 20 26 26 20 73 71 6c 69 74 65 33 55 73 65  in && sqlite3Use
2740: 72 41 75 74 68 54 61 62 6c 65 28 7a 4e 61 6d 65  rAuthTable(zName
2750: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
2760: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
2770: 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20  .  while(1){.   
2780: 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50   for(i=OMIT_TEMP
2790: 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  DB; i<db->nDb; i
27a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
27b0: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
27c0: 20 69 3b 20 20 20 2f 2a 20 53 65 61 72 63 68 20   i;   /* Search 
27d0: 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e  TEMP before MAIN
27e0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 44   */.      if( zD
27f0: 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 73 71  atabase==0 || sq
2800: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 61  lite3StrICmp(zDa
2810: 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b  tabase, db->aDb[
2820: 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29 3d 3d 30 20  j].zDbSName)==0 
2830: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
2840: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
2850: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c  MutexHeld(db, j,
2860: 20 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70   0) );.        p
2870: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
2880: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70  nd(&db->aDb[j].p
2890: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
28a0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
28b0: 20 69 66 28 20 70 20 29 20 72 65 74 75 72 6e 20   if( p ) return 
28c0: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
28d0: 0a 20 20 20 20 2f 2a 20 4e 6f 74 20 66 6f 75 6e  .    /* Not foun
28e0: 64 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  d.  If the name 
28f0: 77 65 20 77 65 72 65 20 6c 6f 6f 6b 69 6e 67 20  we were looking 
2900: 66 6f 72 20 77 61 73 20 74 65 6d 70 2e 73 71 6c  for was temp.sql
2910: 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 20 20 2a  ite_master.    *
2920: 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68  * then change th
2930: 65 20 6e 61 6d 65 20 74 6f 20 73 71 6c 69 74 65  e name to sqlite
2940: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 61 6e 64  _temp_master and
2950: 20 74 72 79 20 61 67 61 69 6e 2e 20 2a 2f 0a 20   try again. */. 
2960: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
2970: 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 4d 41 53  rICmp(zName, MAS
2980: 54 45 52 5f 4e 41 4d 45 29 21 3d 30 20 29 20 62  TER_NAME)!=0 ) b
2990: 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71  reak;.    if( sq
29a0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 44  lite3_stricmp(zD
29b0: 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62  atabase, db->aDb
29c0: 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65 29 21 3d 30  [1].zDbSName)!=0
29d0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 4e   ) break;.    zN
29e0: 61 6d 65 20 3d 20 54 45 4d 50 5f 4d 41 53 54 45  ame = TEMP_MASTE
29f0: 52 5f 4e 41 4d 45 3b 0a 20 20 7d 0a 20 20 72 65  R_NAME;.  }.  re
2a00: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2a10: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
2a20: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
2a30: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
2a40: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
2a50: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
2a60: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2a70: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
2a80: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
2a90: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
2aa0: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
2ab0: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
2ac0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
2ad0: 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c  t found.  Also l
2ae0: 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eave an.** error
2af0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2b00: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
2b10: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
2b20: 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
2b30: 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74  outine and sqlit
2b40: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73  e3FindTable() is
2b50: 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f   that this.** ro
2b60: 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20  utine leaves an 
2b70: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
2b80: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
2b90: 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65   where.** sqlite
2ba0: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65  3FindTable() doe
2bb0: 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20  s not..*/.Table 
2bc0: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
2bd0: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
2be0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2bf0: 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63   context in whic
2c00: 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f  h to report erro
2c10: 72 73 20 2a 2f 0a 20 20 75 33 32 20 66 6c 61 67  rs */.  u32 flag
2c20: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
2c30: 2a 20 4c 4f 43 41 54 45 5f 56 49 45 57 20 6f 72  * LOCATE_VIEW or
2c40: 20 4c 4f 43 41 54 45 5f 4e 4f 45 52 52 20 2a 2f   LOCATE_NOERR */
2c50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2c60: 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d  Name,     /* Nam
2c70: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77  e of the table w
2c80: 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f  e are looking fo
2c90: 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
2ca0: 72 20 2a 7a 44 62 61 73 65 20 20 20 20 20 2f 2a  r *zDbase     /*
2cb0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
2cc0: 61 62 61 73 65 2e 20 20 4d 69 67 68 74 20 62 65  abase.  Might be
2cd0: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 61   NULL */.){.  Ta
2ce0: 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  ble *p;.  sqlite
2cf0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
2d00: 64 62 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74  db;..  /* Read t
2d10: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
2d20: 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ma. If an error 
2d30: 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
2d40: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
2d50: 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20   ** and code in 
2d60: 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
2d70: 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28  n NULL. */.  if(
2d80: 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26   (db->mDbFlags &
2d90: 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e   DBFLAG_SchemaKn
2da0: 6f 77 6e 4f 6b 29 3d 3d 30 20 0a 20 20 20 26 26  ownOk)==0 .   &&
2db0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
2dc0: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
2dd0: 61 72 73 65 29 0a 20 20 29 7b 0a 20 20 20 20 72  arse).  ){.    r
2de0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
2df0: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  p = sqlite3FindT
2e00: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
2e10: 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  zDbase);.  if( p
2e20: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==0 ){.    const
2e30: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 66 6c   char *zMsg = fl
2e40: 61 67 73 20 26 20 4c 4f 43 41 54 45 5f 56 49 45  ags & LOCATE_VIE
2e50: 57 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65  W ? "no such vie
2e60: 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61  w" : "no such ta
2e70: 62 6c 65 22 3b 0a 23 69 66 6e 64 65 66 20 53 51  ble";.#ifndef SQ
2e80: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2e90: 4c 54 41 42 4c 45 0a 20 20 20 20 2f 2a 20 49 66  LTABLE.    /* If
2ea0: 20 7a 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 6f   zName is the no
2eb0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
2ec0: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 73 63 68  table in the sch
2ed0: 65 6d 61 20 63 72 65 61 74 65 64 20 75 73 69 6e  ema created usin
2ee0: 67 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 2c  g.    ** CREATE,
2ef0: 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73   then check to s
2f00: 65 65 20 69 66 20 69 74 20 69 73 20 74 68 65 20  ee if it is the 
2f10: 6e 61 6d 65 20 6f 66 20 61 6e 20 76 69 72 74 75  name of an virtu
2f20: 61 6c 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20  al table that.  
2f30: 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 6e 20 65    ** can be an e
2f40: 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c  ponymous virtual
2f50: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 4d   table. */.    M
2f60: 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d  odule *pMod = (M
2f70: 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 33 48 61  odule*)sqlite3Ha
2f80: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64  shFind(&db->aMod
2f90: 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ule, zName);.   
2fa0: 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20 26 26 20   if( pMod==0 && 
2fb0: 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
2fc0: 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d 61 5f  (zName, "pragma_
2fd0: 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 7)==0 ){.    
2fe0: 20 20 70 4d 6f 64 20 3d 20 73 71 6c 69 74 65 33    pMod = sqlite3
2ff0: 50 72 61 67 6d 61 56 74 61 62 52 65 67 69 73 74  PragmaVtabRegist
3000: 65 72 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  er(db, zName);. 
3010: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4d 6f     }.    if( pMo
3020: 64 20 26 26 20 73 71 6c 69 74 65 33 56 74 61 62  d && sqlite3Vtab
3030: 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 49 6e  EponymousTableIn
3040: 69 74 28 70 50 61 72 73 65 2c 20 70 4d 6f 64 29  it(pParse, pMod)
3050: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
3060: 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 3b 0a   pMod->pEpoTab;.
3070: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
3080: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4c 4f   if( (flags & LO
3090: 43 41 54 45 5f 4e 4f 45 52 52 29 3d 3d 30 20 29  CATE_NOERR)==0 )
30a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 44 62 61  {.      if( zDba
30b0: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  se ){.        sq
30c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
30d0: 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73  arse, "%s: %s.%s
30e0: 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c  ", zMsg, zDbase,
30f0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
3100: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
3110: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3120: 61 72 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20  arse, "%s: %s", 
3130: 7a 4d 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  zMsg, zName);.  
3140: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 72      }.      pPar
3150: 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
3160: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
3170: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
3180: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
3190: 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64  table identified
31a0: 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   by *p..**.** Th
31b0: 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72 20  is is a wrapper 
31c0: 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 4c 6f  around sqlite3Lo
31d0: 63 61 74 65 54 61 62 6c 65 28 29 2e 20 54 68 65  cateTable(). The
31e0: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
31f0: 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 4c 6f  een.** sqlite3Lo
3200: 63 61 74 65 54 61 62 6c 65 28 29 20 61 6e 64 20  cateTable() and 
3210: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
3220: 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
3230: 69 6f 6e 20 72 65 73 74 72 69 63 74 73 0a 2a 2a  ion restricts.**
3240: 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 73   the search to s
3250: 63 68 65 6d 61 20 28 70 2d 3e 70 53 63 68 65 6d  chema (p->pSchem
3260: 61 29 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  a) if it is not 
3270: 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68 65 6d 61  NULL. p->pSchema
3280: 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e   may be.** non-N
3290: 55 4c 4c 20 69 66 20 69 74 20 69 73 20 70 61 72  ULL if it is par
32a0: 74 20 6f 66 20 61 20 76 69 65 77 20 6f 72 20 74  t of a view or t
32b0: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 64  rigger program d
32c0: 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65 65 0a 2a  efinition. See.*
32d0: 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c  * sqlite3FixSrcL
32e0: 69 73 74 28 29 20 66 6f 72 20 64 65 74 61 69 6c  ist() for detail
32f0: 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  s..*/.Table *sql
3300: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
3310: 74 65 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  tem(.  Parse *pP
3320: 61 72 73 65 2c 20 0a 20 20 75 33 32 20 66 6c 61  arse, .  u32 fla
3330: 67 73 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63  gs,.  struct Src
3340: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a 29 7b 0a  List_item *p.){.
3350: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
3360: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  b;.  assert( p->
3370: 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c 20 70 2d  pSchema==0 || p-
3380: 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 29 3b  >zDatabase==0 );
3390: 0a 20 20 69 66 28 20 70 2d 3e 70 53 63 68 65 6d  .  if( p->pSchem
33a0: 61 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62  a ){.    int iDb
33b0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
33c0: 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
33d0: 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b  db, p->pSchema);
33e0: 0a 20 20 20 20 7a 44 62 20 3d 20 70 50 61 72 73  .    zDb = pPars
33f0: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
3400: 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73  zDbSName;.  }els
3410: 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e  e{.    zDb = p->
3420: 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20  zDatabase;.  }. 
3430: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c   return sqlite3L
3440: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
3450: 65 2c 20 66 6c 61 67 73 2c 20 70 2d 3e 7a 4e 61  e, flags, p->zNa
3460: 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  me, zDb);.}../*.
3470: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
3480: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
3490: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
34a0: 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61   .** a particula
34b0: 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68  r index given th
34c0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69  e name of that i
34d0: 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ndex.** and the 
34e0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
34f0: 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69  base that contai
3500: 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  ns the index..**
3510: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
3520: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
3530: 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73   If zDatabase is
3540: 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65   0, all database
3550: 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66  s are searched f
3560: 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  or the.** table 
3570: 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d 61  and the first ma
3580: 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20  tching index is 
3590: 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63  returned.  (No c
35a0: 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64  hecking.** for d
35b0: 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e  uplicate index n
35c0: 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20  ames is done.)  
35d0: 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72  The search order
35e0: 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73   is.** TEMP firs
35f0: 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68  t, then MAIN, th
3600: 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79  en any auxiliary
3610: 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64   databases added
3620: 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54  .** using the AT
3630: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  TACH command..*/
3640: 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46  .Index *sqlite3F
3650: 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33  indIndex(sqlite3
3660: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
3670: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
3680: 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64  har *zDb){.  Ind
3690: 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  ex *p = 0;.  int
36a0: 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74   i;.  /* All mut
36b0: 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65  exes are require
36c0: 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63  d for schema acc
36d0: 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ess.  Make sure 
36e0: 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f  we hold them. */
36f0: 0a 20 20 61 73 73 65 72 74 28 20 7a 44 62 21 3d  .  assert( zDb!=
3700: 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  0 || sqlite3Btre
3710: 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
3720: 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  (db) );.  for(i=
3730: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
3740: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3750: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
3760: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53  ? i^1 : i;  /* S
3770: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
3780: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63  e MAIN */.    Sc
3790: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
37a0: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
37b0: 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ma;.    assert( 
37c0: 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69  pSchema );.    i
37d0: 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65  f( zDb && sqlite
37e0: 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62  3StrICmp(zDb, db
37f0: 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[j].zDbSNam
3800: 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
3810: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
3820: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
3830: 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20  d(db, j, 0) );. 
3840: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
3850: 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d  shFind(&pSchema-
3860: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29  >idxHash, zName)
3870: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72  ;.    if( p ) br
3880: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
3890: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
38a0: 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79  claim the memory
38b0: 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65   used by an inde
38c0: 78 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  x.*/.void sqlite
38d0: 33 46 72 65 65 49 6e 64 65 78 28 73 71 6c 69 74  3FreeIndex(sqlit
38e0: 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70  e3 *db, Index *p
38f0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
3900: 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20  E_OMIT_ANALYZE. 
3910: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e   sqlite3DeleteIn
3920: 64 65 78 53 61 6d 70 6c 65 73 28 64 62 2c 20 70  dexSamples(db, p
3930: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
3940: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
3950: 2c 20 70 2d 3e 70 50 61 72 74 49 64 78 57 68 65  , p->pPartIdxWhe
3960: 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  re);.  sqlite3Ex
3970: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
3980: 20 70 2d 3e 61 43 6f 6c 45 78 70 72 29 3b 0a 20   p->aColExpr);. 
3990: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
39a0: 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  b, p->zColAff);.
39b0: 20 20 69 66 28 20 70 2d 3e 69 73 52 65 73 69 7a    if( p->isResiz
39c0: 65 64 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ed ) sqlite3DbFr
39d0: 65 65 28 64 62 2c 20 28 76 6f 69 64 20 2a 29 70  ee(db, (void *)p
39e0: 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64 65  ->azColl);.#ifde
39f0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
3a00: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
3a10: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
3a20: 3e 61 69 52 6f 77 45 73 74 29 3b 0a 23 65 6e 64  >aiRowEst);.#end
3a30: 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  if.  sqlite3DbFr
3a40: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
3a50: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65  .** For the inde
3a60: 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d  x called zIdxNam
3a70: 65 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64  e which is found
3a80: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
3a90: 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20   iDb,.** unlike 
3aa0: 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20  that index from 
3ab0: 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72  its Table then r
3ac0: 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
3ad0: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65  from.** the inde
3ae0: 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  x hash table and
3af0: 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   free all memory
3b00: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
3b10: 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
3b20: 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69  he index..*/.voi
3b30: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
3b40: 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  ndDeleteIndex(sq
3b50: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
3b60: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
3b70: 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64  zIdxName){.  Ind
3b80: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61  ex *pIndex;.  Ha
3b90: 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73  sh *pHash;..  as
3ba0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
3bb0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
3bc0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48   iDb, 0) );.  pH
3bd0: 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  ash = &db->aDb[i
3be0: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db].pSchema->idx
3bf0: 48 61 73 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d  Hash;.  pIndex =
3c00: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
3c10: 72 74 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61  rt(pHash, zIdxNa
3c20: 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 4c  me, 0);.  if( AL
3c30: 57 41 59 53 28 70 49 6e 64 65 78 29 20 29 7b 0a  WAYS(pIndex) ){.
3c40: 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
3c50: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d  pTable->pIndex==
3c60: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
3c70: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3c80: 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d  pIndex = pIndex-
3c90: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
3ca0: 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
3cb0: 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74  p;.      /* Just
3cc0: 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57  ification of ALW
3cd0: 41 59 53 28 29 3b 20 20 54 68 65 20 69 6e 64 65  AYS();  The inde
3ce0: 78 20 6d 75 73 74 20 62 65 20 6f 6e 20 74 68 65  x must be on the
3cf0: 20 6c 69 73 74 20 6f 66 0a 20 20 20 20 20 20 2a   list of.      *
3d00: 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20  * indices. */.  
3d10: 20 20 20 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e      p = pIndex->
3d20: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a  pTable->pIndex;.
3d30: 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
3d40: 41 59 53 28 70 29 20 26 26 20 70 2d 3e 70 4e 65  AYS(p) && p->pNe
3d50: 78 74 21 3d 70 49 6e 64 65 78 20 29 7b 20 70 20  xt!=pIndex ){ p 
3d60: 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20  = p->pNext; }.  
3d70: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
3d80: 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49   && p->pNext==pI
3d90: 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20  ndex) ){.       
3da0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64   p->pNext = pInd
3db0: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ex->pNext;.     
3dc0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
3dd0: 69 74 65 33 46 72 65 65 49 6e 64 65 78 28 64 62  ite3FreeIndex(db
3de0: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20  , pIndex);.  }. 
3df0: 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d   db->mDbFlags |=
3e00: 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68   DBFLAG_SchemaCh
3e10: 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  ange;.}../*.** L
3e20: 6f 6f 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20  ook through the 
3e30: 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20 64 61 74  list of open dat
3e40: 61 62 61 73 65 20 66 69 6c 65 73 20 69 6e 20 64  abase files in d
3e50: 62 2d 3e 61 44 62 5b 5d 20 61 6e 64 20 69 66 0a  b->aDb[] and if.
3e60: 2a 2a 20 61 6e 79 20 68 61 76 65 20 62 65 65 6e  ** any have been
3e70: 20 63 6c 6f 73 65 64 2c 20 72 65 6d 6f 76 65 20   closed, remove 
3e80: 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 6c 69  them from the li
3e90: 73 74 2e 20 20 52 65 61 6c 6c 6f 63 61 74 65 20  st.  Reallocate 
3ea0: 74 68 65 0a 2a 2a 20 64 62 2d 3e 61 44 62 5b 5d  the.** db->aDb[]
3eb0: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 20   structure to a 
3ec0: 73 6d 61 6c 6c 65 72 20 73 69 7a 65 2c 20 69 66  smaller size, if
3ed0: 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a   possible..**.**
3ee0: 20 45 6e 74 72 79 20 30 20 28 74 68 65 20 22 6d   Entry 0 (the "m
3ef0: 61 69 6e 22 20 64 61 74 61 62 61 73 65 29 20 61  ain" database) a
3f00: 6e 64 20 65 6e 74 72 79 20 31 20 28 74 68 65 20  nd entry 1 (the 
3f10: 22 74 65 6d 70 22 20 64 61 74 61 62 61 73 65 29  "temp" database)
3f20: 0a 2a 2a 20 61 72 65 20 6e 65 76 65 72 20 63 61  .** are never ca
3f30: 6e 64 69 64 61 74 65 73 20 66 6f 72 20 62 65 69  ndidates for bei
3f40: 6e 67 20 63 6f 6c 6c 61 70 73 65 64 2e 0a 2a 2f  ng collapsed..*/
3f50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c  .void sqlite3Col
3f60: 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72 72  lapseDatabaseArr
3f70: 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ay(sqlite3 *db){
3f80: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66  .  int i, j;.  f
3f90: 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e  or(i=j=2; i<db->
3fa0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nDb; i++){.    s
3fb0: 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20  truct Db *pDb = 
3fc0: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
3fd0: 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30   if( pDb->pBt==0
3fe0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3ff0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 62 2d  3DbFree(db, pDb-
4000: 3e 7a 44 62 53 4e 61 6d 65 29 3b 0a 20 20 20 20  >zDbSName);.    
4010: 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 20    pDb->zDbSName 
4020: 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 0;.      conti
4030: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
4040: 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20  f( j<i ){.      
4050: 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d  db->aDb[j] = db-
4060: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  >aDb[i];.    }. 
4070: 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 64 62     j++;.  }.  db
4080: 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28  ->nDb = j;.  if(
4090: 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64   db->nDb<=2 && d
40a0: 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53  b->aDb!=db->aDbS
40b0: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d  tatic ){.    mem
40c0: 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69  cpy(db->aDbStati
40d0: 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69  c, db->aDb, 2*si
40e0: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29  zeof(db->aDb[0])
40f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
4100: 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62  Free(db, db->aDb
4110: 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d  );.    db->aDb =
4120: 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a   db->aDbStatic;.
4130: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73    }.}../*.** Res
4140: 65 74 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f  et the schema fo
4150: 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  r the database a
4160: 74 20 69 6e 64 65 78 20 69 44 62 2e 20 20 41 6c  t index iDb.  Al
4170: 73 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20  so reset the.** 
4180: 54 45 4d 50 20 73 63 68 65 6d 61 2e 20 20 54 68  TEMP schema.  Th
4190: 65 20 72 65 73 65 74 20 69 73 20 64 65 66 65 72  e reset is defer
41a0: 72 65 64 20 69 66 20 64 62 2d 3e 6e 53 63 68 65  red if db->nSche
41b0: 6d 61 4c 6f 63 6b 20 69 73 20 6e 6f 74 20 7a 65  maLock is not ze
41c0: 72 6f 2e 0a 2a 2a 20 44 65 66 65 72 72 65 64 20  ro..** Deferred 
41d0: 72 65 73 65 74 73 20 6d 61 79 20 62 65 20 72 75  resets may be ru
41e0: 6e 20 62 79 20 63 61 6c 6c 69 6e 67 20 77 69 74  n by calling wit
41f0: 68 20 69 44 62 3c 30 2e 0a 2a 2f 0a 76 6f 69 64  h iDb<0..*/.void
4200: 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65   sqlite3ResetOne
4210: 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a  Schema(sqlite3 *
4220: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
4230: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
4240: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
4250: 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b  .  if( iDb>=0 ){
4260: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
4270: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
4280: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
4290: 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70  );.    DbSetProp
42a0: 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42  erty(db, iDb, DB
42b0: 5f 52 65 73 65 74 57 61 6e 74 65 64 29 3b 0a 20  _ResetWanted);. 
42c0: 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79     DbSetProperty
42d0: 28 64 62 2c 20 31 2c 20 44 42 5f 52 65 73 65 74  (db, 1, DB_Reset
42e0: 57 61 6e 74 65 64 29 3b 0a 20 20 20 20 64 62 2d  Wanted);.    db-
42f0: 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e 44 42  >mDbFlags &= ~DB
4300: 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e  FLAG_SchemaKnown
4310: 4f 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 64  Ok;.  }..  if( d
4320: 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d  b->nSchemaLock==
4330: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
4340: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
4350: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 44 62 48  ){.      if( DbH
4360: 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  asProperty(db, i
4370: 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64  , DB_ResetWanted
4380: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
4390: 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28  ite3SchemaClear(
43a0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65  db->aDb[i].pSche
43b0: 6d 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ma);.      }.   
43c0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
43d0: 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61  Erase all schema
43e0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
43f0: 6d 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  m all attached d
4400: 61 74 61 62 61 73 65 73 20 28 69 6e 63 6c 75 64  atabases (includ
4410: 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61 6e  ing.** "main" an
4420: 64 20 22 74 65 6d 70 22 29 20 66 6f 72 20 61 20  d "temp") for a 
4430: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
4440: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
4450: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74  oid sqlite3Reset
4460: 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e  AllSchemasOfConn
4470: 65 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  ection(sqlite3 *
4480: 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  db){.  int i;.  
4490: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
44a0: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28  rAll(db);.  for(
44b0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
44c0: 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44  i++){.    Db *pD
44d0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
44e0: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53  .    if( pDb->pS
44f0: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 69  chema ){.      i
4500: 66 28 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f  f( db->nSchemaLo
4510: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ck==0 ){.       
4520: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c   sqlite3SchemaCl
4530: 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61  ear(pDb->pSchema
4540: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
4550: 20 20 20 20 20 20 20 20 44 62 53 65 74 50 72 6f          DbSetPro
4560: 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f  perty(db, i, DB_
4570: 52 65 73 65 74 57 61 6e 74 65 64 29 3b 0a 20 20  ResetWanted);.  
4580: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4590: 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26    db->mDbFlags &
45a0: 3d 20 7e 28 44 42 46 4c 41 47 5f 53 63 68 65 6d  = ~(DBFLAG_Schem
45b0: 61 43 68 61 6e 67 65 7c 44 42 46 4c 41 47 5f 53  aChange|DBFLAG_S
45c0: 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 29 3b 0a 20  chemaKnownOk);. 
45d0: 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f   sqlite3VtabUnlo
45e0: 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73 71  ckList(db);.  sq
45f0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
4600: 6c 6c 28 64 62 29 3b 0a 20 20 69 66 28 20 64 62  ll(db);.  if( db
4610: 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30  ->nSchemaLock==0
4620: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
4630: 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41  ollapseDatabaseA
4640: 72 72 61 79 28 64 62 29 3b 0a 20 20 7d 0a 7d 0a  rray(db);.  }.}.
4650: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4660: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
4670: 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75  en a commit occu
4680: 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rs..*/.void sqli
4690: 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
46a0: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  lChanges(sqlite3
46b0: 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 6d 44 62   *db){.  db->mDb
46c0: 46 6c 61 67 73 20 26 3d 20 7e 44 42 46 4c 41 47  Flags &= ~DBFLAG
46d0: 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 7d  _SchemaChange;.}
46e0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 6d  ../*.** Delete m
46f0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20  emory allocated 
4700: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  for the column n
4710: 61 6d 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20  ames of a table 
4720: 6f 72 20 76 69 65 77 20 28 74 68 65 0a 2a 2a 20  or view (the.** 
4730: 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72 72  Table.aCol[] arr
4740: 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ay)..*/.void sql
4750: 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  ite3DeleteColumn
4760: 4e 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64  Names(sqlite3 *d
4770: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
4780: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  ){.  int i;.  Co
4790: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73  lumn *pCol;.  as
47a0: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
47b0: 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d  );.  if( (pCol =
47c0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d   pTable->aCol)!=
47d0: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
47e0: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
47f0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
4800: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4810: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
4820: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
4830: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
4840: 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  , pCol->pDflt);.
4850: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4860: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43  ree(db, pCol->zC
4870: 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  oll);.    }.    
4880: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4890: 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b  , pTable->aCol);
48a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
48b0: 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  move the memory 
48c0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
48d0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
48e0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62  the given.** Tab
48f0: 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20  le.  No changes 
4900: 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b  are made to disk
4910: 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
4920: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
4930: 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65  tine just delete
4940: 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63  s the data struc
4950: 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e  ture.  It does n
4960: 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65  ot unlink.** the
4970: 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75   table data stru
4980: 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68  cture from the h
4990: 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20  ash table.  But 
49a0: 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a  it does destroy.
49b0: 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ** memory struct
49c0: 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69  ures of the indi
49d0: 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20  ces and foreign 
49e0: 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  keys associated 
49f0: 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62  with .** the tab
4a00: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 62  le..**.** The db
4a10: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 70   parameter is op
4a20: 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69 73 20 6e  tional.  It is n
4a30: 65 65 64 65 64 20 69 66 20 74 68 65 20 54 61 62  eeded if the Tab
4a40: 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f  le object .** co
4a50: 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73 69 64 65  ntains lookaside
4a60: 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61 62 6c 65   memory.  (Table
4a70: 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20   objects in the 
4a80: 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74 20 75 73  schema do not us
4a90: 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20 6d  e.** lookaside m
4aa0: 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f 6d 65 20  emory, but some 
4ab0: 65 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  ephemeral Table 
4ac0: 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20 20 4f 72  objects do.)  Or
4ad0: 20 74 68 65 0a 2a 2a 20 64 62 20 70 61 72 61 6d   the.** db param
4ae0: 65 74 65 72 20 63 61 6e 20 62 65 20 75 73 65 64  eter can be used
4af0: 20 77 69 74 68 20 64 62 2d 3e 70 6e 42 79 74 65   with db->pnByte
4b00: 73 46 72 65 65 64 20 74 6f 20 6d 65 61 73 75 72  sFreed to measur
4b10: 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  e the memory.** 
4b20: 75 73 65 64 20 62 79 20 74 68 65 20 54 61 62 6c  used by the Tabl
4b30: 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  e object..*/.sta
4b40: 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54 45 5f  tic void SQLITE_
4b50: 4e 4f 49 4e 4c 49 4e 45 20 64 65 6c 65 74 65 54  NOINLINE deleteT
4b60: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
4b70: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
4b80: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
4b90: 78 2c 20 2a 70 4e 65 78 74 3b 0a 0a 23 69 66 64  x, *pNext;..#ifd
4ba0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
4bb0: 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
4bc0: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  number of outsta
4bd0: 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20  nding lookaside 
4be0: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20 73  allocations in s
4bf0: 63 68 65 6d 61 20 54 61 62 6c 65 73 0a 20 20 2a  chema Tables.  *
4c00: 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  * prior to doing
4c10: 20 61 6e 79 20 66 72 65 65 28 29 20 6f 70 65 72   any free() oper
4c20: 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20 73  ations.  Since s
4c30: 63 68 65 6d 61 20 54 61 62 6c 65 73 20 64 6f 20  chema Tables do 
4c40: 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f  not use.  ** loo
4c50: 6b 61 73 69 64 65 2c 20 74 68 69 73 20 6e 75 6d  kaside, this num
4c60: 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63  ber should not c
4c70: 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 69 6e 74 20  hange. */.  int 
4c80: 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 30 3b 0a  nLookaside = 0;.
4c90: 20 20 69 66 28 20 64 62 20 26 26 20 28 70 54 61    if( db && (pTa
4ca0: 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  ble->tabFlags & 
4cb0: 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30  TF_Ephemeral)==0
4cc0: 20 29 7b 0a 20 20 20 20 6e 4c 6f 6f 6b 61 73 69   ){.    nLookasi
4cd0: 64 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 6f 6b  de = sqlite3Look
4ce0: 61 73 69 64 65 55 73 65 64 28 64 62 2c 20 30 29  asideUsed(db, 0)
4cf0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
4d00: 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e  /* Delete all in
4d10: 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
4d20: 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65   with this table
4d30: 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65  . */.  for(pInde
4d40: 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64  x = pTable->pInd
4d50: 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
4d60: 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ex=pNext){.    p
4d70: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
4d80: 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74  Next;.    assert
4d90: 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  ( pIndex->pSchem
4da0: 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  a==pTable->pSche
4db0: 6d 61 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ma.         || (
4dc0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65  IsVirtual(pTable
4dd0: 29 20 26 26 20 70 49 6e 64 65 78 2d 3e 69 64 78  ) && pIndex->idx
4de0: 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58  Type!=SQLITE_IDX
4df0: 54 59 50 45 5f 41 50 50 44 45 46 29 20 29 3b 0a  TYPE_APPDEF) );.
4e00: 20 20 20 20 69 66 28 20 28 64 62 3d 3d 30 20 7c      if( (db==0 |
4e10: 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  | db->pnBytesFre
4e20: 65 64 3d 3d 30 29 20 26 26 20 21 49 73 56 69 72  ed==0) && !IsVir
4e30: 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 7b 0a  tual(pTable) ){.
4e40: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
4e50: 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  e = pIndex->zNam
4e60: 65 3b 20 0a 20 20 20 20 20 20 54 45 53 54 4f 4e  e; .      TESTON
4e70: 4c 59 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64  LY ( Index *pOld
4e80: 20 3d 20 29 20 73 71 6c 69 74 65 33 48 61 73 68   = ) sqlite3Hash
4e90: 49 6e 73 65 72 74 28 0a 20 20 20 20 20 20 20 20  Insert(.        
4ea0: 20 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d   &pIndex->pSchem
4eb0: 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  a->idxHash, zNam
4ec0: 65 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  e, 0.      );.  
4ed0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d      assert( db==
4ee0: 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 63 68 65  0 || sqlite3Sche
4ef0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
4f00: 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  0, pIndex->pSche
4f10: 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ma) );.      ass
4f20: 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65  ert( pOld==pInde
4f30: 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a  x || pOld==0 );.
4f40: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
4f50: 33 46 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70  3FreeIndex(db, p
4f60: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Index);.  }..  /
4f70: 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 66 6f 72  * Delete any for
4f80: 65 69 67 6e 20 6b 65 79 73 20 61 74 74 61 63 68  eign keys attach
4f90: 65 64 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  ed to this table
4fa0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 6b  . */.  sqlite3Fk
4fb0: 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c  Delete(db, pTabl
4fc0: 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  e);..  /* Delete
4fd0: 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
4fe0: 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  ture itself..  *
4ff0: 2f 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74  /.  sqlite3Delet
5000: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c  eColumnNames(db,
5010: 20 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69   pTable);.  sqli
5020: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
5030: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
5040: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5050: 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66  , pTable->zColAf
5060: 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  f);.  sqlite3Sel
5070: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  ectDelete(db, pT
5080: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  able->pSelect);.
5090: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
50a0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62  tDelete(db, pTab
50b0: 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 69 66  le->pCheck);.#if
50c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
50d0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
50e0: 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72  sqlite3VtabClear
50f0: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 23 65  (db, pTable);.#e
5100: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62  ndif.  sqlite3Db
5110: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 29  Free(db, pTable)
5120: 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  ;..  /* Verify t
5130: 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69 64 65  hat no lookaside
5140: 20 6d 65 6d 6f 72 79 20 77 61 73 20 75 73 65 64   memory was used
5150: 20 62 79 20 73 63 68 65 6d 61 20 74 61 62 6c 65   by schema table
5160: 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  s */.  assert( n
5170: 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c 7c 20  Lookaside==0 || 
5180: 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 73 71 6c 69  nLookaside==sqli
5190: 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64  te3LookasideUsed
51a0: 28 64 62 2c 30 29 20 29 3b 0a 7d 0a 76 6f 69 64  (db,0) );.}.void
51b0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
51c0: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
51d0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
51e0: 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c  .  /* Do not del
51f0: 65 74 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e  ete the table un
5200: 74 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63  til the referenc
5210: 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  e count reaches 
5220: 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 21  zero. */.  if( !
5230: 70 54 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b  pTable ) return;
5240: 0a 20 20 69 66 28 20 28 28 21 64 62 20 7c 7c 20  .  if( ((!db || 
5250: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
5260: 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54 61 62 6c  ==0) && (--pTabl
5270: 65 2d 3e 6e 54 61 62 52 65 66 29 3e 30 29 20 29  e->nTabRef)>0) )
5280: 20 72 65 74 75 72 6e 3b 0a 20 20 64 65 6c 65 74   return;.  delet
5290: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 6c  eTable(db, pTabl
52a0: 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e  e);.}.../*.** Un
52b0: 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74  link the given t
52c0: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61  able from the ha
52d0: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68  sh tables and th
52e0: 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  e delete the.** 
52f0: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
5300: 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64  with all its ind
5310: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
5320: 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   keys..*/.void s
5330: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
5340: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
5350: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
5360: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
5370: 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  bName){.  Table 
5380: 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  *p;.  Db *pDb;..
5390: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
53a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
53b0: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
53c0: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
53d0: 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61 73  zTabName );.  as
53e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
53f0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
5400: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 74 65   iDb, 0) );.  te
5410: 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61 6d 65  stcase( zTabName
5420: 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a 65  [0]==0 );  /* Ze
5430: 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65 20  ro-length table 
5440: 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77 65  names are allowe
5450: 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62  d */.  pDb = &db
5460: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20  ->aDb[iDb];.  p 
5470: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
5480: 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  ert(&pDb->pSchem
5490: 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62  a->tblHash, zTab
54a0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Name, 0);.  sqli
54b0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
54c0: 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 6d 44 62  b, p);.  db->mDb
54d0: 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f  Flags |= DBFLAG_
54e0: 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 7d 0a  SchemaChange;.}.
54f0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74  ./*.** Given a t
5500: 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73  oken, return a s
5510: 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69  tring that consi
5520: 73 74 73 20 6f 66 20 74 68 65 20 74 65 78 74 20  sts of the text 
5530: 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e  of that.** token
5540: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
5550: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
5560: 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69  ring.** is obtai
5570: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
5580: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
5590: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
55a0: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
55b0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  tion..**.** Any 
55c0: 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20  quotation marks 
55d0: 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e  (ex:  "name", 'n
55e0: 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72  ame', [name], or
55f0: 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a   `name`) that.**
5600: 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20 62 6f   surround the bo
5610: 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20  dy of the token 
5620: 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a  are removed..**.
5630: 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66  ** Tokens are of
5640: 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72  ten just pointer
5650: 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  s into the origi
5660: 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64  nal SQL text and
5670: 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c   so.** are not \
5680: 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61  000 terminated a
5690: 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69  nd are not persi
56a0: 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75  stent.  The retu
56b0: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
56c0: 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  s \000 terminate
56d0: 64 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74  d and is persist
56e0: 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  ent..*/.char *sq
56f0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
5700: 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  en(sqlite3 *db, 
5710: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
5720: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
5730: 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
5740: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
5750: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
5760: 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70  har*)pName->z, p
5770: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71  Name->n);.    sq
5780: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
5790: 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
57a0: 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d    zName = 0;.  }
57b0: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
57c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
57d0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
57e0: 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e   table stored in
57f0: 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   database number
5800: 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74   iDb for.** writ
5810: 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69  ing. The table i
5820: 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63  s opened using c
5830: 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ursor 0..*/.void
5840: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
5850: 65 72 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  erTable(Parse *p
5860: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
5870: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
5880: 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73 71 6c  etVdbe(p);.  sql
5890: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ite3TableLock(p,
58a0: 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f   iDb, MASTER_ROO
58b0: 54 2c 20 31 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  T, 1, MASTER_NAM
58c0: 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  E);.  sqlite3Vdb
58d0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
58e0: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d  _OpenWrite, 0, M
58f0: 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69 44 62 2c  ASTER_ROOT, iDb,
5900: 20 35 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 54   5);.  if( p->nT
5910: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ab==0 ){.    p->
5920: 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  nTab = 1;.  }.}.
5930: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
5940: 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f   zName points to
5950: 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
5960: 64 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  d buffer contain
5970: 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20  ing the name.** 
5980: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28 22  of a database ("
5990: 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 6f 72  main", "temp" or
59a0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
59b0: 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68  attached db). Th
59c0: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  is.** function r
59d0: 65 74 75 72 6e 73 20 74 68 65 20 69 6e 64 65 78  eturns the index
59e0: 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61   of the named da
59f0: 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44  tabase in db->aD
5a00: 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20 69 66  b[], or.** -1 if
5a10: 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 63 61   the named db ca
5a20: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
5a30: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e  /.int sqlite3Fin
5a40: 64 44 62 4e 61 6d 65 28 73 71 6c 69 74 65 33 20  dDbName(sqlite3 
5a50: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
5a60: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
5a70: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f   = -1;         /
5a80: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
5a90: 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e 61 6d 65  r */.  if( zName
5aa0: 20 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 3b   ){.    Db *pDb;
5ab0: 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e  .    for(i=(db->
5ac0: 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d  nDb-1), pDb=&db-
5ad0: 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69  >aDb[i]; i>=0; i
5ae0: 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20  --, pDb--){.    
5af0: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
5b00: 5f 73 74 72 69 63 6d 70 28 70 44 62 2d 3e 7a 44  _stricmp(pDb->zD
5b10: 62 53 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29  bSName, zName) )
5b20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a   break;.      /*
5b30: 20 22 6d 61 69 6e 22 20 69 73 20 61 6c 77 61 79   "main" is alway
5b40: 73 20 61 6e 20 61 63 63 65 70 74 61 62 6c 65 20  s an acceptable 
5b50: 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 70 72  alias for the pr
5b60: 69 6d 61 72 79 20 64 61 74 61 62 61 73 65 0a 20  imary database. 
5b70: 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 69 66 20       ** even if 
5b80: 69 74 20 68 61 73 20 62 65 65 6e 20 72 65 6e 61  it has been rena
5b90: 6d 65 64 20 75 73 69 6e 67 20 53 51 4c 49 54 45  med using SQLITE
5ba0: 5f 44 42 43 4f 4e 46 49 47 5f 4d 41 49 4e 44 42  _DBCONFIG_MAINDB
5bb0: 4e 41 4d 45 2e 20 2a 2f 0a 20 20 20 20 20 20 69  NAME. */.      i
5bc0: 66 28 20 69 3d 3d 30 20 26 26 20 30 3d 3d 73 71  f( i==0 && 0==sq
5bd0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 22 6d  lite3_stricmp("m
5be0: 61 69 6e 22 2c 20 7a 4e 61 6d 65 29 20 29 20 62  ain", zName) ) b
5bf0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
5c00: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f    return i;.}../
5c10: 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a  *.** The token *
5c20: 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74  pName contains t
5c30: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
5c40: 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d  abase (either "m
5c50: 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70  ain" or.** "temp
5c60: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
5c70: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
5c80: 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  . This routine r
5c90: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e  eturns the.** in
5ca0: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
5cb0: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
5cc0: 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66  >aDb[], or -1 if
5cd0: 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a   the named db .*
5ce0: 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
5cf0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5d00: 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a  FindDb(sqlite3 *
5d10: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
5d20: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
5d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
5d50: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  abase number */.
5d60: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d80: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 77         /* Name w
5d90: 65 20 61 72 65 20 73 65 61 72 63 68 69 6e 67 20  e are searching 
5da0: 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d  for */.  zName =
5db0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
5dc0: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
5dd0: 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 46  ;.  i = sqlite3F
5de0: 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 4e  indDbName(db, zN
5df0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
5e00: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
5e10: 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  ;.  return i;.}.
5e20: 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72  ./* The table or
5e30: 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72   view or trigger
5e40: 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64 20   name is passed 
5e50: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
5e60: 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e  via tokens.** pN
5e70: 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e  ame1 and pName2.
5e80: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61   If the table na
5e90: 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61  me was fully qua
5ea0: 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d  lified, for exam
5eb0: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ple:.**.** CREAT
5ec0: 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20  E TABLE xxx.yyy 
5ed0: 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68  (...);.** .** Th
5ee0: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
5ef0: 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e   to "xxx" and pN
5f00: 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74  ame2 "yyy". On t
5f10: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66  he other hand if
5f20: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61  .** the table na
5f30: 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20  me is not fully 
5f40: 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a  qualified, i.e.:
5f50: 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41  .**.** CREATE TA
5f60: 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a  BLE yyy(...);.**
5f70: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
5f80: 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20  is set to "yyy" 
5f90: 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22  and pName2 is ""
5fa0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5fb0: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70  tine sets the *p
5fc0: 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20  pUnqual pointer 
5fd0: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
5fe0: 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72  token (pName1 or
5ff0: 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74  .** pName2) that
6000: 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75   stores the unqu
6010: 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61  alified table na
6020: 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f  me.  The index o
6030: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
6040: 65 20 22 78 78 78 22 20 69 73 20 72 65 74 75 72  e "xxx" is retur
6050: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
6060: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a  te3TwoPartName(.
6070: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
6080: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
6090: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
60a0: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
60b0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
60c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78        /* The "xx
60d0: 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22  x" in the name "
60e0: 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78  xxx.yyy" or "xxx
60f0: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  " */.  Token *pN
6100: 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68  ame2,      /* Th
6110: 65 20 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e  e "yyy" in the n
6120: 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f  ame "xxx.yyy" */
6130: 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75  .  Token **pUnqu
6140: 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  al     /* Write 
6150: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
6160: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65  object name here
6170: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62   */.){.  int iDb
6180: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6190: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
61a0: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a   holding the obj
61b0: 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
61c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
61d0: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  b;..  assert( pN
61e0: 61 6d 65 32 21 3d 30 20 29 3b 0a 20 20 69 66 28  ame2!=0 );.  if(
61f0: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a   pName2->n>0 ){.
6200: 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74      if( db->init
6210: 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20 20  .busy ) {.      
6220: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6230: 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74  pParse, "corrupt
6240: 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20   database");.   
6250: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
6260: 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c    }.    *pUnqual
6270: 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69   = pName2;.    i
6280: 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
6290: 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  Db(db, pName1);.
62a0: 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b      if( iDb<0 ){
62b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
62c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
62d0: 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65  unknown database
62e0: 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20   %T", pName1);. 
62f0: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
6300: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
6310: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69     assert( db->i
6320: 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62  nit.iDb==0 || db
6330: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 49  ->init.busy || I
6340: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 0a  N_RENAME_OBJECT.
6350: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
6360: 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20  (db->mDbFlags & 
6370: 44 42 46 4c 41 47 5f 56 61 63 75 75 6d 29 21 3d  DBFLAG_Vacuum)!=
6380: 30 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62  0);.    iDb = db
6390: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
63a0: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
63b0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
63c0: 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  iDb;.}../*.** Tr
63d0: 75 65 20 69 66 20 50 52 41 47 4d 41 20 77 72 69  ue if PRAGMA wri
63e0: 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 69 73 20  table_schema is 
63f0: 4f 4e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ON.*/.int sqlite
6400: 33 57 72 69 74 61 62 6c 65 53 63 68 65 6d 61 28  3WritableSchema(
6410: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
6420: 74 65 73 74 63 61 73 65 28 20 28 64 62 2d 3e 66  testcase( (db->f
6430: 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57 72 69  lags&(SQLITE_Wri
6440: 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f  teSchema|SQLITE_
6450: 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 30 20 29  Defensive))==0 )
6460: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 64  ;.  testcase( (d
6470: 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45  b->flags&(SQLITE
6480: 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c  _WriteSchema|SQL
6490: 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d  ITE_Defensive))=
64a0: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
64b0: 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68   SQLITE_WriteSch
64c0: 65 6d 61 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ema );.  testcas
64d0: 65 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53  e( (db->flags&(S
64e0: 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
64f0: 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69  a|SQLITE_Defensi
6500: 76 65 29 29 3d 3d 0a 20 20 20 20 20 20 20 20 20  ve))==.         
6510: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 65 66        SQLITE_Def
6520: 65 6e 73 69 76 65 20 29 3b 0a 20 20 74 65 73 74  ensive );.  test
6530: 63 61 73 65 28 20 28 64 62 2d 3e 66 6c 61 67 73  case( (db->flags
6540: 26 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63  &(SQLITE_WriteSc
6550: 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65  hema|SQLITE_Defe
6560: 6e 73 69 76 65 29 29 3d 3d 0a 20 20 20 20 20 20  nsive))==.      
6570: 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
6580: 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c  _WriteSchema|SQL
6590: 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29 20 29  ITE_Defensive) )
65a0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 64 62 2d 3e  ;.  return (db->
65b0: 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57 72  flags&(SQLITE_Wr
65c0: 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45  iteSchema|SQLITE
65d0: 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 53 51  _Defensive))==SQ
65e0: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
65f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6600: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
6610: 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  to check if the 
6620: 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61  UTF-8 string zNa
6630: 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a  me is a legal.**
6640: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   unqualified nam
6650: 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65  e for a new sche
6660: 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65  ma object (table
6670: 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72  , index, view or
6680: 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c  .** trigger). Al
6690: 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61  l names are lega
66a0: 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65 20 74  l except those t
66b0: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 74  hat begin with t
66c0: 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71  he string.** "sq
66d0: 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72  lite_" (in upper
66e0: 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64  , lower or mixed
66f0: 20 63 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72   case). This por
6700: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65  tion of the name
6710: 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65  space.** is rese
6720: 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61  rved for interna
6730: 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  l use..*/.int sq
6740: 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74  lite3CheckObject
6750: 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72  Name(Parse *pPar
6760: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
6770: 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70  zName){.  if( !p
6780: 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e  Parse->db->init.
6790: 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e  busy && pParse->
67a0: 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20  nested==0 .     
67b0: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 57       && sqlite3W
67c0: 72 69 74 61 62 6c 65 53 63 68 65 6d 61 28 70 50  ritableSchema(pP
67d0: 61 72 73 65 2d 3e 64 62 29 3d 3d 30 0a 20 20 20  arse->db)==0.   
67e0: 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c         && 0==sql
67f0: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61  ite3StrNICmp(zNa
6800: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
6810: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
6820: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6830: 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65   "object name re
6840: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
6850: 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e  nal use: %s", zN
6860: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
6870: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
6880: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
6890: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
68a0: 52 65 74 75 72 6e 20 74 68 65 20 50 52 49 4d 41  Return the PRIMA
68b0: 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f 66 20  RY KEY index of 
68c0: 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65 78  a table.*/.Index
68d0: 20 2a 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79   *sqlite3Primary
68e0: 4b 65 79 49 6e 64 65 78 28 54 61 62 6c 65 20 2a  KeyIndex(Table *
68f0: 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a  pTab){.  Index *
6900: 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61 62 2d  p;.  for(p=pTab-
6910: 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 21 49  >pIndex; p && !I
6920: 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
6930: 28 70 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  (p); p=p->pNext)
6940: 7b 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  {}.  return p;.}
6950: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
6960: 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  he column of ind
6970: 65 78 20 70 49 64 78 20 74 68 61 74 20 63 6f 72  ex pIdx that cor
6980: 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 61 62 6c  responds to tabl
6990: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  e.** column iCol
69a0: 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20  .  Return -1 if 
69b0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 31  not found..*/.i1
69c0: 36 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  6 sqlite3ColumnO
69d0: 66 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49  fIndex(Index *pI
69e0: 64 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20  dx, i16 iCol){. 
69f0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
6a00: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; i<pIdx->nColu
6a10: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  mn; i++){.    if
6a20: 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69  ( iCol==pIdx->ai
6a30: 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74 75  Column[i] ) retu
6a40: 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
6a50: 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
6a60: 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69  Begin constructi
6a70: 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72  ng a new table r
6a80: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e  epresentation in
6a90: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
6aa0: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f  s.** the first o
6ab0: 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e  f several action
6ac0: 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67   routines that g
6ad0: 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73  et called in res
6ae0: 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52  ponse.** to a CR
6af0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
6b00: 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63  ment.  In partic
6b10: 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69  ular, this routi
6b20: 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  ne is called.** 
6b30: 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b  after seeing tok
6b40: 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64  ens "CREATE" and
6b50: 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65   "TABLE" and the
6b60: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65   table name. The
6b70: 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20   isTemp.** flag 
6b80: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74  is true if the t
6b90: 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73  able should be s
6ba0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78  tored in the aux
6bb0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a  iliary database.
6bc0: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
6bd0: 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  of in the main d
6be0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
6bf0: 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
6c00: 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e  the case.** when
6c10: 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22   the "TEMP" or "
6c20: 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f  TEMPORARY" keywo
6c30: 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  rd occurs in bet
6c40: 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61  ween.** CREATE a
6c50: 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  nd TABLE..**.** 
6c60: 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65  The new table re
6c70: 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69  cord is initiali
6c80: 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70  zed and put in p
6c90: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
6ca0: 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20  ..** As more of 
6cb0: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
6cc0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
6cd0: 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c  rsed, additional
6ce0: 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69   action.** routi
6cf0: 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  nes will be call
6d00: 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69  ed to add more i
6d10: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
6d20: 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74  is record..** At
6d30: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
6d40: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
6d50: 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69  tement, the sqli
6d60: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f  te3EndTable() ro
6d70: 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
6d80: 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  ed to complete t
6d90: 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  he construction 
6da0: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
6db0: 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64   record..*/.void
6dc0: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
6dd0: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
6de0: 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72  rse,   /* Parser
6df0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
6e00: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f  ken *pName1,   /
6e10: 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20  * First part of 
6e20: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
6e30: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
6e40: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
6e50: 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61  ,   /* Second pa
6e60: 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  rt of the name o
6e70: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  f the table or v
6e80: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
6e90: 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  emp,      /* Tru
6ea0: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 54  e if this is a T
6eb0: 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  EMP table */.  i
6ec0: 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 20  nt isView,      
6ed0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
6ee0: 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69  is a VIEW */.  i
6ef0: 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20  nt isVirtual,   
6f00: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
6f10: 69 73 20 61 20 56 49 52 54 55 41 4c 20 74 61 62  is a VIRTUAL tab
6f20: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72  le */.  int noEr
6f30: 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  r        /* Do n
6f40: 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20  othing if table 
6f50: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
6f60: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
6f70: 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  able;.  char *zN
6f80: 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20  ame = 0; /* The 
6f90: 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20  name of the new 
6fa0: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
6fb0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
6fc0: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  >db;.  Vdbe *v;.
6fd0: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
6fe0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
6ff0: 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20  umber to create 
7000: 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a  the table in */.
7010: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20    Token *pName; 
7020: 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65     /* Unqualifie
7030: 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  d name of the ta
7040: 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  ble to create */
7050: 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  ..  if( db->init
7060: 2e 62 75 73 79 20 26 26 20 64 62 2d 3e 69 6e 69  .busy && db->ini
7070: 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31 20 29 7b 0a  t.newTnum==1 ){.
7080: 20 20 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63      /* Special c
7090: 61 73 65 3a 20 20 50 61 72 73 69 6e 67 20 74 68  ase:  Parsing th
70a0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
70b0: 6f 72 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  or sqlite_temp_m
70c0: 61 73 74 65 72 20 73 63 68 65 6d 61 20 2a 2f 0a  aster schema */.
70d0: 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e      iDb = db->in
70e0: 69 74 2e 69 44 62 3b 0a 20 20 20 20 7a 4e 61 6d  it.iDb;.    zNam
70f0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
7100: 44 75 70 28 64 62 2c 20 53 43 48 45 4d 41 5f 54  Dup(db, SCHEMA_T
7110: 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 20 20  ABLE(iDb));.    
7120: 70 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 31 3b 0a  pName = pName1;.
7130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
7140: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
7150: 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  */.    iDb = sql
7160: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
7170: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
7180: 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
7190: 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29  .    if( iDb<0 )
71a0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28   return;.    if(
71b0: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
71c0: 20 69 73 54 65 6d 70 20 26 26 20 70 4e 61 6d 65   isTemp && pName
71d0: 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21 3d 31  2->n>0 && iDb!=1
71e0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
71f0: 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20  creating a temp 
7200: 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20  table, the name 
7210: 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69  may not be quali
7220: 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20 20  fied. Unless .  
7230: 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
7240: 61 73 65 20 6e 61 6d 65 20 69 73 20 22 74 65 6d  ase name is "tem
7250: 70 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f 0a 20  p" anyway.  */. 
7260: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7270: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65  rMsg(pParse, "te
7280: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61  mporary table na
7290: 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61  me must be unqua
72a0: 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20  lified");.      
72b0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
72c0: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
72d0: 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 20 69  DB && isTemp ) i
72e0: 44 62 20 3d 20 31 3b 0a 20 20 20 20 7a 4e 61 6d  Db = 1;.    zNam
72f0: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
7300: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
7310: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 49 4e 5f  me);.    if( IN_
7320: 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
7330: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
7340: 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61  nameTokenMap(pPa
7350: 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a 4e 61 6d  rse, (void*)zNam
7360: 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, pName);.    }
7370: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 73  .  }.  pParse->s
7380: 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61  NameToken = *pNa
7390: 6d 65 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  me;.  if( zName=
73a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
73b0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
73c0: 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74  lite3CheckObject
73d0: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61  Name(pParse, zNa
73e0: 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  me) ){.    goto 
73f0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
7400: 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d  r;.  }.  if( db-
7410: 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69  >init.iDb==1 ) i
7420: 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64  sTemp = 1;.#ifnd
7430: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
7440: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61  UTHORIZATION.  a
7450: 73 73 65 72 74 28 20 69 73 54 65 6d 70 3d 3d 30  ssert( isTemp==0
7460: 20 7c 7c 20 69 73 54 65 6d 70 3d 3d 31 20 29 3b   || isTemp==1 );
7470: 0a 20 20 61 73 73 65 72 74 28 20 69 73 56 69 65  .  assert( isVie
7480: 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d  w==0 || isView==
7490: 31 20 29 3b 0a 20 20 7b 0a 20 20 20 20 73 74 61  1 );.  {.    sta
74a0: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 43 6f  tic const u8 aCo
74b0: 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  de[] = {.       
74c0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41  SQLITE_CREATE_TA
74d0: 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49  BLE,.       SQLI
74e0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
74f0: 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 4c  ABLE,.       SQL
7500: 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 2c  ITE_CREATE_VIEW,
7510: 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43  .       SQLITE_C
7520: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 0a  REATE_TEMP_VIEW.
7530: 20 20 20 20 7d 3b 0a 20 20 20 20 63 68 61 72 20      };.    char 
7540: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
7550: 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
7560: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
7570: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
7580: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
7590: 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d  HEMA_TABLE(isTem
75a0: 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  p), 0, zDb) ){. 
75b0: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
75c0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
75d0: 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56 69   }.    if( !isVi
75e0: 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65 33  rtual && sqlite3
75f0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
7600: 2c 20 28 69 6e 74 29 61 43 6f 64 65 5b 69 73 54  , (int)aCode[isT
7610: 65 6d 70 2b 32 2a 69 73 56 69 65 77 5d 2c 0a 20  emp+2*isView],. 
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7640: 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 2c 20        zName, 0, 
7650: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
7660: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7670: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
7680: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b  #endif..  /* Mak
7690: 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74  e sure the new t
76a0: 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e  able name does n
76b0: 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20  ot collide with 
76c0: 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a  an existing.  **
76d0: 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
76e0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65  name in the same
76f0: 20 64 61 74 61 62 61 73 65 2e 20 20 49 73 73 75   database.  Issu
7700: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
7710: 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f  ge if.  ** it do
7720: 65 73 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f  es. The exceptio
7730: 6e 20 69 73 20 69 66 20 74 68 65 20 73 74 61 74  n is if the stat
7740: 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73  ement being pars
7750: 65 64 20 77 61 73 20 70 61 73 73 65 64 0a 20 20  ed was passed.  
7760: 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  ** to an sqlite3
7770: 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20  _declare_vtab() 
7780: 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61  call. In that ca
7790: 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  se only the colu
77a0: 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e  mn names.  ** an
77b0: 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20  d types will be 
77c0: 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69  used, so there i
77d0: 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73  s no need to tes
77e0: 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a  t for namespace.
77f0: 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e    ** collisions.
7800: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f  .  */.  if( !IN_
7810: 53 50 45 43 49 41 4c 5f 50 41 52 53 45 20 29 7b  SPECIAL_PARSE ){
7820: 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  .    char *zDb =
7830: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
7840: 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  bSName;.    if( 
7850: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
7860: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
7870: 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  rse) ){.      go
7880: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7890: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
78a0: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  pTable = sqlite3
78b0: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
78c0: 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69  ame, zDb);.    i
78d0: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
78e0: 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b     if( !noErr ){
78f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7900: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7910: 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61   "table %T alrea
7920: 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d  dy exists", pNam
7930: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
7940: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7950: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
7960: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
7970: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7980: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
7990: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
79a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
79b0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
79c0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ror;.    }.    i
79d0: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
79e0: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  dex(db, zName, z
79f0: 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Db)!=0 ){.      
7a00: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7a10: 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
7a20: 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64  s already an ind
7a30: 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  ex named %s", zN
7a40: 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
7a50: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
7a60: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  or;.    }.  }.. 
7a70: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
7a80: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
7a90: 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
7aa0: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ;.  if( pTable==
7ab0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
7ac0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
7ad0: 64 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  d );.    pParse-
7ae0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
7af0: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 70 50 61  EM_BKPT;.    pPa
7b00: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
7b10: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
7b20: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
7b30: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
7b40: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
7b50: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
7b60: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20  able->pSchema = 
7b70: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
7b80: 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  hema;.  pTable->
7b90: 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 23 69 66  nTabRef = 1;.#if
7ba0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
7bb0: 4c 54 5f 52 4f 57 45 53 54 0a 20 20 70 54 61 62  LT_ROWEST.  pTab
7bc0: 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  le->nRowLogEst =
7bd0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 53   sqlite3LogEst(S
7be0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 4f  QLITE_DEFAULT_RO
7bf0: 57 45 53 54 29 3b 0a 23 65 6c 73 65 0a 20 20 70  WEST);.#else.  p
7c00: 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73  Table->nRowLogEs
7c10: 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
7c20: 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
7c30: 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
7c40: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
7c50: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
7c60: 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72 73  le==0 );.  pPars
7c70: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70  e->pNewTable = p
7c80: 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Table;..  /* If 
7c90: 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 67 69  this is the magi
7ca0: 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  c sqlite_sequenc
7cb0: 65 20 74 61 62 6c 65 20 75 73 65 64 20 62 79 20  e table used by 
7cc0: 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20  autoincrement,. 
7cd0: 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 20   ** then record 
7ce0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  a pointer to thi
7cf0: 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d  s table in the m
7d00: 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
7d10: 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74  ucture.  ** so t
7d20: 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e 20 66  hat INSERT can f
7d30: 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 65 61  ind the table ea
7d40: 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  sily..  */.#ifnd
7d50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
7d60: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69  UTOINCREMENT.  i
7d70: 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74  f( !pParse->nest
7d80: 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a 4e 61  ed && strcmp(zNa
7d90: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75  me, "sqlite_sequ
7da0: 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ence")==0 ){.   
7db0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7dc0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
7dd0: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
7de0: 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65     pTable->pSche
7df0: 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20 70 54  ma->pSeqTab = pT
7e00: 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  able;.  }.#endif
7e10: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
7e20: 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65  erating the code
7e30: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72   that will inser
7e40: 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  t the table reco
7e50: 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65  rd into.  ** the
7e60: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
7e70: 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70  able.  Note in p
7e80: 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77  articular that w
7e90: 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a  e must go ahead.
7ea0: 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74    ** and allocat
7eb0: 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  e the record num
7ec0: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
7ed0: 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65  e entry now.  Be
7ee0: 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52  fore any.  ** PR
7ef0: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
7f00: 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65  QUE keywords are
7f10: 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20   parsed.  Those 
7f20: 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61  keywords will ca
7f30: 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  use.  ** indices
7f40: 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61   to be created a
7f50: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  nd the table rec
7f60: 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65  ord must come be
7f70: 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69  fore the .  ** i
7f80: 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20  ndices.  Hence, 
7f90: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
7fa0: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
7fb0: 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
7fc0: 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f  d.  ** now..  */
7fd0: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
7fe0: 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73 71  .busy && (v = sq
7ff0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
8000: 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  rse))!=0 ){.    
8010: 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 20 20 69  int addr1;.    i
8020: 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20  nt fileFormat;. 
8030: 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72 65 67     int reg1, reg
8040: 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 2f 2a 20  2, reg3;.    /* 
8050: 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73 20 61 6e 20  nullRow[] is an 
8060: 4f 50 5f 52 65 63 6f 72 64 20 65 6e 63 6f 64 69  OP_Record encodi
8070: 6e 67 20 6f 66 20 61 20 72 6f 77 20 63 6f 6e 74  ng of a row cont
8080: 61 69 6e 69 6e 67 20 35 20 4e 55 4c 4c 73 20 2a  aining 5 NULLs *
8090: 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
80a0: 73 74 20 63 68 61 72 20 6e 75 6c 6c 52 6f 77 5b  st char nullRow[
80b0: 5d 20 3d 20 7b 20 36 2c 20 30 2c 20 30 2c 20 30  ] = { 6, 0, 0, 0
80c0: 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 73 71  , 0, 0 };.    sq
80d0: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
80e0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
80f0: 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64   1, iDb);..#ifnd
8100: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
8110: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
8120: 69 66 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b  if( isVirtual ){
8130: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8140: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56  beAddOp0(v, OP_V
8150: 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65  Begin);.    }.#e
8160: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
8170: 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  the file format 
8180: 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20  and encoding in 
8190: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 76  the database hav
81a0: 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c 20  e not been set, 
81b0: 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 6d  .    ** set them
81c0: 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   now..    */.   
81d0: 20 72 65 67 31 20 3d 20 70 50 61 72 73 65 2d 3e   reg1 = pParse->
81e0: 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61  regRowid = ++pPa
81f0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
8200: 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e 72 65  eg2 = pParse->re
8210: 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65  gRoot = ++pParse
8220: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33  ->nMem;.    reg3
8230: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
8240: 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
8250: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52  beAddOp3(v, OP_R
8260: 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  eadCookie, iDb, 
8270: 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49 4c 45  reg3, BTREE_FILE
8280: 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73 71  _FORMAT);.    sq
8290: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
82a0: 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  ee(v, iDb);.    
82b0: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
82c0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
82d0: 49 66 2c 20 72 65 67 33 29 3b 20 56 64 62 65 43  If, reg3); VdbeC
82e0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
82f0: 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62  fileFormat = (db
8300: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
8310: 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21  _LegacyFileFmt)!
8320: 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  =0 ?.           
8330: 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54         1 : SQLIT
8340: 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41  E_MAX_FILE_FORMA
8350: 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  T;.    sqlite3Vd
8360: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
8370: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
8380: 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  TREE_FILE_FORMAT
8390: 2c 20 66 69 6c 65 46 6f 72 6d 61 74 29 3b 0a 20  , fileFormat);. 
83a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
83b0: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f  dOp3(v, OP_SetCo
83c0: 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45  okie, iDb, BTREE
83d0: 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20  _TEXT_ENCODING, 
83e0: 45 4e 43 28 64 62 29 29 3b 0a 20 20 20 20 73 71  ENC(db));.    sq
83f0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
8400: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20  e(v, addr1);..  
8410: 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63    /* This just c
8420: 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68  reates a place-h
8430: 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20  older record in 
8440: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
8450: 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  r table..    ** 
8460: 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74  The record creat
8470: 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  ed does not cont
8480: 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74  ain anything yet
8490: 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65  .  It will be re
84a0: 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79  placed.    ** by
84b0: 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20   the real entry 
84c0: 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  in code generate
84d0: 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54  d at sqlite3EndT
84e0: 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  able()..    **. 
84f0: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
8500: 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72  for the new entr
8510: 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  y is left in reg
8520: 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65  ister pParse->re
8530: 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54  gRowid..    ** T
8540: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
8550: 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ber of the new t
8560: 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20  able is left in 
8570: 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52  reg pParse->regR
8580: 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  oot..    ** The 
8590: 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70  rowid and root p
85a0: 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65  age number value
85b0: 73 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  s are needed by 
85c0: 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20  the code that.  
85d0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54    ** sqlite3EndT
85e0: 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  able will genera
85f0: 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21  te..    */.#if !
8600: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8610: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
8620: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8630: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
8640: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 7c      if( isView |
8650: 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20  | isVirtual ){. 
8660: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8670: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
8680: 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a  eger, 0, reg2);.
8690: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
86a0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70 50 61  .    {.      pPa
86b0: 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20 3d  rse->addrCrTab =
86c0: 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
86d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
86e0: 50 5f 43 72 65 61 74 65 42 74 72 65 65 2c 20 69  P_CreateBtree, i
86f0: 44 62 2c 20 72 65 67 32 2c 20 42 54 52 45 45 5f  Db, reg2, BTREE_
8700: 49 4e 54 4b 45 59 29 3b 0a 20 20 20 20 7d 0a 20  INTKEY);.    }. 
8710: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
8720: 73 74 65 72 54 61 62 6c 65 28 70 50 61 72 73 65  sterTable(pParse
8730: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
8740: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8750: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c   OP_NewRowid, 0,
8760: 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69   reg1);.    sqli
8770: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
8780: 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c 20 72 65 67   OP_Blob, 6, reg
8790: 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f 77 2c 20 50  3, 0, nullRow, P
87a0: 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  4_STATIC);.    s
87b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
87c0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30  (v, OP_Insert, 0
87d0: 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20  , reg3, reg1);. 
87e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
87f0: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
8800: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71  _APPEND);.    sq
8810: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
8820: 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20  v, OP_Close);.  
8830: 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28  }..  /* Normal (
8840: 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72  non-error) retur
8850: 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a  n. */.  return;.
8860: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
8870: 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d  r occurs, we jum
8880: 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f  p here */.begin_
8890: 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73  table_error:.  s
88a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
88b0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
88c0: 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74 20 70 72 6f  n;.}../* Set pro
88d0: 70 65 72 74 69 65 73 20 6f 66 20 61 20 74 61 62  perties of a tab
88e0: 6c 65 20 63 6f 6c 75 6d 6e 20 62 61 73 65 64 20  le column based 
88f0: 6f 6e 20 74 68 65 20 28 6d 61 67 69 63 61 6c 29  on the (magical)
8900: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  .** name of the 
8910: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23 69 66 20 53  column..*/.#if S
8920: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 48 49 44  QLITE_ENABLE_HID
8930: 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a 76 6f 69 64  DEN_COLUMNS.void
8940: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72   sqlite3ColumnPr
8950: 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65  opertiesFromName
8960: 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f  (Table *pTab, Co
8970: 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20 69  lumn *pCol){.  i
8980: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  f( sqlite3_strni
8990: 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c  cmp(pCol->zName,
89a0: 20 22 5f 5f 68 69 64 64 65 6e 5f 5f 22 2c 20 31   "__hidden__", 1
89b0: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f  0)==0 ){.    pCo
89c0: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
89d0: 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 3b 0a 20  OLFLAG_HIDDEN;. 
89e0: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 20   }else if( pTab 
89f0: 26 26 20 70 43 6f 6c 21 3d 70 54 61 62 2d 3e 61  && pCol!=pTab->a
8a00: 43 6f 6c 20 26 26 20 28 70 43 6f 6c 5b 2d 31 5d  Col && (pCol[-1]
8a10: 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46  .colFlags & COLF
8a20: 4c 41 47 5f 48 49 44 44 45 4e 29 20 29 7b 0a 20  LAG_HIDDEN) ){. 
8a30: 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
8a40: 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48 69 64 64 65  s |= TF_OOOHidde
8a50: 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  n;.  }.}.#endif.
8a60: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
8a70: 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20  w column to the 
8a80: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
8a90: 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
8aa0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72  d..**.** The par
8ab0: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
8ac0: 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20  outine once for 
8ad0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c  each column decl
8ae0: 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20  aration.** in a 
8af0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
8b00: 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33  tement.  sqlite3
8b10: 53 74 61 72 74 54 61 62 6c 65 28 29 20 67 65 74  StartTable() get
8b20: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73  s called.** firs
8b30: 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20  t to get things 
8b40: 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69  going.  Then thi
8b50: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8b60: 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  led for each.** 
8b70: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  column..*/.void 
8b80: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
8b90: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8ba0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 54 6f  Token *pName, To
8bb0: 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54  ken *pType){.  T
8bc0: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
8bd0: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63  ;.  char *z;.  c
8be0: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 43 6f  har *zType;.  Co
8bf0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71  lumn *pCol;.  sq
8c00: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
8c10: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70  se->db;.  if( (p
8c20: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
8c30: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
8c40: 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c  n;.  if( p->nCol
8c50: 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  +1>db->aLimit[SQ
8c60: 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
8c70: 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  N] ){.    sqlite
8c80: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8c90: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
8ca0: 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a  mns on %s", p->z
8cb0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
8cc0: 6e 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c  n;.  }.  z = sql
8cd0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
8ce0: 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 70  db, pName->n + p
8cf0: 54 79 70 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20 20  Type->n + 2);.  
8d00: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
8d10: 6e 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41  n;.  if( IN_RENA
8d20: 4d 45 5f 4f 42 4a 45 43 54 20 29 20 73 71 6c 69  ME_OBJECT ) sqli
8d30: 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61  te3RenameTokenMa
8d40: 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a  p(pParse, (void*
8d50: 29 7a 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 6d 65  )z, pName);.  me
8d60: 6d 63 70 79 28 7a 2c 20 70 4e 61 6d 65 2d 3e 7a  mcpy(z, pName->z
8d70: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 7a  , pName->n);.  z
8d80: 5b 70 4e 61 6d 65 2d 3e 6e 5d 20 3d 20 30 3b 0a  [pName->n] = 0;.
8d90: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
8da0: 28 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  (z);.  for(i=0; 
8db0: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
8dc0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
8dd0: 5f 73 74 72 69 63 6d 70 28 7a 2c 20 70 2d 3e 61  _stricmp(z, p->a
8de0: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  Col[i].zName)==0
8df0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8e00: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8e10: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
8e20: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
8e30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8e40: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
8e50: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
8e60: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d   }.  }.  if( (p-
8e70: 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20  >nCol & 0x7)==0 
8e80: 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61  ){.    Column *a
8e90: 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  New;.    aNew = 
8ea0: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
8eb0: 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e  (db,p->aCol,(p->
8ec0: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
8ed0: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
8ee0: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
8ef0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
8f00: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
8f10: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
8f20: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e      p->aCol = aN
8f30: 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d  ew;.  }.  pCol =
8f40: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
8f50: 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f  l];.  memset(pCo
8f60: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  l, 0, sizeof(p->
8f70: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f  aCol[0]));.  pCo
8f80: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 20  l->zName = z;.  
8f90: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f  sqlite3ColumnPro
8fa0: 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28  pertiesFromName(
8fb0: 70 2c 20 70 43 6f 6c 29 3b 0a 20 0a 20 20 69 66  p, pCol);. .  if
8fc0: 28 20 70 54 79 70 65 2d 3e 6e 3d 3d 30 20 29 7b  ( pType->n==0 ){
8fd0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
8fe0: 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63   is no type spec
8ff0: 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68  ified, columns h
9000: 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  ave the default 
9010: 61 66 66 69 6e 69 74 79 0a 20 20 20 20 2a 2a 20  affinity.    ** 
9020: 27 42 4c 4f 42 27 20 77 69 74 68 20 61 20 64 65  'BLOB' with a de
9030: 66 61 75 6c 74 20 73 69 7a 65 20 6f 66 20 34 20  fault size of 4 
9040: 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 70 43  bytes. */.    pC
9050: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
9060: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
9070: 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20      pCol->szEst 
9080: 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 1;.#ifdef SQLI
9090: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
90a0: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20  _REFERENCES.    
90b0: 69 66 28 20 34 3e 3d 73 71 6c 69 74 65 33 47 6c  if( 4>=sqlite3Gl
90c0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 6f 72  obalConfig.szSor
90d0: 74 65 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20  terRef ){.      
90e0: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
90f0: 3d 20 43 4f 4c 46 4c 41 47 5f 53 4f 52 54 45 52  = COLFLAG_SORTER
9100: 52 45 46 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  REF;.    }.#endi
9110: 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  f.  }else{.    z
9120: 54 79 70 65 20 3d 20 7a 20 2b 20 73 71 6c 69 74  Type = z + sqlit
9130: 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2b 20  e3Strlen30(z) + 
9140: 31 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54  1;.    memcpy(zT
9150: 79 70 65 2c 20 70 54 79 70 65 2d 3e 7a 2c 20 70  ype, pType->z, p
9160: 54 79 70 65 2d 3e 6e 29 3b 0a 20 20 20 20 7a 54  Type->n);.    zT
9170: 79 70 65 5b 70 54 79 70 65 2d 3e 6e 5d 20 3d 20  ype[pType->n] = 
9180: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  0;.    sqlite3De
9190: 71 75 6f 74 65 28 7a 54 79 70 65 29 3b 0a 20 20  quote(zType);.  
91a0: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
91b0: 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69   = sqlite3Affini
91c0: 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20 70 43  tyType(zType, pC
91d0: 6f 6c 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63  ol);.    pCol->c
91e0: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
91f0: 41 47 5f 48 41 53 54 59 50 45 3b 0a 20 20 7d 0a  AG_HASTYPE;.  }.
9200: 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 20 20 70    p->nCol++;.  p
9210: 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e  Parse->constrain
9220: 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b 0a 7d 0a 0a  tName.n = 0;.}..
9230: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
9240: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
9250: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
9260: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
9270: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
9280: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
9290: 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e  ement.  A "NOT N
92a0: 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20  ULL" constraint 
92b0: 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e  has.** been seen
92c0: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54   on a column.  T
92d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
92e0: 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61   the notNull fla
92f0: 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  g on.** the colu
9300: 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  mn currently und
9310: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
9320: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9330: 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65  AddNotNull(Parse
9340: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e   *pParse, int on
9350: 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20  Error){.  Table 
9360: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
9370: 6f 6c 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  ol;.  p = pParse
9380: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
9390: 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52  f( p==0 || NEVER
93a0: 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65  (p->nCol<1) ) re
93b0: 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26  turn;.  pCol = &
93c0: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d  p->aCol[p->nCol-
93d0: 31 5d 3b 0a 20 20 70 43 6f 6c 2d 3e 6e 6f 74 4e  1];.  pCol->notN
93e0: 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  ull = (u8)onErro
93f0: 72 3b 0a 20 20 70 2d 3e 74 61 62 46 6c 61 67 73  r;.  p->tabFlags
9400: 20 7c 3d 20 54 46 5f 48 61 73 4e 6f 74 4e 75 6c   |= TF_HasNotNul
9410: 6c 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  l;..  /* Set the
9420: 20 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 66 6c 61   uniqNotNull fla
9430: 67 20 6f 6e 20 61 6e 79 20 55 4e 49 51 55 45 20  g on any UNIQUE 
9440: 6f 72 20 50 4b 20 69 6e 64 65 78 65 73 20 61 6c  or PK indexes al
9450: 72 65 61 64 79 20 63 72 65 61 74 65 64 0a 20 20  ready created.  
9460: 2a 2a 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d  ** on this colum
9470: 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 6f  n.  */.  if( pCo
9480: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f  l->colFlags & CO
9490: 4c 46 4c 41 47 5f 55 4e 49 51 55 45 20 29 7b 0a  LFLAG_UNIQUE ){.
94a0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
94b0: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d  .    for(pIdx=p-
94c0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
94d0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
94e0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
94f0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31  pIdx->nKeyCol==1
9500: 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f   && pIdx->onErro
9510: 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20  r!=OE_None );.  
9520: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
9530: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 70 2d 3e 6e 43  Column[0]==p->nC
9540: 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  ol-1 ){.        
9550: 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  pIdx->uniqNotNul
9560: 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 1;.      }. 
9570: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
9580: 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d  * Scan the colum
9590: 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70  n type name zTyp
95a0: 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29  e (length nType)
95b0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a   and return the.
95c0: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66  ** associated af
95d0: 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a  finity type..**.
95e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
95f0: 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65  does a case-inde
9600: 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f  pendent search o
9610: 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20  f zType for the 
9620: 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69  .** substrings i
9630: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
9640: 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66  table. If one of
9650: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
9660: 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65  is.** found, the
9670: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61   corresponding a
9680: 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72  ffinity is retur
9690: 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f  ned. If zType co
96a0: 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74  ntains.** more t
96b0: 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  han one of the s
96c0: 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69  ubstrings, entri
96d0: 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f  es toward the to
96e0: 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62  p of .** the tab
96f0: 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79  le take priority
9700: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
9710: 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42  f zType is 'BLOB
9720: 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45  INT', .** SQLITE
9730: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20  _AFF_INTEGER is 
9740: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
9750: 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20  Substring     | 
9760: 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d  Affinity.** ----
9770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
9790: 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20  'INT'         | 
97a0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
97b0: 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20  ER.** 'CHAR'    
97c0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
97d0: 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20  _TEXT.** 'CLOB' 
97e0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
97f0: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58  AFF_TEXT.** 'TEX
9800: 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  T'        | SQLI
9810: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
9820: 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53  BLOB'        | S
9830: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 0a 2a  QLITE_AFF_BLOB.*
9840: 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20  * 'REAL'        
9850: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
9860: 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20  L.** 'FLOA'     
9870: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
9880: 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20  REAL.** 'DOUB'  
9890: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
98a0: 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66  FF_REAL.**.** If
98b0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62   none of the sub
98c0: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61  strings in the a
98d0: 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66  bove table are f
98e0: 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ound,.** SQLITE_
98f0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72  AFF_NUMERIC is r
9900: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72  eturned..*/.char
9910: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
9920: 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Type(const char 
9930: 2a 7a 49 6e 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43  *zIn, Column *pC
9940: 6f 6c 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 30  ol){.  u32 h = 0
9950: 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 53  ;.  char aff = S
9960: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
9970: 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  C;.  const char 
9980: 2a 7a 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20 61  *zChar = 0;..  a
9990: 73 73 65 72 74 28 20 7a 49 6e 21 3d 30 20 29 3b  ssert( zIn!=0 );
99a0: 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30 5d  .  while( zIn[0]
99b0: 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c   ){.    h = (h<<
99c0: 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65  8) + sqlite3Uppe
99d0: 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29 26  rToLower[(*zIn)&
99e0: 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b  0xff];.    zIn++
99f0: 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27  ;.    if( h==(('
9a00: 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36  c'<<24)+('h'<<16
9a10: 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20  )+('a'<<8)+'r') 
9a20: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){             /
9a30: 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20  * CHAR */.      
9a40: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
9a50: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7a 43 68  _TEXT;.      zCh
9a60: 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d 65  ar = zIn;.    }e
9a70: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27  lse if( h==(('c'
9a80: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
9a90: 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b  ('o'<<8)+'b') ){
9aa0: 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a         /* CLOB *
9ab0: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
9ac0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
9ad0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9ae0: 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c  (('t'<<24)+('e'<
9af0: 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74  <16)+('x'<<8)+'t
9b00: 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54  ') ){       /* T
9b10: 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  EXT */.      aff
9b20: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
9b30: 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  XT;.    }else if
9b40: 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b  ( h==(('b'<<24)+
9b50: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
9b60: 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20  8)+'b')         
9b70: 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20   /* BLOB */.    
9b80: 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c      && (aff==SQL
9b90: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9ba0: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
9bb0: 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20  FF_REAL) ){.    
9bc0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
9bd0: 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 69  FF_BLOB;.      i
9be0: 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20 29  f( zIn[0]=='(' )
9bf0: 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23 69   zChar = zIn;.#i
9c00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9c10: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
9c20: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
9c30: 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65  ==(('r'<<24)+('e
9c40: 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b  '<<16)+('a'<<8)+
9c50: 27 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'l')          /*
9c60: 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20   REAL */.       
9c70: 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   && aff==SQLITE_
9c80: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
9c90: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9ca0: 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20  E_AFF_REAL;.    
9cb0: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
9cc0: 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  f'<<24)+('l'<<16
9cd0: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20  )+('o'<<8)+'a') 
9ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41           /* FLOA
9cf0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
9d00: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
9d10: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
9d20: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
9d30: 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _REAL;.    }else
9d40: 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32   if( h==(('d'<<2
9d50: 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75  4)+('o'<<16)+('u
9d60: 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20  '<<8)+'b')      
9d70: 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20      /* DOUB */. 
9d80: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
9d90: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
9da0: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
9db0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
9dc0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
9dd0: 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46 46  se if( (h&0x00FF
9de0: 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36  FFFF)==(('i'<<16
9df0: 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20  )+('n'<<8)+'t') 
9e00: 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a  ){    /* INT */.
9e10: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9e20: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
9e30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9e40: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
9e50: 70 43 6f 6c 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  pCol is not NULL
9e60: 2c 20 73 74 6f 72 65 20 61 6e 20 65 73 74 69 6d  , store an estim
9e70: 61 74 65 20 6f 66 20 74 68 65 20 66 69 65 6c 64  ate of the field
9e80: 20 73 69 7a 65 2e 20 20 54 68 65 0a 20 20 2a 2a   size.  The.  **
9e90: 20 65 73 74 69 6d 61 74 65 20 69 73 20 73 63 61   estimate is sca
9ea0: 6c 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  led so that the 
9eb0: 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e 74 65 67  size of an integ
9ec0: 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a 20 20 69  er is 1.  */.  i
9ed0: 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 69  f( pCol ){.    i
9ee0: 6e 74 20 76 20 3d 20 30 3b 20 20 20 2f 2a 20 64  nt v = 0;   /* d
9ef0: 65 66 61 75 6c 74 20 73 69 7a 65 20 69 73 20 61  efault size is a
9f00: 70 70 72 6f 78 20 34 20 62 79 74 65 73 20 2a 2f  pprox 4 bytes */
9f10: 0a 20 20 20 20 69 66 28 20 61 66 66 3c 53 51 4c  .    if( aff<SQL
9f20: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9f30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 68  ){.      if( zCh
9f40: 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  ar ){.        wh
9f50: 69 6c 65 28 20 7a 43 68 61 72 5b 30 5d 20 29 7b  ile( zChar[0] ){
9f60: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
9f70: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 43  qlite3Isdigit(zC
9f80: 68 61 72 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  har[0]) ){.     
9f90: 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 28 6b         /* BLOB(k
9fa0: 29 2c 20 56 41 52 43 48 41 52 28 6b 29 2c 20 43  ), VARCHAR(k), C
9fb0: 48 41 52 28 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34  HAR(k) -> r=(k/4
9fc0: 2b 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  +1) */.         
9fd0: 20 20 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74     sqlite3GetInt
9fe0: 33 32 28 7a 43 68 61 72 2c 20 26 76 29 3b 0a 20  32(zChar, &v);. 
9ff0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
a000: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
a010: 20 20 20 20 20 20 20 20 7a 43 68 61 72 2b 2b 3b          zChar++;
a020: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a030: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a040: 76 20 3d 20 31 36 3b 20 20 20 2f 2a 20 42 4c 4f  v = 16;   /* BLO
a050: 42 2c 20 54 45 58 54 2c 20 43 4c 4f 42 20 2d 3e  B, TEXT, CLOB ->
a060: 20 72 3d 35 20 20 28 61 70 70 72 6f 78 20 32 30   r=5  (approx 20
a070: 20 62 79 74 65 73 29 2a 2f 0a 20 20 20 20 20 20   bytes)*/.      
a080: 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  }.    }.#ifdef S
a090: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
a0a0: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20  TER_REFERENCES. 
a0b0: 20 20 20 69 66 28 20 76 3e 3d 73 71 6c 69 74 65     if( v>=sqlite
a0c0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
a0d0: 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20 20  SorterRef ){.   
a0e0: 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67     pCol->colFlag
a0f0: 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53 4f 52  s |= COLFLAG_SOR
a100: 54 45 52 52 45 46 3b 0a 20 20 20 20 7d 0a 23 65  TERREF;.    }.#e
a110: 6e 64 69 66 0a 20 20 20 20 76 20 3d 20 76 2f 34  ndif.    v = v/4
a120: 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 76 3e   + 1;.    if( v>
a130: 32 35 35 20 29 20 76 20 3d 20 32 35 35 3b 0a 20  255 ) v = 255;. 
a140: 20 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d     pCol->szEst =
a150: 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   v;.  }.  return
a160: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   aff;.}../*.** T
a170: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
a180: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
a190: 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  ue for the most 
a1a0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63  recently added c
a1b0: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  olumn.** of the 
a1c0: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
a1d0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
a1e0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c  on..**.** Defaul
a1f0: 74 20 76 61 6c 75 65 20 65 78 70 72 65 73 73 69  t value expressi
a200: 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73  ons must be cons
a210: 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20  tant.  Raise an 
a220: 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69  exception if thi
a230: 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20  s.** is not the 
a240: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  case..**.** This
a250: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
a260: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
a270: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
a280: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
a290: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
a2a0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  E statement..*/.
a2b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 44  void sqlite3AddD
a2c0: 65 66 61 75 6c 74 56 61 6c 75 65 28 0a 20 20 50  efaultValue(.  P
a2d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
a2e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
a2f0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
a300: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
a310: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a320: 70 61 72 73 65 64 20 65 78 70 72 65 73 73 69 6f  parsed expressio
a330: 6e 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  n of the default
a340: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 63 6f 6e 73   value */.  cons
a350: 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74 2c 20  t char *zStart, 
a360: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
a370: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
a380: 75 65 20 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e  ue text */.  con
a390: 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 20 20 20  st char *zEnd   
a3a0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63        /* First c
a3b0: 68 61 72 61 63 74 65 72 20 70 61 73 74 20 65 6e  haracter past en
a3c0: 64 20 6f 66 20 64 65 66 61 75 74 20 76 61 6c 75  d of defaut valu
a3d0: 65 20 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 54  e text */.){.  T
a3e0: 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d  able *p;.  Colum
a3f0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74  n *pCol;.  sqlit
a400: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
a410: 3e 64 62 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  >db;.  p = pPars
a420: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
a430: 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20  if( p!=0 ){.    
a440: 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c  pCol = &(p->aCol
a450: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20  [p->nCol-1]);.  
a460: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
a470: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
a480: 6e 63 74 69 6f 6e 28 70 45 78 70 72 2c 20 64 62  nction(pExpr, db
a490: 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a  ->init.busy) ){.
a4a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
a4b0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
a4c0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20  efault value of 
a4d0: 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e  column [%s] is n
a4e0: 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20  ot constant",.  
a4f0: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e          pCol->zN
a500: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
a510: 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  .      /* A copy
a520: 20 6f 66 20 70 45 78 70 72 20 69 73 20 75 73 65   of pExpr is use
a530: 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  d instead of the
a540: 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 45   original, as pE
a550: 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20  xpr contains.   
a560: 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61     ** tokens tha
a570: 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74  t point to volat
a580: 69 6c 65 20 6d 65 6d 6f 72 79 2e 0a 20 20 20 20  ile memory..    
a590: 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20    */.      Expr 
a5a0: 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  x;.      sqlite3
a5b0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
a5c0: 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20  Col->pDflt);.   
a5d0: 20 20 20 6d 65 6d 73 65 74 28 26 78 2c 20 30 2c     memset(&x, 0,
a5e0: 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20   sizeof(x));.   
a5f0: 20 20 20 78 2e 6f 70 20 3d 20 54 4b 5f 53 50 41     x.op = TK_SPA
a600: 4e 3b 0a 20 20 20 20 20 20 78 2e 75 2e 7a 54 6f  N;.      x.u.zTo
a610: 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ken = sqlite3DbS
a620: 70 61 6e 44 75 70 28 64 62 2c 20 7a 53 74 61 72  panDup(db, zStar
a630: 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 20 20 20 20  t, zEnd);.      
a640: 78 2e 70 4c 65 66 74 20 3d 20 70 45 78 70 72 3b  x.pLeft = pExpr;
a650: 0a 20 20 20 20 20 20 78 2e 66 6c 61 67 73 20 3d  .      x.flags =
a660: 20 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20   EP_Skip;.      
a670: 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71  pCol->pDflt = sq
a680: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
a690: 20 26 78 2c 20 45 58 50 52 44 55 50 5f 52 45 44   &x, EXPRDUP_RED
a6a0: 55 43 45 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  UCE);.      sqli
a6b0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 78 2e  te3DbFree(db, x.
a6c0: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d  u.zToken);.    }
a6d0: 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e 5f 52 45  .  }.  if( IN_RE
a6e0: 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  NAME_OBJECT ){. 
a6f0: 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
a700: 45 78 70 72 55 6e 6d 61 70 28 70 50 61 72 73 65  ExprUnmap(pParse
a710: 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  , pExpr);.  }.  
a720: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
a730: 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  e(db, pExpr);.}.
a740: 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77 61 72 64 73  ./*.** Backwards
a750: 20 43 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 48   Compatibility H
a760: 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20 48 69 73 74  ack:.** .** Hist
a770: 6f 72 69 63 61 6c 20 76 65 72 73 69 6f 6e 73 20  orical versions 
a780: 6f 66 20 53 51 4c 69 74 65 20 61 63 63 65 70 74  of SQLite accept
a790: 65 64 20 73 74 72 69 6e 67 73 20 61 73 20 63 6f  ed strings as co
a7a0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 0a 2a 2a  lumn names in.**
a7b0: 20 69 6e 64 65 78 65 73 20 61 6e 64 20 50 52 49   indexes and PRI
a7c0: 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
a7d0: 69 6e 74 73 20 61 6e 64 20 69 6e 20 55 4e 49 51  ints and in UNIQ
a7e0: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  UE constraints. 
a7f0: 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   Example:.**.** 
a800: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
a810: 20 78 79 7a 28 61 2c 62 2c 63 2c 64 2c 65 2c 50   xyz(a,b,c,d,e,P
a820: 52 49 4d 41 52 59 20 4b 45 59 28 27 61 27 29 2c  RIMARY KEY('a'),
a830: 55 4e 49 51 55 45 28 27 62 27 2c 27 63 27 20 43  UNIQUE('b','c' C
a840: 4f 4c 4c 41 54 45 20 74 72 69 6d 29 0a 2a 2a 20  OLLATE trim).** 
a850: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
a860: 20 61 62 63 20 4f 4e 20 78 79 7a 28 27 63 27 2c   abc ON xyz('c',
a870: 27 64 27 20 44 45 53 43 2c 27 65 27 20 43 4f 4c  'd' DESC,'e' COL
a880: 4c 41 54 45 20 6e 6f 63 61 73 65 20 44 45 53 43  LATE nocase DESC
a890: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  );.**.** This is
a8a0: 20 67 6f 6f 66 79 2e 20 20 42 75 74 20 74 6f 20   goofy.  But to 
a8b0: 70 72 65 73 65 72 76 65 20 62 61 63 6b 77 61 72  preserve backwar
a8c0: 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
a8d0: 20 77 65 20 63 6f 6e 74 69 6e 75 65 20 74 6f 0a   we continue to.
a8e0: 2a 2a 20 61 63 63 65 70 74 20 69 74 2e 20 20 54  ** accept it.  T
a8f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
a900: 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 63   the necessary c
a910: 6f 6e 76 65 72 73 69 6f 6e 2e 20 20 49 74 20 63  onversion.  It c
a920: 6f 6e 76 65 72 74 73 0a 2a 2a 20 74 68 65 20 65  onverts.** the e
a930: 78 70 72 65 73 73 69 6f 6e 20 67 69 76 65 6e 20  xpression given 
a940: 69 6e 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20  in its argument 
a950: 66 72 6f 6d 20 61 20 54 4b 5f 53 54 52 49 4e 47  from a TK_STRING
a960: 20 69 6e 74 6f 20 61 20 54 4b 5f 49 44 0a 2a 2a   into a TK_ID.**
a970: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
a980: 6f 6e 20 69 73 20 6a 75 73 74 20 61 20 54 4b 5f  on is just a TK_
a990: 53 54 52 49 4e 47 20 77 69 74 68 20 61 6e 20 6f  STRING with an o
a9a0: 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c 41 54 45 20  ptional COLLATE 
a9b0: 63 6c 61 75 73 65 2e 0a 2a 2a 20 49 66 20 74 68  clause..** If th
a9c0: 65 20 65 70 78 72 65 73 73 69 6f 6e 20 69 73 20  e epxression is 
a9d0: 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74  anything other t
a9e0: 68 61 6e 20 54 4b 5f 53 54 52 49 4e 47 2c 20 74  han TK_STRING, t
a9f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
aa00: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  .** unchanged..*
aa10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
aa20: 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28  lite3StringToId(
aa30: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
aa40: 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47  p->op==TK_STRING
aa50: 20 29 7b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20   ){.    p->op = 
aa60: 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69  TK_ID;.  }else i
aa70: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
aa80: 4c 41 54 45 20 26 26 20 70 2d 3e 70 4c 65 66 74  LATE && p->pLeft
aa90: 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20  ->op==TK_STRING 
aaa0: 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 65 66 74 2d  ){.    p->pLeft-
aab0: 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d  >op = TK_ID;.  }
aac0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e  .}../*.** Design
aad0: 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ate the PRIMARY 
aae0: 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c  KEY for the tabl
aaf0: 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c  e.  pList is a l
ab00: 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a  ist of names .**
ab10: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
ab20: 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72   form the primar
ab30: 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74  y key.  If pList
ab40: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
ab50: 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e  he.** most recen
ab60: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
ab70: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   of the table is
ab80: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
ab90: 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20  ..**.** A table 
aba0: 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74  can have at most
abb0: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
abc0: 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  .  If the table 
abd0: 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61  already has.** a
abe0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e   primary key (an
abf0: 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65  d this is the se
ac00: 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79  cond primary key
ac10: 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e  ) then create an
ac20: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a  .** error..**.**
ac30: 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   If the PRIMARY 
ac40: 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67  KEY is on a sing
ac50: 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20  le column whose 
ac60: 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45  datatype is INTE
ac70: 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20  GER,.** then we 
ac80: 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20  will try to use 
ac90: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74  that column as t
aca0: 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74  he rowid.  Set t
acb0: 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a  he Table.iPKey.*
acc0: 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74  * field of the t
acd0: 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
ace0: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68  ruction to be th
acf0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a  e index of the.*
ad00: 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  * INTEGER PRIMAR
ad10: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54  Y KEY column.  T
ad20: 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65  able.iPKey is se
ad30: 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65  t to -1 if there
ad40: 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45   is.** no INTEGE
ad50: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
ad60: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20  *.** If the key 
ad70: 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45  is not an INTEGE
ad80: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74  R PRIMARY KEY, t
ad90: 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69  hen create a uni
ada0: 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72  que.** index for
adb0: 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e   the key.  No in
adc0: 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66  dex is created f
add0: 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  or INTEGER PRIMA
ade0: 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64  RY KEYs..*/.void
adf0: 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61   sqlite3AddPrima
ae00: 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  ryKey(.  Parse *
ae10: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
ae20: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
ae30: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
ae40: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
ae50: 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62  field names to b
ae60: 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
ae70: 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
ae80: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
ae90: 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73  ith a uniqueness
aea0: 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69   conflict */.  i
aeb0: 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20  nt autoInc,     
aec0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
aed0: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65  AUTOINCREMENT ke
aee0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
aef0: 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
af00: 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54  der     /* SQLIT
af10: 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49  E_SO_ASC or SQLI
af20: 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b  TE_SO_DESC */.){
af30: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
af40: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
af50: 6c 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  le;.  Column *pC
af60: 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43  ol = 0;.  int iC
af70: 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 6e  ol = -1, i;.  in
af80: 74 20 6e 54 65 72 6d 3b 0a 20 20 69 66 28 20 70  t nTerm;.  if( p
af90: 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72  Tab==0 ) goto pr
afa0: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
afb0: 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46    if( pTab->tabF
afc0: 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69  lags & TF_HasPri
afd0: 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20 20 20 73  maryKey ){.    s
afe0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
aff0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74  Parse, .      "t
b000: 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20  able \"%s\" has 
b010: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72  more than one pr
b020: 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62  imary key", pTab
b030: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
b040: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
b050: 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  xit;.  }.  pTab-
b060: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
b070: 48 61 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20  HasPrimaryKey;. 
b080: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
b090: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62  .    iCol = pTab
b0a0: 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20  ->nCol - 1;.    
b0b0: 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
b0c0: 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 70 43  ol[iCol];.    pC
b0d0: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol->colFlags |= 
b0e0: 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b  COLFLAG_PRIMKEY;
b0f0: 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 31 3b 0a  .    nTerm = 1;.
b100: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 54 65    }else{.    nTe
b110: 72 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  rm = pList->nExp
b120: 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  r;.    for(i=0; 
b130: 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  i<nTerm; i++){. 
b140: 20 20 20 20 20 45 78 70 72 20 2a 70 43 45 78 70       Expr *pCExp
b150: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
b160: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74  kipCollate(pList
b170: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
b180: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 45       assert( pCE
b190: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
b1a0: 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49  sqlite3StringToI
b1b0: 64 28 70 43 45 78 70 72 29 3b 0a 20 20 20 20 20  d(pCExpr);.     
b1c0: 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70 3d   if( pCExpr->op=
b1d0: 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
b1e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
b1f0: 4e 61 6d 65 20 3d 20 70 43 45 78 70 72 2d 3e 75  Name = pCExpr->u
b200: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  .zToken;.       
b210: 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
b220: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
b230: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
b240: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
b250: 43 6d 70 28 7a 43 4e 61 6d 65 2c 20 70 54 61 62  Cmp(zCName, pTab
b260: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
b270: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
b280: 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54        pCol = &pT
b290: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a  ab->aCol[iCol];.
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
b2b0: 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f  ->colFlags |= CO
b2c0: 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20  LFLAG_PRIMKEY;. 
b2d0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b2e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
b2f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b300: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
b310: 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26 26 20 70  nTerm==1.   && p
b320: 43 6f 6c 0a 20 20 20 26 26 20 73 71 6c 69 74 65  Col.   && sqlite
b330: 33 53 74 72 49 43 6d 70 28 73 71 6c 69 74 65 33  3StrICmp(sqlite3
b340: 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c 2c  ColumnType(pCol,
b350: 22 22 29 2c 20 22 49 4e 54 45 47 45 52 22 29 3d  ""), "INTEGER")=
b360: 3d 30 0a 20 20 20 26 26 20 73 6f 72 74 4f 72 64  =0.   && sortOrd
b370: 65 72 21 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45  er!=SQLITE_SO_DE
b380: 53 43 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  SC.  ){.    if( 
b390: 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
b3a0: 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20   && pList ){.   
b3b0: 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
b3c0: 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73  TokenRemap(pPars
b3d0: 65 2c 20 26 70 54 61 62 2d 3e 69 50 4b 65 79 2c  e, &pTab->iPKey,
b3e0: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78   pList->a[0].pEx
b3f0: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  pr);.    }.    p
b400: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f  Tab->iPKey = iCo
b410: 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79  l;.    pTab->key
b420: 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72  Conf = (u8)onErr
b430: 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  or;.    assert( 
b440: 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75  autoInc==0 || au
b450: 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  toInc==1 );.    
b460: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
b470: 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74  = autoInc*TF_Aut
b480: 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 20 20  oincrement;.    
b490: 69 66 28 20 70 4c 69 73 74 20 29 20 70 50 61 72  if( pList ) pPar
b4a0: 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72  se->iPkSortOrder
b4b0: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73   = pList->a[0].s
b4c0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 65 6c 73  ortOrder;.  }els
b4d0: 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b  e if( autoInc ){
b4e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b4f0: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
b500: 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  NT.    sqlite3Er
b510: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
b520: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73  AUTOINCREMENT is
b530: 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e   only allowed on
b540: 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e   an ".       "IN
b550: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
b560: 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  Y");.#endif.  }e
b570: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
b580: 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72  CreateIndex(pPar
b590: 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69  se, 0, 0, 0, pLi
b5a0: 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a  st, onError, 0,.
b5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5c0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 6f             0, so
b5d0: 72 74 4f 72 64 65 72 2c 20 30 2c 20 53 51 4c 49  rtOrder, 0, SQLI
b5e0: 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41  TE_IDXTYPE_PRIMA
b5f0: 52 59 4b 45 59 29 3b 0a 20 20 20 20 70 4c 69 73  RYKEY);.    pLis
b600: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d  t = 0;.  }..prim
b610: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20  ary_key_exit:.  
b620: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
b630: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
b640: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  , pList);.  retu
b650: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rn;.}../*.** Add
b660: 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e   a new CHECK con
b670: 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74  straint to the t
b680: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
b690: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
b6a0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
b6b0: 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72  e3AddCheckConstr
b6c0: 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
b6d0: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
b6e0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
b6f0: 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78    Expr *pCheckEx
b700: 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b  pr  /* The check
b710: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29   expression */.)
b720: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
b730: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61  _OMIT_CHECK.  Ta
b740: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
b750: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
b760: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b770: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
b780: 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43   pTab && !IN_DEC
b790: 4c 41 52 45 5f 56 54 41 42 0a 20 20 20 26 26 20  LARE_VTAB.   && 
b7a0: 21 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52  !sqlite3BtreeIsR
b7b0: 65 61 64 6f 6e 6c 79 28 64 62 2d 3e 61 44 62 5b  eadonly(db->aDb[
b7c0: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e 70 42  db->init.iDb].pB
b7d0: 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 61 62  t).  ){.    pTab
b7e0: 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74  ->pCheck = sqlit
b7f0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
b800: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70  (pParse, pTab->p
b810: 43 68 65 63 6b 2c 20 70 43 68 65 63 6b 45 78 70  Check, pCheckExp
b820: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72  r);.    if( pPar
b830: 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61  se->constraintNa
b840: 6d 65 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73 71  me.n ){.      sq
b850: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
b860: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 54 61  Name(pParse, pTa
b870: 62 2d 3e 70 43 68 65 63 6b 2c 20 26 70 50 61 72  b->pCheck, &pPar
b880: 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61  se->constraintNa
b890: 6d 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  me, 1);.    }.  
b8a0: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
b8b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
b8c0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
b8d0: 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a  b, pCheckExpr);.
b8e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
b8f0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
b900: 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  unction of the m
b910: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72  ost recently par
b920: 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  sed table column
b930: 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53  .** to the CollS
b940: 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69  eq given..*/.voi
b950: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c  d sqlite3AddColl
b960: 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70  ateType(Parse *p
b970: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  Parse, Token *pT
b980: 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a  oken){.  Table *
b990: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
b9a0: 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20  ar *zColl;      
b9b0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f          /* Dequo
b9c0: 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c  ted name of coll
b9d0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a  ation sequence *
b9e0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
b9f0: 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ..  if( (p = pPa
ba00: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
ba10: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
ba20: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
ba30: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
ba40: 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  zColl = sqlit
ba50: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
ba60: 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69  db, pToken);.  i
ba70: 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75  f( !zColl ) retu
ba80: 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  rn;..  if( sqlit
ba90: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
baa0: 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29  pParse, zColl) )
bab0: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
bac0: 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  x;.    sqlite3Db
bad0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  Free(db, p->aCol
bae0: 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  [i].zColl);.    
baf0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c  p->aCol[i].zColl
bb00: 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20   = zColl;.  .   
bb10: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
bb20: 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61 73  n is declared as
bb30: 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59   "<name> PRIMARY
bb40: 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79   KEY COLLATE <ty
bb50: 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65  pe>",.    ** the
bb60: 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68  n an index may h
bb70: 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64  ave been created
bb80: 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20   on this column 
bb90: 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a  before the.    *
bba0: 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65  * collation type
bbb0: 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72   was added. Corr
bbc0: 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20 69  ect this if it i
bbd0: 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20  s the case..    
bbe0: 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  */.    for(pIdx=
bbf0: 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
bc00: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
bc10: 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t){.      assert
bc20: 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d  ( pIdx->nKeyCol=
bc30: 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =1 );.      if( 
bc40: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
bc50: 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==i ){.        
bc60: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20  pIdx->azColl[0] 
bc70: 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  = p->aCol[i].zCo
bc80: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
bc90: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
bca0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
bcb0: 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a   zColl);.  }.}..
bcc0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
bcd0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
bce0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
bcf0: 63 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ce for database 
bd00: 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65  native text.** e
bd10: 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69  ncoding identifi
bd20: 65 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67  ed by the string
bd30: 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e   zName, length n
bd40: 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Name..**.** If t
bd50: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
bd60: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
bd70: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
bd80: 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62  , or not availab
bd90: 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  le.** in the dat
bda0: 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63  abase native enc
bdb0: 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61  oding, the colla
bdc0: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20  tion factory is 
bdd0: 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65  invoked to.** re
bde0: 71 75 65 73 74 20 69 74 2e 20 49 66 20 74 68 65  quest it. If the
bdf0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
be00: 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ry does not supp
be10: 6c 79 20 73 75 63 68 20 61 20 73 65 71 75 65 6e  ly such a sequen
be20: 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  ce,.** and the s
be30: 65 71 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c  equence is avail
be40: 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20  able in another 
be50: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74  text encoding, t
be60: 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72  hen that is.** r
be70: 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e  eturned instead.
be80: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72  .**.** If no ver
be90: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71  sions of the req
bea0: 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  uested collation
beb0: 73 20 73 65 71 75 65 6e 63 65 20 61 72 65 20 61  s sequence are a
bec0: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20  vailable, or.** 
bed0: 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63  another error oc
bee0: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
bef0: 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72  turned and an er
bf00: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74  ror message writ
bf10: 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72  ten into.** pPar
bf20: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
bf30: 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72 61 70  outine is a wrap
bf40: 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
bf50: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e  e3FindCollSeq().
bf60: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
bf70: 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f  * invokes the co
bf80: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
bf90: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c  if the named col
bfa0: 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  lation cannot be
bfb0: 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65   found.** and ge
bfc0: 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72  nerates an error
bfd0: 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   message..**.** 
bfe0: 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65  See also: sqlite
bff0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20  3FindCollSeq(), 
c000: 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65  sqlite3GetCollSe
c010: 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a  q().*/.CollSeq *
c020: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
c030: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
c040: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
c050: 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65  zName){.  sqlite
c060: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
c070: 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45  db;.  u8 enc = E
c080: 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69  NC(db);.  u8 ini
c090: 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74  tbusy = db->init
c0a0: 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71  .busy;.  CollSeq
c0b0: 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c   *pColl;..  pCol
c0c0: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
c0d0: 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20  ollSeq(db, enc, 
c0e0: 7a 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29  zName, initbusy)
c0f0: 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73  ;.  if( !initbus
c100: 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20  y && (!pColl || 
c110: 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b  !pColl->xCmp) ){
c120: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
c130: 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70  ite3GetCollSeq(p
c140: 50 61 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c  Parse, enc, pCol
c150: 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a  l, zName);.  }..
c160: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
c170: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
c180: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
c190: 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  l increment the 
c1a0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a  schema cookie..*
c1b0: 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20  *.** The schema 
c1c0: 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74  cookie is used t
c1d0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e  o determine when
c1e0: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
c1f0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
c200: 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20  changes.  After 
c210: 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e  each schema chan
c220: 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  ge, the cookie v
c230: 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  alue.** changes.
c240: 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73    When a process
c250: 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65   first reads the
c260: 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72   schema it recor
c270: 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65  ds the.** cookie
c280: 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77  .  Thereafter, w
c290: 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20  henever it goes 
c2a0: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
c2b0: 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68  tabase,.** it ch
c2c0: 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  ecks the cookie 
c2d0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
c2e0: 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20   schema has not 
c2f0: 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65  changed.** since
c300: 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61   it was last rea
c310: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c  d..**.** This pl
c320: 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65  an is not comple
c330: 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f  tely bullet-proo
c340: 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62  f.  It is possib
c350: 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63  le for.** the sc
c360: 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d  hema to change m
c370: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e  ultiple times an
c380: 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65  d for the cookie
c390: 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61   to be.** set ba
c3a0: 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75  ck to prior valu
c3b0: 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63  e.  But schema c
c3c0: 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65  hanges are infre
c3d0: 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65  quent.** and the
c3e0: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
c3f0: 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65  hitting the same
c400: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73   cookie value is
c410: 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63   only.** 1 chanc
c420: 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77  e in 2^32.  So w
c430: 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68  e're safe enough
c440: 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e  ..**.** IMPLEMEN
c450: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 33 34 32  TATION-OF: R-342
c460: 33 30 2d 35 36 30 34 39 20 53 51 4c 69 74 65 20  30-56049 SQLite 
c470: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69 6e  automatically in
c480: 63 72 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20  crements.** the 
c490: 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 77  schema-version w
c4a0: 68 65 6e 65 76 65 72 20 74 68 65 20 73 63 68 65  henever the sche
c4b0: 6d 61 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a 76  ma changes..*/.v
c4c0: 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67  oid sqlite3Chang
c4d0: 65 43 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70  eCookie(Parse *p
c4e0: 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
c4f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c500: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
c510: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
c520: 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
c530: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
c540: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
c550: 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  , 0) );.  sqlite
c560: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
c570: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
c580: 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56  , BTREE_SCHEMA_V
c590: 45 52 53 49 4f 4e 2c 20 0a 20 20 20 20 20 20 20  ERSION, .       
c5a0: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
c5b0: 29 28 31 2b 28 75 6e 73 69 67 6e 65 64 29 64 62  )(1+(unsigned)db
c5c0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
c5d0: 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  ma->schema_cooki
c5e0: 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65  e));.}../*.** Me
c5f0: 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72  asure the number
c600: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e   of characters n
c610: 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20  eeded to output 
c620: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65  the given.** ide
c630: 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75  ntifier.  The nu
c640: 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e  mber returned in
c650: 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65  cludes any quote
c660: 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f  s used.** but do
c670: 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74  es not include t
c680: 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74  he null terminat
c690: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73  or..**.** The es
c6a0: 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72  timate is conser
c6b0: 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68  vative.  It migh
c6c0: 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 74  t be larger that
c6d0: 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c   what is.** real
c6e0: 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  ly needed..*/.st
c6f0: 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65  atic int identLe
c700: 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  ngth(const char 
c710: 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *z){.  int n;.  
c720: 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b  for(n=0; *z; n++
c730: 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , z++){.    if( 
c740: 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20  *z=='"' ){ n++; 
c750: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
c760: 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   + 2;.}../*.** T
c770: 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74  he first paramet
c780: 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
c790: 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75 66  to an output buf
c7a0: 66 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  fer. The second 
c7b0: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
c7c0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
c7d0: 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 63 6f   integer that co
c7e0: 6e 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73 65  ntains the offse
c7f0: 74 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f  t at.** which to
c800: 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20   write into the 
c810: 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54  output buffer. T
c820: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70  his function cop
c830: 69 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74  ies the.** nul-t
c840: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
c850: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
c860: 68 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74  he third paramet
c870: 65 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e 74  er, zSignedIdent
c880: 2c 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65 63  ,.** to the spec
c890: 69 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e 20  ified offset in 
c8a0: 74 68 65 20 62 75 66 66 65 72 20 61 6e 64 20 75  the buffer and u
c8b0: 70 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f 20  pdates *pIdx to 
c8c0: 72 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  refer.** to the 
c8d0: 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72  first byte after
c8e0: 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 77   the last byte w
c8f0: 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72 65  ritten before re
c900: 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20  turning..** .** 
c910: 49 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53  If the string zS
c920: 69 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73 69  ignedIdent consi
c930: 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
c940: 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a  alpha-numeric.**
c950: 20 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f 65   characters, doe
c960: 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68  s not begin with
c970: 20 61 20 64 69 67 69 74 20 61 6e 64 20 69 73 20   a digit and is 
c980: 6e 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f  not an SQL keywo
c990: 72 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69  rd,.** then it i
c9a0: 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20  s copied to the 
c9b0: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 65 78  output buffer ex
c9c0: 61 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e 20  actly as it is. 
c9d0: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74  Otherwise,.** it
c9e0: 20 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e 67   is quoted using
c9f0: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a   double-quotes..
ca00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
ca10: 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c  dentPut(char *z,
ca20: 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72   int *pIdx, char
ca30: 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b   *zSignedIdent){
ca40: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
ca50: 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69   *zIdent = (unsi
ca60: 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e  gned char*)zSign
ca70: 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69  edIdent;.  int i
ca80: 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a  , j, needQuote;.
ca90: 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20    i = *pIdx;..  
caa0: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
cab0: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  j]; j++){.    if
cac0: 28 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75  ( !sqlite3Isalnu
cad0: 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20  m(zIdent[j]) && 
cae0: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29  zIdent[j]!='_' )
caf0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65   break;.  }.  ne
cb00: 65 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65  edQuote = sqlite
cb10: 33 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b  3Isdigit(zIdent[
cb20: 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0]).            
cb30: 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72  || sqlite3Keywor
cb40: 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29  dCode(zIdent, j)
cb50: 21 3d 54 4b 5f 49 44 0a 20 20 20 20 20 20 20 20  !=TK_ID.        
cb60: 20 20 20 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d      || zIdent[j]
cb70: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
cb80: 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28 20  || j==0;..  if( 
cb90: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
cba0: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28  +] = '"';.  for(
cbb0: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
cbc0: 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d  j++){.    z[i++]
cbd0: 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20   = zIdent[j];.  
cbe0: 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d    if( zIdent[j]=
cbf0: 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  ='"' ) z[i++] = 
cc00: 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  '"';.  }.  if( n
cc10: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
cc20: 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20  ] = '"';.  z[i] 
cc30: 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69  = 0;.  *pIdx = i
cc40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
cc50: 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42  ate a CREATE TAB
cc60: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70  LE statement app
cc70: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
cc80: 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e   given.** table.
cc90: 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64    Memory to hold
cca0: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
ccb0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62   statement is ob
ccc0: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73  tained.** from s
ccd0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
cce0: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
ccf0: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
cd00: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
cd10: 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54  ic char *createT
cd20: 61 62 6c 65 53 74 6d 74 28 73 71 6c 69 74 65 33  ableStmt(sqlite3
cd30: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b   *db, Table *p){
cd40: 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a  .  int i, k, n;.
cd50: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
cd60: 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53   char *zSep, *zS
cd70: 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f  ep2, *zEnd;.  Co
cd80: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20  lumn *pCol;.  n 
cd90: 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20  = 0;.  for(pCol 
cda0: 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  = p->aCol, i=0; 
cdb0: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
cdc0: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b  pCol++){.    n +
cdd0: 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43  = identLength(pC
cde0: 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a  ol->zName) + 5;.
cdf0: 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74    }.  n += ident
ce00: 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29  Length(p->zName)
ce10: 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 20  ;.  if( n<50 ){ 
ce20: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a  .    zSep = "";.
ce30: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b      zSep2 = ",";
ce40: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b  .    zEnd = ")";
ce50: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53  .  }else{.    zS
ce60: 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20  ep = "\n  ";.   
ce70: 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22   zSep2 = ",\n  "
ce80: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e  ;.    zEnd = "\n
ce90: 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33  )";.  }.  n += 3
cea0: 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20  5 + 6*p->nCol;. 
ceb0: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
cec0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e  DbMallocRaw(0, n
ced0: 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d  );.  if( zStmt==
cee0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
cef0: 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
cf00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
cf10: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
cf20: 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52  tf(n, zStmt, "CR
cf30: 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20  EATE TABLE ");. 
cf40: 20 6b 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   k = sqlite3Strl
cf50: 65 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69  en30(zStmt);.  i
cf60: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
cf70: 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  k, p->zName);.  
cf80: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27  zStmt[k++] = '('
cf90: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e  ;.  for(pCol=p->
cfa0: 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e  aCol, i=0; i<p->
cfb0: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
cfc0: 2b 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  +){.    static c
cfd0: 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73  onst char * cons
cfe0: 74 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20  t azType[] = {. 
cff0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
d000: 5f 41 46 46 5f 42 4c 4f 42 20 20 20 20 2a 2f 20  _AFF_BLOB    */ 
d010: 22 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  "",.        /* S
d020: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20  QLITE_AFF_TEXT  
d030: 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20    */ " TEXT",.  
d040: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
d050: 41 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22  AFF_NUMERIC */ "
d060: 20 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f   NUM",.        /
d070: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  * SQLITE_AFF_INT
d080: 45 47 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a  EGER */ " INT",.
d090: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
d0a0: 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f  E_AFF_REAL    */
d0b0: 20 22 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a   " REAL".    };.
d0c0: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
d0d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
d0e0: 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  pe;..    sqlite3
d0f0: 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26  _snprintf(n-k, &
d100: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b  zStmt[k], zSep);
d110: 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65  .    k += sqlite
d120: 33 53 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74  3Strlen30(&zStmt
d130: 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d  [k]);.    zSep =
d140: 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e   zSep2;.    iden
d150: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
d160: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
d170: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
d180: 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f  affinity-SQLITE_
d190: 41 46 46 5f 42 4c 4f 42 20 3e 3d 20 30 20 29 3b  AFF_BLOB >= 0 );
d1a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f  .    assert( pCo
d1b0: 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49  l->affinity-SQLI
d1c0: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3c 20 41 72  TE_AFF_BLOB < Ar
d1d0: 72 61 79 53 69 7a 65 28 61 7a 54 79 70 65 29 20  raySize(azType) 
d1e0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
d1f0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
d200: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
d210: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
d220: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
d230: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
d240: 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  T );.    testcas
d250: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
d260: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  y==SQLITE_AFF_NU
d270: 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 74 65 73  MERIC );.    tes
d280: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
d290: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
d2a0: 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20  F_INTEGER );.   
d2b0: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
d2c0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
d2d0: 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20  E_AFF_REAL );.  
d2e0: 20 20 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 61    .    zType = a
d2f0: 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69  zType[pCol->affi
d300: 6e 69 74 79 20 2d 20 53 51 4c 49 54 45 5f 41 46  nity - SQLITE_AF
d310: 46 5f 42 4c 4f 42 5d 3b 0a 20 20 20 20 6c 65 6e  F_BLOB];.    len
d320: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
d330: 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 61  30(zType);.    a
d340: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66  ssert( pCol->aff
d350: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
d360: 46 5f 42 4c 4f 42 20 0a 20 20 20 20 20 20 20 20  F_BLOB .        
d370: 20 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66      || pCol->aff
d380: 69 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33 41 66  inity==sqlite3Af
d390: 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65  finityType(zType
d3a0: 2c 20 30 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63  , 0) );.    memc
d3b0: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54  py(&zStmt[k], zT
d3c0: 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b  ype, len);.    k
d3d0: 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73   += len;.    ass
d3e0: 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d  ert( k<=n );.  }
d3f0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
d400: 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b  ntf(n-k, &zStmt[
d410: 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b  k], "%s", zEnd);
d420: 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b  .  return zStmt;
d430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65  .}../*.** Resize
d440: 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   an Index object
d450: 20 74 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d   to hold N colum
d460: 6e 73 20 74 6f 74 61 6c 2e 20 20 52 65 74 75 72  ns total.  Retur
d470: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
d480: 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 53 51  n success and SQ
d490: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e  LITE_NOMEM on an
d4a0: 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73   OOM error..*/.s
d4b0: 74 61 74 69 63 20 69 6e 74 20 72 65 73 69 7a 65  tatic int resize
d4c0: 49 6e 64 65 78 4f 62 6a 65 63 74 28 73 71 6c 69  IndexObject(sqli
d4d0: 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a  te3 *db, Index *
d4e0: 70 49 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  pIdx, int N){.  
d4f0: 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20  char *zExtra;.  
d500: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28  int nByte;.  if(
d510: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
d520: 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  N ) return SQLIT
d530: 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
d540: 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d  pIdx->isResized=
d550: 3d 30 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20  =0 );.  nByte = 
d560: 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b  (sizeof(char*) +
d570: 20 73 69 7a 65 6f 66 28 69 31 36 29 20 2b 20 31   sizeof(i16) + 1
d580: 29 2a 4e 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20  )*N;.  zExtra = 
d590: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
d5a0: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
d5b0: 20 20 69 66 28 20 7a 45 78 74 72 61 3d 3d 30 20    if( zExtra==0 
d5c0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
d5d0: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65  NOMEM_BKPT;.  me
d5e0: 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64  mcpy(zExtra, pId
d5f0: 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f  x->azColl, sizeo
d600: 66 28 63 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e  f(char*)*pIdx->n
d610: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d  Column);.  pIdx-
d620: 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74  >azColl = (const
d630: 20 63 68 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a   char**)zExtra;.
d640: 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65    zExtra += size
d650: 6f 66 28 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d  of(char*)*N;.  m
d660: 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49  emcpy(zExtra, pI
d670: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69  dx->aiColumn, si
d680: 7a 65 6f 66 28 69 31 36 29 2a 70 49 64 78 2d 3e  zeof(i16)*pIdx->
d690: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78  nColumn);.  pIdx
d6a0: 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31  ->aiColumn = (i1
d6b0: 36 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78  6*)zExtra;.  zEx
d6c0: 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31  tra += sizeof(i1
d6d0: 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a  6)*N;.  memcpy(z
d6e0: 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f  Extra, pIdx->aSo
d6f0: 72 74 4f 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e  rtOrder, pIdx->n
d700: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d  Column);.  pIdx-
d710: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
d720: 38 2a 29 7a 45 78 74 72 61 3b 0a 20 20 70 49 64  8*)zExtra;.  pId
d730: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a  x->nColumn = N;.
d740: 20 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65    pIdx->isResize
d750: 64 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  d = 1;.  return 
d760: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d770: 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
d780: 20 74 6f 74 61 6c 20 72 6f 77 20 77 69 64 74 68   total row width
d790: 20 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f   for a table..*/
d7a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 73 74  .static void est
d7b0: 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28  imateTableWidth(
d7c0: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
d7d0: 75 6e 73 69 67 6e 65 64 20 77 54 61 62 6c 65 20  unsigned wTable 
d7e0: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  = 0;.  const Col
d7f0: 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20  umn *pTabCol;.  
d800: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70  int i;.  for(i=p
d810: 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43  Tab->nCol, pTabC
d820: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
d830: 3e 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c  >0; i--, pTabCol
d840: 2b 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c 65 20  ++){.    wTable 
d850: 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73  += pTabCol->szEs
d860: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  t;.  }.  if( pTa
d870: 62 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77 54 61  b->iPKey<0 ) wTa
d880: 62 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73  ble++;.  pTab->s
d890: 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65  zTabRow = sqlite
d8a0: 33 4c 6f 67 45 73 74 28 77 54 61 62 6c 65 2a 34  3LogEst(wTable*4
d8b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  );.}../*.** Esti
d8c0: 6d 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65  mate the average
d8d0: 20 73 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 66   size of a row f
d8e0: 6f 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a  or an index..*/.
d8f0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69  static void esti
d900: 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 49  mateIndexWidth(I
d910: 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75  ndex *pIdx){.  u
d920: 6e 73 69 67 6e 65 64 20 77 49 6e 64 65 78 20 3d  nsigned wIndex =
d930: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63   0;.  int i;.  c
d940: 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  onst Column *aCo
d950: 6c 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  l = pIdx->pTable
d960: 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d  ->aCol;.  for(i=
d970: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; i<pIdx->nColu
d980: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31  mn; i++){.    i1
d990: 36 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  6 x = pIdx->aiCo
d9a0: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73  lumn[i];.    ass
d9b0: 65 72 74 28 20 78 3c 70 49 64 78 2d 3e 70 54 61  ert( x<pIdx->pTa
d9c0: 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  ble->nCol );.   
d9d0: 20 77 49 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f   wIndex += x<0 ?
d9e0: 20 31 20 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e   1 : aCol[pIdx->
d9f0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45  aiColumn[i]].szE
da00: 73 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e  st;.  }.  pIdx->
da10: 73 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c 69 74  szIdxRow = sqlit
da20: 65 33 4c 6f 67 45 73 74 28 77 49 6e 64 65 78 2a  e3LogEst(wIndex*
da30: 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  4);.}../* Return
da40: 20 74 72 75 65 20 69 66 20 76 61 6c 75 65 20 78   true if value x
da50: 20 69 73 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66   is found any of
da60: 20 74 68 65 20 66 69 72 73 74 20 6e 43 6f 6c 20   the first nCol 
da70: 65 6e 74 72 69 65 73 20 6f 66 20 61 69 43 6f 6c  entries of aiCol
da80: 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  [].*/.static int
da90: 20 68 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74   hasColumn(const
daa0: 20 69 31 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74   i16 *aiCol, int
dab0: 20 6e 43 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20   nCol, int x){. 
dac0: 20 77 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e   while( nCol-- >
dad0: 20 30 20 29 20 69 66 28 20 78 3d 3d 2a 28 61 69   0 ) if( x==*(ai
dae0: 43 6f 6c 2b 2b 29 20 29 20 72 65 74 75 72 6e 20  Col++) ) return 
daf0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
db00: 0a 0a 2f 2a 20 52 65 63 6f 6d 70 75 74 65 20 74  ../* Recompute t
db10: 68 65 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 66  he colNotIdxed f
db20: 69 65 6c 64 20 6f 66 20 74 68 65 20 49 6e 64 65  ield of the Inde
db30: 78 2e 0a 2a 2a 0a 2a 2a 20 63 6f 6c 4e 6f 74 49  x..**.** colNotI
db40: 64 78 65 64 20 69 73 20 61 20 62 69 74 6d 61 73  dxed is a bitmas
db50: 6b 20 74 68 61 74 20 68 61 73 20 61 20 30 20 62  k that has a 0 b
db60: 69 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  it representing 
db70: 65 61 63 68 20 69 6e 64 65 78 65 64 0a 2a 2a 20  each indexed.** 
db80: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65  columns that are
db90: 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
dba0: 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  t 63 columns of 
dbb0: 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 0a  the table.  The.
dbc0: 2a 2a 20 68 69 67 68 2d 6f 72 64 65 72 20 62 69  ** high-order bi
dbd0: 74 20 6f 66 20 63 6f 6c 4e 6f 74 49 64 78 65 64  t of colNotIdxed
dbe0: 20 69 73 20 61 6c 77 61 79 73 20 31 2e 20 20 41   is always 1.  A
dbf0: 6c 6c 20 75 6e 69 6e 64 65 78 65 64 20 63 6f 6c  ll unindexed col
dc00: 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 74  umns.** of the t
dc10: 61 62 6c 65 20 68 61 76 65 20 61 20 31 2e 0a 2a  able have a 1..*
dc20: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 4e 6f 74 49  *.** The colNotI
dc30: 64 78 65 64 20 6d 61 73 6b 20 69 73 20 41 4e 44  dxed mask is AND
dc40: 2d 65 64 20 77 69 74 68 20 74 68 65 20 53 72 63  -ed with the Src
dc50: 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64  List.a[].colUsed
dc60: 20 6d 61 73 6b 0a 2a 2a 20 74 6f 20 64 65 74 65   mask.** to dete
dc70: 72 6d 69 6e 65 20 69 66 20 74 68 65 20 69 6e 64  rmine if the ind
dc80: 65 78 20 69 73 20 63 6f 76 65 72 69 6e 67 20 69  ex is covering i
dc90: 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
dca0: 76 6f 69 64 20 72 65 63 6f 6d 70 75 74 65 43 6f  void recomputeCo
dcb0: 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28  lumnsNotIndexed(
dcc0: 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
dcd0: 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20  Bitmask m = 0;. 
dce0: 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d   int j;.  for(j=
dcf0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b  pIdx->nColumn-1;
dd00: 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20   j>=0; j--){.   
dd10: 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61   int x = pIdx->a
dd20: 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
dd30: 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20  if( x>=0 ){.    
dd40: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42    testcase( x==B
dd50: 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  MS-1 );.      te
dd60: 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32  stcase( x==BMS-2
dd70: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c   );.      if( x<
dd80: 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53  BMS-1 ) m |= MAS
dd90: 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20  KBIT(x);.    }. 
dda0: 20 7d 0a 20 20 70 49 64 78 2d 3e 63 6f 6c 4e 6f   }.  pIdx->colNo
ddb0: 74 49 64 78 65 64 20 3d 20 7e 6d 3b 0a 20 20 61  tIdxed = ~m;.  a
ddc0: 73 73 65 72 74 28 20 28 70 49 64 78 2d 3e 63 6f  ssert( (pIdx->co
ddd0: 6c 4e 6f 74 49 64 78 65 64 3e 3e 36 33 29 3d 3d  lNotIdxed>>63)==
dde0: 31 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  1 );.}../*.** Th
ddf0: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
de00: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 70 61  at the end of pa
de10: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
de20: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 74  ABLE statement t
de30: 68 61 74 0a 2a 2a 20 68 61 73 20 61 20 57 49 54  hat.** has a WIT
de40: 48 4f 55 54 20 52 4f 57 49 44 20 63 6c 61 75 73  HOUT ROWID claus
de50: 65 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  e.  The job of t
de60: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
de70: 6f 20 63 6f 6e 76 65 72 74 20 62 6f 74 68 0a 2a  o convert both.*
de80: 2a 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  * internal schem
de90: 61 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  a data structure
dea0: 73 20 61 6e 64 20 74 68 65 20 67 65 6e 65 72 61  s and the genera
deb0: 74 65 64 20 56 44 42 45 20 63 6f 64 65 20 73 6f  ted VDBE code so
dec0: 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 61 72   that they.** ar
ded0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  e appropriate fo
dee0: 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  r a WITHOUT ROWI
def0: 44 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20  D table instead 
df00: 6f 66 20 61 20 72 6f 77 69 64 20 74 61 62 6c 65  of a rowid table
df10: 2e 0a 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 63  ..** Changes inc
df20: 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lude:.**.**     
df30: 28 31 29 20 20 53 65 74 20 61 6c 6c 20 63 6f 6c  (1)  Set all col
df40: 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d  umns of the PRIM
df50: 41 52 59 20 4b 45 59 20 73 63 68 65 6d 61 20 6f  ARY KEY schema o
df60: 62 6a 65 63 74 20 74 6f 20 62 65 20 4e 4f 54 20  bject to be NOT 
df70: 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20 20 28 32 29  NULL..**     (2)
df80: 20 20 43 6f 6e 76 65 72 74 20 50 33 20 70 61 72    Convert P3 par
df90: 61 6d 65 74 65 72 20 6f 66 20 74 68 65 20 4f 50  ameter of the OP
dfa0: 5f 43 72 65 61 74 65 42 74 72 65 65 20 66 72 6f  _CreateBtree fro
dfb0: 6d 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 0a  m BTREE_INTKEY .
dfc0: 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e 74 6f  **          into
dfd0: 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 2e 0a   BTREE_BLOBKEY..
dfe0: 2a 2a 20 20 20 20 20 28 33 29 20 20 42 79 70 61  **     (3)  Bypa
dff0: 73 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20  ss the creation 
e000: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  of the sqlite_ma
e010: 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79  ster table entry
e020: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72  .**          for
e030: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
e040: 20 61 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   as the primary 
e050: 6b 65 79 20 69 6e 64 65 78 20 69 73 20 6e 6f 77  key index is now
e060: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 64 65  .**          ide
e070: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73  ntified by the s
e080: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
e090: 6c 65 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  le entry of the 
e0a0: 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a  table itself..**
e0b0: 20 20 20 20 20 28 34 29 20 20 53 65 74 20 74 68       (4)  Set th
e0c0: 65 20 49 6e 64 65 78 2e 74 6e 75 6d 20 6f 66 20  e Index.tnum of 
e0d0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
e0e0: 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20  Index object in 
e0f0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
e100: 73 63 68 65 6d 61 20 74 6f 20 74 68 65 20 72 6f  schema to the ro
e110: 6f 74 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  otpage from the 
e120: 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 20 20  main table..**  
e130: 20 20 20 28 35 29 20 20 41 64 64 20 61 6c 6c 20     (5)  Add all 
e140: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f  table columns to
e150: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
e160: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 0a 2a 2a   Index object.**
e170: 20 20 20 20 20 20 20 20 20 20 73 6f 20 74 68 61            so tha
e180: 74 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  t the PRIMARY KE
e190: 59 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20  Y is a covering 
e1a0: 69 6e 64 65 78 2e 20 20 54 68 65 20 73 75 72 70  index.  The surp
e1b0: 6c 75 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  lus.**          
e1c0: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70 61 72 74  columns are part
e1d0: 20 6f 66 20 4b 65 79 49 6e 66 6f 2e 6e 41 6c 6c   of KeyInfo.nAll
e1e0: 46 69 65 6c 64 20 61 6e 64 20 61 72 65 20 6e 6f  Field and are no
e1f0: 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20  t used for.**   
e200: 20 20 20 20 20 20 20 73 6f 72 74 69 6e 67 20 6f         sorting o
e210: 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e 69 71  r lookup or uniq
e220: 75 65 6e 65 73 73 20 63 68 65 63 6b 73 2e 0a 2a  ueness checks..*
e230: 2a 20 20 20 20 20 28 36 29 20 20 52 65 70 6c 61  *     (6)  Repla
e240: 63 65 20 74 68 65 20 72 6f 77 69 64 20 74 61 69  ce the rowid tai
e250: 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d 61 74  l on all automat
e260: 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64  ically generated
e270: 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20 20 20 20   UNIQUE.**      
e280: 20 20 20 20 69 6e 64 69 63 65 73 20 77 69 74 68      indices with
e290: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
e2a0: 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20   columns..**.** 
e2b0: 46 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c  For virtual tabl
e2c0: 65 73 2c 20 6f 6e 6c 79 20 28 31 29 20 69 73 20  es, only (1) is 
e2d0: 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74  performed..*/.st
e2e0: 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 76 65 72  atic void conver
e2f0: 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54  tToWithoutRowidT
e300: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
e310: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  se, Table *pTab)
e320: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  {.  Index *pIdx;
e330: 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 0a 20  .  Index *pPk;. 
e340: 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e 74 20   int nPk;.  int 
e350: 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20  i, j;.  sqlite3 
e360: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
e370: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
e380: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20  arse->pVdbe;..  
e390: 2f 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 50 52  /* Mark every PR
e3a0: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
e3b0: 20 61 73 20 4e 4f 54 20 4e 55 4c 4c 20 28 65 78   as NOT NULL (ex
e3c0: 63 65 70 74 20 66 6f 72 20 69 6d 70 6f 73 74 65  cept for imposte
e3d0: 72 20 74 61 62 6c 65 73 29 0a 20 20 2a 2f 0a 20  r tables).  */. 
e3e0: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69   if( !db->init.i
e3f0: 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29 7b 0a  mposterTable ){.
e400: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
e410: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
e420: 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62  .      if( (pTab
e430: 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c 61  ->aCol[i].colFla
e440: 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49  gs & COLFLAG_PRI
e450: 4d 4b 45 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  MKEY)!=0 ){.    
e460: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
e470: 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 4f 45 5f 41  ].notNull = OE_A
e480: 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
e490: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f    }.  }..  /* Co
e4a0: 6e 76 65 72 74 20 74 68 65 20 50 33 20 6f 70 65  nvert the P3 ope
e4b0: 72 61 6e 64 20 6f 66 20 74 68 65 20 4f 50 5f 43  rand of the OP_C
e4c0: 72 65 61 74 65 42 74 72 65 65 20 6f 70 63 6f 64  reateBtree opcod
e4d0: 65 20 66 72 6f 6d 20 42 54 52 45 45 5f 49 4e 54  e from BTREE_INT
e4e0: 4b 45 59 0a 20 20 2a 2a 20 69 6e 74 6f 20 42 54  KEY.  ** into BT
e4f0: 52 45 45 5f 42 4c 4f 42 4b 45 59 2e 0a 20 20 2a  REE_BLOBKEY..  *
e500: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
e510: 61 64 64 72 43 72 54 61 62 20 29 7b 0a 20 20 20  addrCrTab ){.   
e520: 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20   assert( v );.  
e530: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
e540: 6e 67 65 50 33 28 76 2c 20 70 50 61 72 73 65 2d  ngeP3(v, pParse-
e550: 3e 61 64 64 72 43 72 54 61 62 2c 20 42 54 52 45  >addrCrTab, BTRE
e560: 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a 20 20 7d 0a  E_BLOBKEY);.  }.
e570: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
e580: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
e590: 65 78 2e 20 20 4f 72 2c 20 69 66 20 74 68 69 73  ex.  Or, if this
e5a0: 20 74 61 62 6c 65 20 77 61 73 20 6f 72 69 67 69   table was origi
e5b0: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61 6e 20 49 4e  nally.  ** an IN
e5c0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
e5d0: 59 20 74 61 62 6c 65 2c 20 63 72 65 61 74 65 20  Y table, create 
e5e0: 61 20 6e 65 77 20 50 52 49 4d 41 52 59 20 4b 45  a new PRIMARY KE
e5f0: 59 20 69 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a 20  Y index. .  */. 
e600: 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79   if( pTab->iPKey
e610: 3e 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  >=0 ){.    ExprL
e620: 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20  ist *pList;.    
e630: 54 6f 6b 65 6e 20 69 70 6b 54 6f 6b 65 6e 3b 0a  Token ipkToken;.
e640: 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
e650: 49 6e 69 74 28 26 69 70 6b 54 6f 6b 65 6e 2c 20  Init(&ipkToken, 
e660: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
e670: 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a  >iPKey].zName);.
e680: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
e690: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
e6a0: 64 28 70 50 61 72 73 65 2c 20 30 2c 20 0a 20 20  d(pParse, 0, .  
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6c0: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
e6d0: 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 69 70 6b  (db, TK_ID, &ipk
e6e0: 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20  Token, 0));.    
e6f0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
e700: 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 69 73 74  eturn;.    pList
e710: 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
e720: 20 3d 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f   = pParse->iPkSo
e730: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 61 73 73  rtOrder;.    ass
e740: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65  ert( pParse->pNe
e750: 77 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a  wTable==pTab );.
e760: 20 20 20 20 73 71 6c 69 74 65 33 43 72 65 61 74      sqlite3Creat
e770: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30  eIndex(pParse, 0
e780: 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 70  , 0, 0, pList, p
e790: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c  Tab->keyConf, 0,
e7a0: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20   0, 0, 0,.      
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7c0: 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f   SQLITE_IDXTYPE_
e7d0: 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20  PRIMARYKEY);.   
e7e0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
e7f0: 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
e800: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
e810: 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65      pPk = sqlite
e820: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
e830: 28 70 54 61 62 29 3b 0a 20 20 20 20 70 54 61 62  (pTab);.    pTab
e840: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
e850: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 20 3d  }else{.    pPk =
e860: 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
e870: 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 0a  eyIndex(pTab);..
e880: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65      /*.    ** Re
e890: 6d 6f 76 65 20 61 6c 6c 20 72 65 64 75 6e 64 61  move all redunda
e8a0: 6e 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  nt columns from 
e8b0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  the PRIMARY KEY.
e8c0: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63    For example, c
e8d0: 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 22 50 52  hange.    ** "PR
e8e0: 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 61 2c  IMARY KEY(a,b,a,
e8f0: 62 2c 63 2c 62 2c 63 2c 64 29 22 20 69 6e 74 6f  b,c,b,c,d)" into
e900: 20 6a 75 73 74 20 22 50 52 49 4d 41 52 59 20 4b   just "PRIMARY K
e910: 45 59 28 61 2c 62 2c 63 2c 64 29 22 2e 20 20 4c  EY(a,b,c,d)".  L
e920: 61 74 65 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65  ater.    ** code
e930: 20 61 73 73 75 6d 65 73 20 74 68 65 20 50 52 49   assumes the PRI
e940: 4d 41 52 59 20 4b 45 59 20 63 6f 6e 74 61 69 6e  MARY KEY contain
e950: 73 20 6e 6f 20 72 65 70 65 61 74 65 64 20 63 6f  s no repeated co
e960: 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  lumns..    */.  
e970: 20 20 66 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c 70    for(i=j=1; i<p
e980: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b  Pk->nKeyCol; i++
e990: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73  ){.      if( has
e9a0: 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f  Column(pPk->aiCo
e9b0: 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69  lumn, j, pPk->ai
e9c0: 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20  Column[i]) ){.  
e9d0: 20 20 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75        pPk->nColu
e9e0: 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  mn--;.      }els
e9f0: 65 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e  e{.        pPk->
ea00: 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20  aiColumn[j++] = 
ea10: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
ea20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ea30: 20 20 20 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c      pPk->nKeyCol
ea40: 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = j;.  }.  asse
ea50: 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20  rt( pPk!=0 );.  
ea60: 70 50 6b 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  pPk->isCovering 
ea70: 3d 20 31 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e  = 1;.  if( !db->
ea80: 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62  init.imposterTab
ea90: 6c 65 20 29 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f  le ) pPk->uniqNo
eaa0: 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 6e 50 6b  tNull = 1;.  nPk
eab0: 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   = pPk->nKeyCol;
eac0: 0a 0a 20 20 2f 2a 20 42 79 70 61 73 73 20 74 68  ..  /* Bypass th
ead0: 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68  e creation of th
eae0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 62 74  e PRIMARY KEY bt
eaf0: 72 65 65 20 61 6e 64 20 74 68 65 20 73 71 6c 69  ree and the sqli
eb00: 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74  te_master.  ** t
eb10: 61 62 6c 65 20 65 6e 74 72 79 2e 20 54 68 69 73  able entry. This
eb20: 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65   is only require
eb30: 64 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 67  d if currently g
eb40: 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 0a 20  enerating VDBE. 
eb50: 20 2a 2a 20 63 6f 64 65 20 66 6f 72 20 61 20 43   ** code for a C
eb60: 52 45 41 54 45 20 54 41 42 4c 45 20 28 6e 6f 74  REATE TABLE (not
eb70: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 6f 6e   when parsing on
eb80: 65 20 61 73 20 70 61 72 74 20 6f 66 20 72 65 61  e as part of rea
eb90: 64 69 6e 67 0a 20 20 2a 2a 20 61 20 64 61 74 61  ding.  ** a data
eba0: 62 61 73 65 20 73 63 68 65 6d 61 29 2e 20 20 2a  base schema).  *
ebb0: 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 6b  /.  if( v && pPk
ebc0: 2d 3e 74 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20  ->tnum>0 ){.    
ebd0: 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74  assert( db->init
ebe0: 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20  .busy==0 );.    
ebf0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
ec00: 65 4f 70 63 6f 64 65 28 76 2c 20 70 50 6b 2d 3e  eOpcode(v, pPk->
ec10: 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  tnum, OP_Goto);.
ec20: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 6f    }..  /* The ro
ec30: 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 50  ot page of the P
ec40: 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 74 68  RIMARY KEY is th
ec50: 65 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67  e table root pag
ec60: 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d  e */.  pPk->tnum
ec70: 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a   = pTab->tnum;..
ec80: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
ec90: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
eca0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
ecb0: 55 4e 49 51 55 45 20 69 6e 64 69 63 65 73 20 62  UNIQUE indices b
ecc0: 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20 2a  y converting.  *
ecd0: 2a 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69  * the final rowi
ece0: 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e  d column into on
ecf0: 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e  e or more column
ed00: 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  s of the PRIMARY
ed10: 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   KEY..  */.  for
ed20: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
ed30: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
ed40: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
ed50: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20   int n;.    if( 
ed60: 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
ed70: 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e  x(pIdx) ) contin
ed80: 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d  ue;.    for(i=n=
ed90: 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a  0; i<nPk; i++){.
eda0: 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f        if( !hasCo
edb0: 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c  lumn(pIdx->aiCol
edc0: 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43  umn, pIdx->nKeyC
edd0: 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ol, pPk->aiColum
ede0: 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20 20  n[i]) ) n++;.   
edf0: 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20   }.    if( n==0 
ee00: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
ee10: 20 69 6e 64 65 78 20 69 73 20 61 20 73 75 70 65   index is a supe
ee20: 72 73 65 74 20 6f 66 20 74 68 65 20 70 72 69 6d  rset of the prim
ee30: 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20  ary key */.     
ee40: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d   pIdx->nColumn =
ee50: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a   pIdx->nKeyCol;.
ee60: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
ee70: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65      }.    if( re
ee80: 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  sizeIndexObject(
ee90: 64 62 2c 20 70 49 64 78 2c 20 70 49 64 78 2d 3e  db, pIdx, pIdx->
eea0: 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65 74  nKeyCol+n) ) ret
eeb0: 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  urn;.    for(i=0
eec0: 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  , j=pIdx->nKeyCo
eed0: 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a  l; i<nPk; i++){.
eee0: 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f        if( !hasCo
eef0: 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c  lumn(pIdx->aiCol
ef00: 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43  umn, pIdx->nKeyC
ef10: 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ol, pPk->aiColum
ef20: 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  n[i]) ){.       
ef30: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
ef40: 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  j] = pPk->aiColu
ef50: 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70  mn[i];.        p
ef60: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d  Idx->azColl[j] =
ef70: 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b   pPk->azColl[i];
ef80: 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  .        j++;.  
ef90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
efa0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
efb0: 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65  olumn>=pIdx->nKe
efc0: 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61 73  yCol+n );.    as
efd0: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
efe0: 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20  umn>=j );.  }.. 
eff0: 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61 62 6c   /* Add all tabl
f000: 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65  e columns to the
f010: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
f020: 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  ex.  */.  if( nP
f030: 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  k<pTab->nCol ){.
f040: 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e      if( resizeIn
f050: 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 50  dexObject(db, pP
f060: 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  k, pTab->nCol) )
f070: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72   return;.    for
f080: 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70  (i=0, j=nPk; i<p
f090: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
f0a0: 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43  .      if( !hasC
f0b0: 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c  olumn(pPk->aiCol
f0c0: 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20 20  umn, j, i) ){.  
f0d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
f0e0: 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  pPk->nColumn );.
f0f0: 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43          pPk->aiC
f100: 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20  olumn[j] = i;.  
f110: 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c        pPk->azCol
f120: 6c 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 53 74  l[j] = sqlite3St
f130: 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 20  rBINARY;.       
f140: 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   j++;.      }.  
f150: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
f160: 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20  pPk->nColumn==j 
f170: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
f180: 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a  Tab->nCol==j );.
f190: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b    }else{.    pPk
f1a0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62  ->nColumn = pTab
f1b0: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65  ->nCol;.  }.  re
f1c0: 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f  computeColumnsNo
f1d0: 74 49 6e 64 65 78 65 64 28 70 50 6b 29 3b 0a 7d  tIndexed(pPk);.}
f1e0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
f1f0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
f200: 4c 45 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  LE./*.** Return 
f210: 74 72 75 65 20 69 66 20 7a 4e 61 6d 65 20 69 73  true if zName is
f220: 20 61 20 73 68 61 64 6f 77 20 74 61 62 6c 65 20   a shadow table 
f230: 6e 61 6d 65 20 69 6e 20 74 68 65 20 63 75 72 72  name in the curr
f240: 65 6e 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ent database.** 
f250: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
f260: 2a 20 7a 4e 61 6d 65 20 69 73 20 74 65 6d 70 6f  * zName is tempo
f270: 72 61 72 69 6c 79 20 6d 6f 64 69 66 69 65 64 20  rarily modified 
f280: 77 68 69 6c 65 20 74 68 69 73 20 72 6f 75 74 69  while this routi
f290: 6e 65 20 69 73 20 72 75 6e 6e 69 6e 67 2c 20 62  ne is running, b
f2a0: 75 74 20 69 73 0a 2a 2a 20 72 65 73 74 6f 72 65  ut is.** restore
f2b0: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
f2c0: 6c 20 76 61 6c 75 65 20 70 72 69 6f 72 20 74 6f  l value prior to
f2d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
f2e0: 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
f2f0: 69 63 20 69 6e 74 20 69 73 53 68 61 64 6f 77 54  ic int isShadowT
f300: 61 62 6c 65 4e 61 6d 65 28 73 71 6c 69 74 65 33  ableName(sqlite3
f310: 20 2a 64 62 2c 20 63 68 61 72 20 2a 7a 4e 61 6d   *db, char *zNam
f320: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 61 69  e){.  char *zTai
f330: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
f340: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
f350: 6f 20 74 68 65 20 6c 61 73 74 20 22 5f 22 20 69  o the last "_" i
f360: 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 54 61 62  n zName */.  Tab
f370: 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
f380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
f390: 62 6c 65 20 74 68 61 74 20 7a 4e 61 6d 65 20 69  ble that zName i
f3a0: 73 20 61 20 73 68 61 64 6f 77 20 6f 66 20 2a 2f  s a shadow of */
f3b0: 0a 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 3b  .  Module *pMod;
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3d0: 20 2f 2a 20 4d 6f 64 75 6c 65 20 66 6f 72 20 74   /* Module for t
f3e0: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
f3f0: 20 2a 2f 0a 0a 20 20 7a 54 61 69 6c 20 3d 20 73   */..  zTail = s
f400: 74 72 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27 5f  trrchr(zName, '_
f410: 27 29 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 3d  ');.  if( zTail=
f420: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
f430: 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 70   *zTail = 0;.  p
f440: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
f450: 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
f460: 2c 20 30 29 3b 0a 20 20 2a 7a 54 61 69 6c 20 3d  , 0);.  *zTail =
f470: 20 27 5f 27 3b 0a 20 20 69 66 28 20 70 54 61 62   '_';.  if( pTab
f480: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
f490: 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c    if( !IsVirtual
f4a0: 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
f4b0: 30 3b 0a 20 20 70 4d 6f 64 20 3d 20 28 4d 6f 64  0;.  pMod = (Mod
f4c0: 75 6c 65 2a 29 73 71 6c 69 74 65 33 48 61 73 68  ule*)sqlite3Hash
f4d0: 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  Find(&db->aModul
f4e0: 65 2c 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c  e, pTab->azModul
f4f0: 65 41 72 67 5b 30 5d 29 3b 0a 20 20 69 66 28 20  eArg[0]);.  if( 
f500: 70 4d 6f 64 3d 3d 30 20 29 20 72 65 74 75 72 6e  pMod==0 ) return
f510: 20 30 3b 0a 20 20 69 66 28 20 70 4d 6f 64 2d 3e   0;.  if( pMod->
f520: 70 4d 6f 64 75 6c 65 2d 3e 69 56 65 72 73 69 6f  pModule->iVersio
f530: 6e 3c 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  n<3 ) return 0;.
f540: 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70 4d 6f 64    if( pMod->pMod
f550: 75 6c 65 2d 3e 78 53 68 61 64 6f 77 4e 61 6d 65  ule->xShadowName
f560: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
f570: 20 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e 70    return pMod->p
f580: 4d 6f 64 75 6c 65 2d 3e 78 53 68 61 64 6f 77 4e  Module->xShadowN
f590: 61 6d 65 28 7a 54 61 69 6c 2b 31 29 3b 0a 7d 0a  ame(zTail+1);.}.
f5a0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 69  #else.# define i
f5b0: 73 53 68 61 64 6f 77 54 61 62 6c 65 4e 61 6d 65  sShadowTableName
f5c0: 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 20 2f  (x,y) 0.#endif /
f5d0: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
f5e0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
f5f0: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  E */../*.** This
f600: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
f610: 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65  ed to report the
f620: 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20   final ")" that 
f630: 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20  terminates.** a 
f640: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
f650: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
f660: 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  e table structur
f670: 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74  e that other act
f680: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76  ion routines hav
f690: 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a  e been building.
f6a0: 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
f6b0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  he internal hash
f6c0: 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e   tables, assumin
f6d0: 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65  g no errors have
f6e0: 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  .** occurred..**
f6f0: 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72  .** An entry for
f700: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61   the table is ma
f710: 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  de in the master
f720: 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20   table on disk, 
f730: 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69  unless.** this i
f740: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  s a temporary ta
f750: 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e  ble or db->init.
f760: 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64  busy==1.  When d
f770: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a  b->init.busy==1.
f780: 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61  ** it means we a
f790: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73  re reading the s
f7a0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
f7b0: 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  le because we ju
f7c0: 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  st.** connected 
f7d0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
f7e0: 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73  or because the s
f7f0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
f800: 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74  le has.** recent
f810: 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74  ly changed, so t
f820: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69  he entry for thi
f830: 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  s table already 
f840: 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65  exists in.** the
f850: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
f860: 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  able.  We do not
f870: 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20   want to create 
f880: 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  it again..**.** 
f890: 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61  If the pSelect a
f8a0: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
f8b0: 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ULL, it means th
f8c0: 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  at this routine.
f8d0: 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ** was called to
f8e0: 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   create a table 
f8f0: 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61  generated from a
f900: 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42   .** "CREATE TAB
f910: 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  LE ... AS SELECT
f920: 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e   ..." statement.
f930: 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d    The column nam
f940: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  es of.** the new
f950: 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63   table will matc
f960: 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  h the result set
f970: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
f980: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
f990: 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  ndTable(.  Parse
f9a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
f9b0: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
f9c0: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
f9d0: 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20  pCons,          
f9e0: 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65   /* The ',' toke
f9f0: 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  n after the last
fa00: 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f   column defn. */
fa10: 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20  .  Token *pEnd, 
fa20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
fa30: 65 20 27 29 27 20 62 65 66 6f 72 65 20 6f 70 74  e ')' before opt
fa40: 69 6f 6e 73 20 69 6e 20 74 68 65 20 43 52 45 41  ions in the CREA
fa50: 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75 38  TE TABLE */.  u8
fa60: 20 74 61 62 4f 70 74 73 2c 20 20 20 20 20 20 20   tabOpts,       
fa70: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 74        /* Extra t
fa80: 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20 55 73  able options. Us
fa90: 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20 53 65  ually 0. */.  Se
faa0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
fab0: 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20        /* Select 
fac0: 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e  from a "CREATE .
fad0: 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f  .. AS SELECT" */
fae0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 20  .){.  Table *p; 
faf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb00: 2f 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65  /* The new table
fb10: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
fb20: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
fb30: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
fb40: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
fb50: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
fb60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
fb70: 61 62 61 73 65 20 69 6e 20 77 68 69 63 68 20 74  abase in which t
fb80: 68 65 20 74 61 62 6c 65 20 6c 69 76 65 73 20 2a  he table lives *
fb90: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
fba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fbb0: 20 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65   An implied inde
fbc0: 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  x of the table *
fbd0: 2f 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d 30  /..  if( pEnd==0
fbe0: 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 20 29   && pSelect==0 )
fbf0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
fc00: 7d 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  }.  assert( !db-
fc10: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
fc20: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
fc30: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
fc40: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  p==0 ) return;..
fc50: 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30    if( pSelect==0
fc60: 20 26 26 20 69 73 53 68 61 64 6f 77 54 61 62 6c   && isShadowTabl
fc70: 65 4e 61 6d 65 28 64 62 2c 20 70 2d 3e 7a 4e 61  eName(db, p->zNa
fc80: 6d 65 29 20 29 7b 0a 20 20 20 20 70 2d 3e 74 61  me) ){.    p->ta
fc90: 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 53 68 61  bFlags |= TF_Sha
fca0: 64 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dow;.  }..  /* I
fcb0: 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
fcc0: 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e  usy is 1 it mean
fcd0: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
fce0: 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
fcf0: 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
fd00: 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65  ster" or "sqlite
fd10: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61  _temp_master" ta
fd20: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
fd30: 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20  .  ** So do not 
fd40: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73  write to the dis
fd50: 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  k again.  Extrac
fd60: 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
fd70: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
fd80: 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
fd90: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  he db->init.newT
fda0: 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65  num field.  (The
fdb0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
fdc0: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  * should have be
fdd0: 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20  en put there by 
fde0: 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62  the sqliteOpenCb
fdf0: 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2a 0a   routine.).  **.
fe00: 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74    ** If the root
fe10: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
fe20: 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  1, that means th
fe30: 69 73 20 69 73 20 74 68 65 20 73 71 6c 69 74 65  is is the sqlite
fe40: 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62  _master.  ** tab
fe50: 6c 65 20 69 74 73 65 6c 66 2e 20 20 53 6f 20 6d  le itself.  So m
fe60: 61 72 6b 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79  ark it read-only
fe70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
fe80: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
fe90: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
fea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
feb0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
fec0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
fed0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74  ;.    }.    p->t
fee0: 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
fef0: 65 77 54 6e 75 6d 3b 0a 20 20 20 20 69 66 28 20  ewTnum;.    if( 
ff00: 70 2d 3e 74 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e  p->tnum==1 ) p->
ff10: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 52  tabFlags |= TF_R
ff20: 65 61 64 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20  eadonly;.  }..  
ff30: 2f 2a 20 53 70 65 63 69 61 6c 20 70 72 6f 63 65  /* Special proce
ff40: 73 73 69 6e 67 20 66 6f 72 20 57 49 54 48 4f 55  ssing for WITHOU
ff50: 54 20 52 4f 57 49 44 20 54 61 62 6c 65 73 20 2a  T ROWID Tables *
ff60: 2f 0a 20 20 69 66 28 20 74 61 62 4f 70 74 73 20  /.  if( tabOpts 
ff70: 26 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69  & TF_WithoutRowi
ff80: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  d ){.    if( (p-
ff90: 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
ffa0: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b  utoincrement) ){
ffb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
ffc0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
ffd0: 20 20 20 20 20 20 20 20 20 22 41 55 54 4f 49 4e           "AUTOIN
ffe0: 43 52 45 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f  CREMENT not allo
fff0: 77 65 64 20 6f 6e 20 57 49 54 48 4f 55 54 20 52  wed on WITHOUT R
10000 4f 57 49 44 20 74 61 62 6c 65 73 22 29 3b 0a 20  OWID tables");. 
10010 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
10020 20 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74   }.    if( (p->t
10030 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73  abFlags & TF_Has
10040 50 72 69 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29  PrimaryKey)==0 )
10050 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
10060 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10070 22 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 69 73  "PRIMARY KEY mis
10080 73 69 6e 67 20 6f 6e 20 74 61 62 6c 65 20 25 73  sing on table %s
10090 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  ", p->zName);.  
100a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
100b0 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
100c0 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 7c 20  _WithoutRowid | 
100d0 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69  TF_NoVisibleRowi
100e0 64 3b 0a 20 20 20 20 20 20 63 6f 6e 76 65 72 74  d;.      convert
100f0 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61  ToWithoutRowidTa
10100 62 6c 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ble(pParse, p);.
10110 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62      }.  }..  iDb
10120 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
10130 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
10140 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65  Schema);..#ifnde
10150 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
10160 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  ECK.  /* Resolve
10170 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48   names in all CH
10180 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65  ECK constraint e
10190 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
101a0 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b  .  if( p->pCheck
101b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
101c0 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65  esolveSelfRefere
101d0 6e 63 65 28 70 50 61 72 73 65 2c 20 70 2c 20 4e  nce(pParse, p, N
101e0 43 5f 49 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d  C_IsCheck, 0, p-
101f0 3e 70 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65  >pCheck);.  }.#e
10200 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
10210 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45  (SQLITE_OMIT_CHE
10220 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74  CK) */..  /* Est
10230 69 6d 61 74 65 20 74 68 65 20 61 76 65 72 61 67  imate the averag
10240 65 20 72 6f 77 20 73 69 7a 65 20 66 6f 72 20 74  e row size for t
10250 68 65 20 74 61 62 6c 65 20 61 6e 64 20 66 6f 72  he table and for
10260 20 61 6c 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64   all implied ind
10270 69 63 65 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61  ices */.  estima
10280 74 65 54 61 62 6c 65 57 69 64 74 68 28 70 29 3b  teTableWidth(p);
10290 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70  .  for(pIdx=p->p
102a0 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
102b0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
102c0 20 20 20 20 65 73 74 69 6d 61 74 65 49 6e 64 65      estimateInde
102d0 78 57 69 64 74 68 28 70 49 64 78 29 3b 0a 20 20  xWidth(pIdx);.  
102e0 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69  }..  /* If not i
102f0 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65  nitializing, the
10300 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72  n create a recor
10310 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  d for the new ta
10320 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ble.  ** in the 
10330 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
10340 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ble of the datab
10350 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ase..  **.  ** I
10360 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
10370 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69  ORARY table, wri
10380 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74  te the entry int
10390 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a  o the auxiliary.
103a0 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61    ** file instea
103b0 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61  d of into the ma
103c0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
103d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
103e0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
103f0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64     int n;.    Vd
10400 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
10410 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76  *zType;    /* "v
10420 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20  iew" or "table" 
10430 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  */.    char *zTy
10440 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22  pe2;   /* "VIEW"
10450 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20   or "TABLE" */. 
10460 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20     char *zStmt; 
10470 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68     /* Text of th
10480 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f  e CREATE TABLE o
10490 72 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  r CREATE VIEW st
104a0 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20  atement */..    
104b0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
104c0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
104d0 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
104e0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73  ) return;..    s
104f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
10500 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29  (v, OP_Close, 0)
10510 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a  ;..    /* .    *
10520 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79  * Initialize zTy
10530 70 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76  pe for the new v
10540 69 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20  iew or table..  
10550 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
10560 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
10570 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72      /* A regular
10580 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
10590 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b  zType = "table";
105a0 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20  .      zType2 = 
105b0 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66  "TABLE";.#ifndef
105c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
105d0 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  W.    }else{.   
105e0 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a     /* A view */.
105f0 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76        zType = "v
10600 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70  iew";.      zTyp
10610 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e  e2 = "VIEW";.#en
10620 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
10630 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43  * If this is a C
10640 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41  REATE TABLE xx A
10650 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78  S SELECT ..., ex
10660 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54  ecute the SELECT
10670 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
10680 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  t to populate th
10690 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65  e new table. The
106a0 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
106b0 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  r for the.    **
106c0 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e   new table is in
106d0 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65   register pParse
106e0 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a  ->regRoot..    *
106f0 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68  *.    ** Once th
10700 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65  e SELECT has bee
10710 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74  n coded by sqlit
10720 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69  e3Select(), it i
10730 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75  s in a.    ** su
10740 69 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20  itable state to 
10750 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f  query for the co
10760 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74  lumn names and t
10770 79 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a  ypes to be used.
10780 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65      ** by the ne
10790 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a  w table..    **.
107a0 20 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d      ** A shared-
107b0 63 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  cache write-lock
107c0 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
107d0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
107e0 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20   new table,.    
107f0 2a 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c  ** as a schema-l
10800 6f 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c  ock must have al
10810 72 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69  ready been obtai
10820 6e 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 74  ned to create it
10830 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61  . Since.    ** a
10840 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63   schema-lock exc
10850 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20  ludes all other 
10860 64 61 74 61 62 61 73 65 20 75 73 65 72 73 2c 20  database users, 
10870 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  the write-lock w
10880 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72  ould.    ** be r
10890 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f  edundant..    */
108a0 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
108b0 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74   ){.      Select
108c0 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 2f 2a  Dest dest;    /*
108d0 20 57 68 65 72 65 20 74 68 65 20 53 45 4c 45 43   Where the SELEC
108e0 54 20 73 68 6f 75 6c 64 20 73 74 6f 72 65 20 72  T should store r
108f0 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20  esults */.      
10900 69 6e 74 20 72 65 67 59 69 65 6c 64 3b 20 20 20  int regYield;   
10910 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
10920 68 6f 6c 64 69 6e 67 20 63 6f 2d 72 6f 75 74 69  holding co-routi
10930 6e 65 20 65 6e 74 72 79 2d 70 6f 69 6e 74 20 2a  ne entry-point *
10940 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
10950 54 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  Top;        /* T
10960 6f 70 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75  op of the co-rou
10970 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tine */.      in
10980 74 20 72 65 67 52 65 63 3b 20 20 20 20 20 20 20  t regRec;       
10990 20 20 2f 2a 20 41 20 72 65 63 6f 72 64 20 74 6f    /* A record to
109a0 20 62 65 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   be insert into 
109b0 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f  the new table */
109c0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 6f  .      int regRo
109d0 77 69 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f  wid;       /* Ro
109e0 77 69 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20  wid of the next 
109f0 72 6f 77 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f  row to insert */
10a00 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49  .      int addrI
10a10 6e 73 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 6f  nsLoop;    /* To
10a20 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  p of the loop fo
10a30 72 20 69 6e 73 65 72 74 69 6e 67 20 72 6f 77 73  r inserting rows
10a40 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
10a50 2a 70 53 65 6c 54 61 62 3b 20 20 20 20 20 2f 2a  *pSelTab;     /*
10a60 20 41 20 74 61 62 6c 65 20 74 68 61 74 20 64 65   A table that de
10a70 73 63 72 69 62 65 73 20 74 68 65 20 53 45 4c 45  scribes the SELE
10a80 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20  CT results */.. 
10a90 20 20 20 20 20 72 65 67 59 69 65 6c 64 20 3d 20       regYield = 
10aa0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
10ab0 20 20 20 20 20 20 72 65 67 52 65 63 20 3d 20 2b        regRec = +
10ac0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
10ad0 20 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20       regRowid = 
10ae0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
10af0 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
10b00 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20  rse->nTab==1);. 
10b10 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41       sqlite3MayA
10b20 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
10b30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10b40 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
10b50 57 72 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65  Write, 1, pParse
10b60 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b  ->regRoot, iDb);
10b70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10b80 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
10b90 46 4c 41 47 5f 50 32 49 53 52 45 47 29 3b 0a 20  FLAG_P2ISREG);. 
10ba0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
10bb0 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 61 64 64  b = 2;.      add
10bc0 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
10bd0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
10be0 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   + 1;.      sqli
10bf0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10c00 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
10c10 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20  e, regYield, 0, 
10c20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20  addrTop);.      
10c30 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
10c40 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
10c50 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
10c60 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
10c70 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
10c80 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ect);.      if( 
10c90 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74  pSelTab==0 ) ret
10ca0 75 72 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  urn;.      asser
10cb0 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  t( p->aCol==0 );
10cc0 0a 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d  .      p->nCol =
10cd0 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
10ce0 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20        p->aCol = 
10cf0 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
10d00 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
10d10 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  ol = 0;.      pS
10d20 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
10d30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
10d40 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53  leteTable(db, pS
10d50 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 73 71  elTab);.      sq
10d60 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
10d70 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43  nit(&dest, SRT_C
10d80 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
10d90 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ld);.      sqlit
10da0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
10db0 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29   pSelect, &dest)
10dc0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
10dd0 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
10de0 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  n;.      sqlite3
10df0 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65  VdbeEndCoroutine
10e00 28 76 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20  (v, regYield);. 
10e10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10e20 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
10e30 54 6f 70 20 2d 20 31 29 3b 0a 20 20 20 20 20 20  Top - 1);.      
10e40 61 64 64 72 49 6e 73 4c 6f 6f 70 20 3d 20 73 71  addrInsLoop = sq
10e50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
10e60 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 64 65 73  v, OP_Yield, des
10e70 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  t.iSDParm);.    
10e80 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
10e90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10ea0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
10eb0 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 64 65 73  _MakeRecord, des
10ec0 74 2e 69 53 64 73 74 2c 20 64 65 73 74 2e 6e 53  t.iSdst, dest.nS
10ed0 64 73 74 2c 20 72 65 67 52 65 63 29 3b 0a 20 20  dst, regRec);.  
10ee0 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
10ef0 41 66 66 69 6e 69 74 79 28 76 2c 20 70 2c 20 30  Affinity(v, p, 0
10f00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10f10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10f20 5f 4e 65 77 52 6f 77 69 64 2c 20 31 2c 20 72 65  _NewRowid, 1, re
10f30 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
10f40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10f50 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 31  (v, OP_Insert, 1
10f60 2c 20 72 65 67 52 65 63 2c 20 72 65 67 52 6f 77  , regRec, regRow
10f70 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
10f80 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
10f90 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20  drInsLoop);.    
10fa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
10fb0 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 73  pHere(v, addrIns
10fc0 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Loop);.      sql
10fd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10fe0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a  , OP_Close, 1);.
10ff0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
11000 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65  mpute the comple
11010 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
11020 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
11030 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  */.    if( pSele
11040 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d  ct ){.      zStm
11050 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53  t = createTableS
11060 74 6d 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  tmt(db, p);.    
11070 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 6f 6b  }else{.      Tok
11080 65 6e 20 2a 70 45 6e 64 32 20 3d 20 74 61 62 4f  en *pEnd2 = tabO
11090 70 74 73 20 3f 20 26 70 50 61 72 73 65 2d 3e 73  pts ? &pParse->s
110a0 4c 61 73 74 54 6f 6b 65 6e 20 3a 20 70 45 6e 64  LastToken : pEnd
110b0 3b 0a 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74  ;.      n = (int
110c0 29 28 70 45 6e 64 32 2d 3e 7a 20 2d 20 70 50 61  )(pEnd2->z - pPa
110d0 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
110e0 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  z);.      if( pE
110f0 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29  nd2->z[0]!=';' )
11100 20 6e 20 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a   n += pEnd2->n;.
11110 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71        zStmt = sq
11120 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
11130 20 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45   .          "CRE
11140 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54  ATE %s %.*s", zT
11150 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d  ype2, n, pParse-
11160 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20  >sNameToken.z.  
11170 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
11180 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20    /* A slot for 
11190 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 20 61  the record has a
111a0 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
111b0 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20  cated in the .  
111c0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54    ** SQLITE_MAST
111d0 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75  ER table.  We ju
111e0 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74  st need to updat
111f0 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68  e that slot with
11200 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20   all.    ** the 
11210 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76  information we'v
11220 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20  e collected..   
11230 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
11240 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
11250 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45  e,.      "UPDATE
11260 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20   %Q.%s ".       
11270 20 20 22 53 45 54 20 74 79 70 65 3d 27 25 73 27    "SET type='%s'
11280 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e  , name=%Q, tbl_n
11290 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65  ame=%Q, rootpage
112a0 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20  =#%d, sql=%Q ". 
112b0 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 77        "WHERE row
112c0 69 64 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64  id=#%d",.      d
112d0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
112e0 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
112f0 45 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a  E,.      zType,.
11300 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
11310 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
11320 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65        pParse->re
11330 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74  gRoot,.      zSt
11340 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65  mt,.      pParse
11350 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29  ->regRowid.    )
11360 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
11370 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a  ree(db, zStmt);.
11380 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
11390 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
113a0 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
113b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
113c0 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20  NCREMENT.    /* 
113d0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
113e0 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  we need to creat
113f0 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75  e an sqlite_sequ
11400 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20  ence table for. 
11410 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72     ** keeping tr
11420 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65  ack of autoincre
11430 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a  ment keys..    *
11440 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61  /.    if( (p->ta
11450 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
11460 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 20 29 7b  increment)!=0 ){
11470 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d  .      Db *pDb =
11480 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
11490 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
114a0 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
114b0 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
114c0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44   );.      if( pD
114d0 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  b->pSchema->pSeq
114e0 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
114f0 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
11500 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
11510 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
11520 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73  ABLE %Q.sqlite_s
11530 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71  equence(name,seq
11540 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44  )",.          pD
11550 62 2d 3e 7a 44 62 53 4e 61 6d 65 0a 20 20 20 20  b->zDbSName.    
11560 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
11570 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
11580 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72   /* Reparse ever
11590 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65  ything to update
115a0 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61   our internal da
115b0 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f  ta structures */
115c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
115d0 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70  AddParseSchemaOp
115e0 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  (v, iDb,.       
115f0 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
11600 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65  tf(db, "tbl_name
11610 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 21 3d  ='%q' AND type!=
11620 27 74 72 69 67 67 65 72 27 22 2c 20 70 2d 3e 7a  'trigger'", p->z
11630 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20  Name));.  }...  
11640 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65  /* Add the table
11650 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   to the in-memor
11660 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
11670 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
11680 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
11690 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
116a0 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20    Table *pOld;. 
116b0 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
116c0 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b  ma = p->pSchema;
116d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
116e0 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
116f0 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
11700 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71  );.    pOld = sq
11710 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
11720 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  &pSchema->tblHas
11730 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b  h, p->zName, p);
11740 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b  .    if( pOld ){
11750 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11760 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61  ==pOld );  /* Ma
11770 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
11780 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73  ailed inside Has
11790 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20  hInsert() */.   
117a0 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
117b0 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65  lt(db);.      re
117c0 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
117d0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
117e0 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6d  e = 0;.    db->m
117f0 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41  DbFlags |= DBFLA
11800 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  G_SchemaChange;.
11810 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11820 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a  OMIT_ALTERTABLE.
11830 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c      if( !p->pSel
11840 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ect ){.      con
11850 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
11860 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
11870 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
11880 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  n.z;.      int n
11890 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Name;.      asse
118a0 72 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20  rt( !pSelect && 
118b0 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b  pCons && pEnd );
118c0 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73  .      if( pCons
118d0 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->z==0 ){.      
118e0 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a    pCons = pEnd;.
118f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e        }.      nN
11900 61 6d 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e  ame = (int)((con
11910 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d  st char *)pCons-
11920 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >z - zName);.   
11930 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73     p->addColOffs
11940 65 74 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65  et = 13 + sqlite
11950 33 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61  3Utf8CharLen(zNa
11960 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
11970 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
11980 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11990 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54  MIT_VIEW./*.** T
119a0 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
119b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20  this routine in 
119c0 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20  order to create 
119d0 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f  a new VIEW.*/.vo
119e0 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
119f0 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70  View(.  Parse *p
11a00 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68  Parse,     /* Th
11a10 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
11a20 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42  t */.  Token *pB
11a30 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65  egin,     /* The
11a40 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
11a50 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74  at begins the st
11a60 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
11a70 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
11a80 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
11a90 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
11aa0 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
11ab0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
11ac0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
11ad0 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
11ae0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
11af0 77 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  w */.  ExprList 
11b00 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a 20 4f 70 74  *pCNames, /* Opt
11b10 69 6f 6e 61 6c 20 6c 69 73 74 20 6f 66 20 76 69  ional list of vi
11b20 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ew column names 
11b30 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
11b40 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c  lect,   /* A SEL
11b50 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
11b60 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
11b70 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20  he new view */. 
11b80 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20   int isTemp,    
11b90 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20      /* TRUE for 
11ba0 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77  a TEMPORARY view
11bb0 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20   */.  int noErr 
11bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70           /* Supp
11bd0 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61  ress error messa
11be0 67 65 73 20 69 66 20 56 49 45 57 20 61 6c 72 65  ges if VIEW alre
11bf0 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
11c00 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
11c10 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt n;.  const ch
11c20 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73  ar *z;.  Token s
11c30 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73  End;.  DbFixer s
11c40 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  Fix;.  Token *pN
11c50 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ame = 0;.  int i
11c60 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Db;.  sqlite3 *d
11c70 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
11c80 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
11c90 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  Var>0 ){.    sql
11ca0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11cb0 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73  rse, "parameters
11cc0 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
11cd0 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20   in views");.   
11ce0 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65   goto create_vie
11cf0 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20 20 73 71  w_fail;.  }.  sq
11d00 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
11d10 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
11d20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20  pName2, isTemp, 
11d30 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20  1, 0, noErr);.  
11d40 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
11d50 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
11d60 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
11d70 72 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f  r ) goto create_
11d80 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 73 71 6c  view_fail;.  sql
11d90 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
11da0 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
11db0 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
11dc0 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
11dd0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
11de0 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  , p->pSchema);. 
11df0 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
11e00 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
11e10 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d  Db, "view", pNam
11e20 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  e);.  if( sqlite
11e30 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78  3FixSelect(&sFix
11e40 2c 20 70 53 65 6c 65 63 74 29 20 29 20 67 6f 74  , pSelect) ) got
11e50 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61  o create_view_fa
11e60 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61  il;..  /* Make a
11e70 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74   copy of the ent
11e80 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ire SELECT state
11e90 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
11ea0 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a  s the view..  **
11eb0 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65   This will force
11ec0 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f   all the Expr.to
11ed0 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20  ken.z values to 
11ee0 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  be dynamically. 
11ef0 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61   ** allocated ra
11f00 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20  ther than point 
11f10 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  to the input str
11f20 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e  ing - which mean
11f30 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79  s that.  ** they
11f40 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66   will persist af
11f50 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ter the current 
11f60 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63  sqlite3_exec() c
11f70 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a  all returns..  *
11f80 2f 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d  /.  if( IN_RENAM
11f90 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
11fa0 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 65  p->pSelect = pSe
11fb0 6c 65 63 74 3b 0a 20 20 20 20 70 53 65 6c 65 63  lect;.    pSelec
11fc0 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
11fd0 20 20 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d      p->pSelect =
11fe0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
11ff0 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45  p(db, pSelect, E
12000 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
12010 20 20 7d 0a 20 20 70 2d 3e 70 43 68 65 63 6b 20    }.  p->pCheck 
12020 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
12030 74 44 75 70 28 64 62 2c 20 70 43 4e 61 6d 65 73  tDup(db, pCNames
12040 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
12050 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
12060 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
12070 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69   create_view_fai
12080 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20  l;..  /* Locate 
12090 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
120a0 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
120b0 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64  ment.  Make sEnd
120c0 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74   point to.  ** t
120d0 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73  he end..  */.  s
120e0 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c  End = pParse->sL
120f0 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65  astToken;.  asse
12100 72 74 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30  rt( sEnd.z[0]!=0
12110 20 7c 7c 20 73 45 6e 64 2e 6e 3d 3d 30 20 29 3b   || sEnd.n==0 );
12120 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d  .  if( sEnd.z[0]
12130 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e  !=';' ){.    sEn
12140 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20  d.z += sEnd.n;. 
12150 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b   }.  sEnd.n = 0;
12160 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e  .  n = (int)(sEn
12170 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29  d.z - pBegin->z)
12180 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20  ;.  assert( n>0 
12190 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d  );.  z = pBegin-
121a0 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c  >z;.  while( sql
121b0 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d  ite3Isspace(z[n-
121c0 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  1]) ){ n--; }.  
121d0 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d  sEnd.z = &z[n-1]
121e0 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a  ;.  sEnd.n = 1;.
121f0 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65  .  /* Use sqlite
12200 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61  3EndTable() to a
12210 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74  dd the view to t
12220 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
12230 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
12240 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72  te3EndTable(pPar
12250 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 2c  se, 0, &sEnd, 0,
12260 20 30 29 3b 0a 0a 63 72 65 61 74 65 5f 76 69 65   0);..create_vie
12270 77 5f 66 61 69 6c 3a 0a 20 20 73 71 6c 69 74 65  w_fail:.  sqlite
12280 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
12290 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66  , pSelect);.  if
122a0 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
122b0 43 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  CT ){.    sqlite
122c0 33 52 65 6e 61 6d 65 45 78 70 72 6c 69 73 74 55  3RenameExprlistU
122d0 6e 6d 61 70 28 70 50 61 72 73 65 2c 20 70 43 4e  nmap(pParse, pCN
122e0 61 6d 65 73 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ames);.  }.  sql
122f0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
12300 74 65 28 64 62 2c 20 70 43 4e 61 6d 65 73 29 3b  te(db, pCNames);
12310 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e  .  return;.}.#en
12320 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
12330 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20  IT_VIEW */..#if 
12340 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
12350 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
12360 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
12370 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
12380 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  ./*.** The Table
12390 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c   structure pTabl
123a0 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49  e is really a VI
123b0 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  EW.  Fill in the
123c0 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
123d0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
123e0 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62  view in the pTab
123f0 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  le structure.  R
12400 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
12410 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  .** of errors.  
12420 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73  If an error is s
12430 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72  een leave an err
12440 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
12450 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
12460 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65  /.int sqlite3Vie
12470 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
12480 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
12490 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
124a0 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
124b0 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62     /* A fake tab
124c0 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65  le from which we
124d0 20 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   get the result 
124e0 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  set */.  Select 
124f0 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f  *pSel;     /* Co
12500 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
12510 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
12520 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69   the view */.  i
12530 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20  nt nErr = 0;    
12540 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
12550 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
12560 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
12570 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
12580 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65  rarily holds the
12590 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   number of curso
125a0 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20  rs assigned */. 
125b0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
125c0 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
125d0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
125e0 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72  on for malloc er
125f0 72 6f 72 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  rors */.#ifndef 
12600 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
12610 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e 74 20 72  UALTABLE.  int r
12620 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  c;.#endif.#ifnde
12630 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12640 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 73 71  THORIZATION.  sq
12650 6c 69 74 65 33 5f 78 61 75 74 68 20 78 41 75 74  lite3_xauth xAut
12660 68 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65  h;       /* Save
12670 64 20 78 41 75 74 68 20 70 6f 69 6e 74 65 72 20  d xAuth pointer 
12680 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
12690 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a  ert( pTable );..
126a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
126b0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
126c0 0a 20 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f  .  db->nSchemaLo
126d0 63 6b 2b 2b 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ck++;.  rc = sql
126e0 69 74 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e  ite3VtabCallConn
126f0 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ect(pParse, pTab
12700 6c 65 29 3b 0a 20 20 64 62 2d 3e 6e 53 63 68 65  le);.  db->nSche
12710 6d 61 4c 6f 63 6b 2d 2d 3b 0a 20 20 69 66 28 20  maLock--;.  if( 
12720 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
12730 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73   1;.  }.  if( Is
12740 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20  Virtual(pTable) 
12750 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
12760 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
12770 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
12780 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f  * A positive nCo
12790 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75  l means the colu
127a0 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68  mns names for th
127b0 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a  is view are.  **
127c0 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a   already known..
127d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
127e0 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75  e->nCol>0 ) retu
127f0 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65  rn 0;..  /* A ne
12800 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61  gative nCol is a
12810 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20   special marker 
12820 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20  meaning that we 
12830 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  are currently.  
12840 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d  ** trying to com
12850 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pute the column 
12860 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e  names.  If we en
12870 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
12880 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67   with.  ** a neg
12890 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d  ative nCol, it m
128a0 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65  eans two or more
128b0 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f   views form a lo
128c0 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  op, like this:. 
128d0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45   **.  **     CRE
128e0 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20  ATE VIEW one AS 
128f0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77  SELECT * FROM tw
12900 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  o;.  **     CREA
12910 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53  TE VIEW two AS S
12920 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65  ELECT * FROM one
12930 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75  ;.  **.  ** Actu
12940 61 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20  ally, the error 
12950 61 62 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75  above is now cau
12960 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61  ght prior to rea
12970 63 68 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74  ching this point
12980 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66  ..  ** But the f
12990 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73  ollowing test is
129a0 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74   still important
129b0 20 61 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65   as it does come
129c0 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20   up.  ** in the 
129d0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20  following:.  ** 
129e0 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
129f0 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28   TABLE main.ex1(
12a00 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  a);.  **     CRE
12a10 41 54 45 20 54 45 4d 50 20 56 49 45 57 20 65 78  ATE TEMP VIEW ex
12a20 31 20 41 53 20 53 45 4c 45 43 54 20 61 20 46 52  1 AS SELECT a FR
12a30 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20  OM ex1;.  **    
12a40 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
12a50 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20  emp.ex1;.  */.  
12a60 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
12a70 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
12a80 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
12a90 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69  , "view %s is ci
12aa0 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64  rcularly defined
12ab0 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
12ac0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
12ad0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
12ae0 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29  Table->nCol>=0 )
12af0 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  ;..  /* If we ge
12b00 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
12b10 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20  eans we need to 
12b20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c  compute the tabl
12b30 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f  e names..  ** No
12b40 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  te that the call
12b50 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c   to sqlite3Resul
12b60 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
12b70 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
12b80 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
12b90 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20   in the results 
12ba0 73 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20  set of the view 
12bb0 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20  and will assign 
12bc0 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20  cursors.  ** to 
12bd0 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  the elements of 
12be0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
12bf0 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20    But we do not 
12c00 77 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67  want these chang
12c10 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65  es.  ** to be pe
12c20 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65  rmanent.  So the
12c30 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
12c40 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f  done on a copy o
12c50 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a  f the SELECT.  *
12c60 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  * statement that
12c70 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
12c80 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  w..  */.  assert
12c90 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  ( pTable->pSelec
12ca0 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71  t );.  pSel = sq
12cb0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
12cc0 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  b, pTable->pSele
12cd0 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53  ct, 0);.  if( pS
12ce0 65 6c 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  el ){.#ifndef SQ
12cf0 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54  LITE_OMIT_ALTERT
12d00 41 42 4c 45 0a 20 20 20 20 75 38 20 65 50 61 72  ABLE.    u8 ePar
12d10 73 65 4d 6f 64 65 20 3d 20 70 50 61 72 73 65 2d  seMode = pParse-
12d20 3e 65 50 61 72 73 65 4d 6f 64 65 3b 0a 20 20 20  >eParseMode;.   
12d30 20 70 50 61 72 73 65 2d 3e 65 50 61 72 73 65 4d   pParse->eParseM
12d40 6f 64 65 20 3d 20 50 41 52 53 45 5f 4d 4f 44 45  ode = PARSE_MODE
12d50 5f 4e 4f 52 4d 41 4c 3b 0a 23 65 6e 64 69 66 0a  _NORMAL;.#endif.
12d60 20 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e      n = pParse->
12d70 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  nTab;.    sqlite
12d80 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
12d90 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53  rsors(pParse, pS
12da0 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70  el->pSrc);.    p
12db0 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31  Table->nCol = -1
12dc0 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
12dd0 69 64 65 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a  ide.bDisable++;.
12de0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12df0 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
12e00 4e 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64 62  N.    xAuth = db
12e10 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d  ->xAuth;.    db-
12e20 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20  >xAuth = 0;.    
12e30 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
12e40 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
12e50 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29  ct(pParse, pSel)
12e60 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20  ;.    db->xAuth 
12e70 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20  = xAuth;.#else. 
12e80 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
12e90 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
12ea0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
12eb0 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  el);.#endif.    
12ec0 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e  pParse->nTab = n
12ed0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  ;.    if( pTable
12ee0 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20  ->pCheck ){.    
12ef0 20 20 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57    /* CREATE VIEW
12f00 20 6e 61 6d 65 28 61 72 67 6c 69 73 74 29 20 41   name(arglist) A
12f10 53 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 54  S ....      ** T
12f20 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
12f30 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
12f40 61 62 6c 65 20 61 72 65 20 74 61 6b 65 6e 20 66  able are taken f
12f50 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 61 72 67  rom.      ** arg
12f60 6c 69 73 74 20 77 68 69 63 68 20 69 73 20 73 74  list which is st
12f70 6f 72 65 64 20 69 6e 20 70 54 61 62 6c 65 2d 3e  ored in pTable->
12f80 70 43 68 65 63 6b 2e 20 20 54 68 65 20 70 43 68  pCheck.  The pCh
12f90 65 63 6b 20 66 69 65 6c 64 0a 20 20 20 20 20 20  eck field.      
12fa0 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 68 6f 6c 64  ** normally hold
12fb0 73 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  s CHECK constrai
12fc0 6e 74 73 20 6f 6e 20 61 6e 20 6f 72 64 69 6e 61  nts on an ordina
12fd0 72 79 20 74 61 62 6c 65 2c 20 62 75 74 20 66 6f  ry table, but fo
12fe0 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 56 49 45  r.      ** a VIE
12ff0 57 20 69 74 20 68 6f 6c 64 73 20 74 68 65 20 6c  W it holds the l
13000 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61  ist of column na
13010 6d 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mes..      */.  
13020 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
13030 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
13040 50 61 72 73 65 2c 20 70 54 61 62 6c 65 2d 3e 70  Parse, pTable->p
13050 43 68 65 63 6b 2c 20 0a 20 20 20 20 20 20 20 20  Check, .        
13060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13070 20 20 20 20 20 20 20 20 20 26 70 54 61 62 6c 65           &pTable
13080 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 6c 65 2d  ->nCol, &pTable-
13090 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66  >aCol);.      if
130a0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
130b0 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26  ed==0 .       &&
130c0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
130d0 0a 20 20 20 20 20 20 20 26 26 20 70 54 61 62 6c  .       && pTabl
130e0 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 2d 3e 70  e->nCol==pSel->p
130f0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20  EList->nExpr.   
13100 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
13110 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f  lite3SelectAddCo
13120 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
13130 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
13140 62 6c 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ble, pSel);.    
13150 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
13160 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20  ( pSelTab ){.   
13170 20 20 20 2f 2a 20 43 52 45 41 54 45 20 56 49 45     /* CREATE VIE
13180 57 20 6e 61 6d 65 20 41 53 2e 2e 2e 20 20 77 69  W name AS...  wi
13190 74 68 6f 75 74 20 61 6e 20 61 72 67 75 6d 65 6e  thout an argumen
131a0 74 20 6c 69 73 74 2e 20 20 43 6f 6e 73 74 72 75  t list.  Constru
131b0 63 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ct.      ** the 
131c0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
131d0 6d 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  m the SELECT sta
131e0 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
131f0 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
13200 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
13210 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f  ert( pTable->aCo
13220 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54  l==0 );.      pT
13230 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65  able->nCol = pSe
13240 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
13250 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d    pTable->aCol =
13260 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a   pSelTab->aCol;.
13270 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e        pSelTab->n
13280 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Col = 0;.      p
13290 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30  SelTab->aCol = 0
132a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
132b0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
132c0 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 54  exHeld(db, 0, pT
132d0 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20 29  able->pSchema) )
132e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
132f0 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
13300 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b  = 0;.      nErr+
13310 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  +;.    }.    sql
13320 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
13330 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  db, pSelTab);.  
13340 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
13350 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b  elete(db, pSel);
13360 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
13370 64 65 2e 62 44 69 73 61 62 6c 65 2d 2d 3b 0a 23  de.bDisable--;.#
13380 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13390 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20  IT_ALTERTABLE.  
133a0 20 20 70 50 61 72 73 65 2d 3e 65 50 61 72 73 65    pParse->eParse
133b0 4d 6f 64 65 20 3d 20 65 50 61 72 73 65 4d 6f 64  Mode = eParseMod
133c0 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 20 65 6c  e;.#endif.  } el
133d0 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b  se {.    nErr++;
133e0 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 70  .  }.  pTable->p
133f0 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 46 6c  Schema->schemaFl
13400 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65  ags |= DB_Unrese
13410 74 56 69 65 77 73 3b 0a 20 20 69 66 28 20 64 62  tViews;.  if( db
13420 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13430 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  {.    sqlite3Del
13440 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64  eteColumnNames(d
13450 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20  b, pTable);.    
13460 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30  pTable->aCol = 0
13470 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43  ;.    pTable->nC
13480 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  ol = 0;.  }.#end
13490 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
134a0 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75  T_VIEW */.  retu
134b0 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e  rn nErr;  .}.#en
134c0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
134d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
134e0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
134f0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
13500 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e  LTABLE) */..#ifn
13510 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13520 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  VIEW./*.** Clear
13530 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
13540 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45  s from every VIE
13550 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64  W in database id
13560 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
13570 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
13580 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  tAll(sqlite3 *db
13590 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61  , int idx){.  Ha
135a0 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73  shElem *i;.  ass
135b0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
135c0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
135d0 69 64 78 2c 20 30 29 20 29 3b 0a 20 20 69 66 28  idx, 0) );.  if(
135e0 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28   !DbHasProperty(
135f0 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
13600 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75  setViews) ) retu
13610 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  rn;.  for(i=sqli
13620 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
13630 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d  >aDb[idx].pSchem
13640 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69  a->tblHash); i;i
13650 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
13660 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  i)){.    Table *
13670 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
13680 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
13690 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
136a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
136b0 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  DeleteColumnName
136c0 73 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  s(db, pTab);.   
136d0 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20     pTab->aCol = 
136e0 30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  0;.      pTab->n
136f0 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Col = 0;.    }. 
13700 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70   }.  DbClearProp
13710 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
13720 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a  _UnresetViews);.
13730 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
13740 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
13750 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20  All(A,B).#endif 
13760 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
13770 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  IEW */../*.** Th
13780 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
13790 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42  alled by the VDB
137a0 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  E to adjust the 
137b0 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a  internal schema.
137c0 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74  ** used by SQLit
137d0 65 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65  e when the btree
137e0 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74   layer moves a t
137f0 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20  able root page. 
13800 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65  The.** root-page
13810 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69   of a table or i
13820 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65  ndex in database
13830 20 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64   iDb has changed
13840 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74   from iFrom.** t
13850 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63  o iTo..**.** Tic
13860 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68 65 20  ket #1728:  The 
13870 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67  symbol table mig
13880 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  ht still contain
13890 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
138a0 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72  on tables and/or
138b0 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 61 72   indices that ar
138c0 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66  e the process of
138d0 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a   being deleted..
138e0 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e  ** If you are un
138f0 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68  lucky, one of th
13900 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69  ose deleted indi
13910 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69  ces or tables mi
13920 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20  ght.** have the 
13930 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75  same rootpage nu
13940 6d 62 65 72 20 61 73 20 74 68 65 20 72 65 61 6c  mber as the real
13950 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
13960 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67  that is.** being
13970 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63   moved.  So we c
13980 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63  annot stop searc
13990 68 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 66  hing after the f
139a0 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62  irst match .** b
139b0 65 63 61 75 73 65 20 74 68 65 20 66 69 72 73 74  ecause the first
139c0 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65 20   match might be 
139d0 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64  for one of the d
139e0 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a  eleted indices.*
139f0 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20  * or tables and 
13a00 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e  not the table/in
13a10 64 65 78 20 74 68 61 74 20 69 73 20 61 63 74 75  dex that is actu
13a20 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64  ally being moved
13a30 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e  ..** We must con
13a40 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e  tinue looping un
13a50 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61  til all tables a
13a60 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a  nd indices with.
13a70 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72  ** rootpage==iFr
13a80 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e  om have been con
13a90 76 65 72 74 65 64 20 74 6f 20 68 61 76 65 20 61  verted to have a
13aa0 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f   rootpage of iTo
13ab0 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
13ac0 62 65 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  be certain that 
13ad0 77 65 20 67 6f 74 20 74 68 65 20 72 69 67 68 74  we got the right
13ae0 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   one..*/.#ifndef
13af0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13b00 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c  OVACUUM.void sql
13b10 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65  ite3RootPageMove
13b20 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  d(sqlite3 *db, i
13b30 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 46 72 6f  nt iDb, int iFro
13b40 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48  m, int iTo){.  H
13b50 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
13b60 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20    Hash *pHash;. 
13b70 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73   Db *pDb;..  ass
13b80 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
13b90 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
13ba0 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 44 62  iDb, 0) );.  pDb
13bb0 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
13bc0 3b 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62  ;.  pHash = &pDb
13bd0 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
13be0 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  sh;.  for(pElem=
13bf0 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
13c00 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
13c10 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
13c20 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
13c30 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
13c40 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
13c50 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54  lem);.    if( pT
13c60 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  ab->tnum==iFrom 
13c70 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  ){.      pTab->t
13c80 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d  num = iTo;.    }
13c90 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26  .  }.  pHash = &
13ca0 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  pDb->pSchema->id
13cb0 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c  xHash;.  for(pEl
13cc0 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
13cd0 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
13ce0 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
13cf0 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
13d00 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
13d10 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
13d20 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
13d30 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pIdx->tnum==iFr
13d40 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  om ){.      pIdx
13d50 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
13d60 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
13d70 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f  ../*.** Write co
13d80 64 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20  de to erase the 
13d90 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
13da0 70 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d  page iTable from
13db0 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a   database iDb..*
13dc0 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64  * Also write cod
13dd0 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
13de0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
13df0 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  ble and internal
13e00 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20   schema.** if a 
13e10 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f  root-page of ano
13e20 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
13e30 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
13e40 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a  -layer whilst.**
13e50 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20   erasing iTable 
13e60 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e  (this can happen
13e70 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61   with an auto-va
13e80 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a  cuum database)..
13e90 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
13ea0 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
13eb0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
13ec0 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69  nt iTable, int i
13ed0 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
13ee0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
13ef0 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72  pParse);.  int r
13f00 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
13f10 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
13f20 20 69 66 28 20 69 54 61 62 6c 65 3c 32 20 29 20   if( iTable<2 ) 
13f30 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
13f40 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74  pParse, "corrupt
13f50 20 73 63 68 65 6d 61 22 29 3b 0a 20 20 73 71 6c   schema");.  sql
13f60 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
13f70 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54  , OP_Destroy, iT
13f80 61 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a  able, r1, iDb);.
13f90 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
13fa0 74 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64  t(pParse);.#ifnd
13fb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13fc0 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f  UTOVACUUM.  /* O
13fd0 50 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73  P_Destroy stores
13fe0 20 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72   an in integer r
13ff0 31 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67  1. If this integ
14000 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a  er.  ** is non-z
14010 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ero, then it is 
14020 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
14030 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20  mber of a table 
14040 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f  moved to.  ** lo
14050 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54  cation iTable. T
14060 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
14070 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73  e modifies the s
14080 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
14090 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65  le to.  ** refle
140a0 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20  ct this..  **.  
140b0 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e  ** The "#NNN" in
140c0 20 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70   the SQL is a sp
140d0 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74  ecial constant t
140e0 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76  hat means whatev
140f0 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73  er value.  ** is
14100 20 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e   in register NNN
14110 2e 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72  .  See grammar r
14120 75 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ules associated 
14130 77 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49  with the TK_REGI
14140 53 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20  STER.  ** token 
14150 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
14160 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f  nformation..  */
14170 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
14180 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
14190 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
141a0 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25  s SET rootpage=%
141b0 64 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20  d WHERE #%d AND 
141c0 72 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20  rootpage=#%d",. 
141d0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
141e0 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
141f0 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20  e, MASTER_NAME, 
14200 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b  iTable, r1, r1);
14210 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
14220 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
14230 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a  pParse, r1);.}..
14240 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45  /*.** Write VDBE
14250 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74   code to erase t
14260 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c  able pTab and al
14270 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64  l associated ind
14280 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a  ices on disk..**
14290 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20   Code to update 
142a0 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
142b0 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74  r tables and int
142c0 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66  ernal schema def
142d0 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63  initions.** in c
142e0 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20  ase a root-page 
142f0 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f  belonging to ano
14300 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
14310 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
14320 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73   layer.** is als
14330 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61  o added (this ca
14340 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e  n happen with an
14350 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
14360 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  abase)..*/.stati
14370 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61  c void destroyTa
14380 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
14390 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  e, Table *pTab){
143a0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
143b0 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74  abase may be aut
143c0 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65  o-vacuum capable
143d0 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54   (if SQLITE_OMIT
143e0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a  _AUTOVACUUM.  **
143f0 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29   is not defined)
14400 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70  , then it is imp
14410 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f  ortant to call O
14420 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65  P_Destroy on the
14430 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  .  ** table and 
14440 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73  index root-pages
14450 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74   in order, start
14460 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d  ing with the num
14470 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c  erically .  ** l
14480 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
14490 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75   number. This gu
144a0 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f  arantees that no
144b0 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70  ne of the root-p
144c0 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  ages.  ** to be 
144d0 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c  destroyed is rel
144e0 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72  ocated by an ear
144f0 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e  lier OP_Destroy.
14500 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a   i.e. if the.  *
14510 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65  * following were
14520 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a   coded:.  **.  *
14530 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30  * OP_Destroy 4 0
14540 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f  .  ** ....  ** O
14550 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20  P_Destroy 5 0.  
14560 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74  **.  ** and root
14570 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64   page 5 happened
14580 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65   to be the large
14590 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  st root-page num
145a0 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ber in the.  ** 
145b0 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72  database, then r
145c0 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64  oot page 5 would
145d0 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67   be moved to pag
145e0 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a  e 4 by the .  **
145f0 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30   "OP_Destroy 4 0
14600 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75  " opcode. The su
14610 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73  bsequent "OP_Des
14620 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20  troy 5 0" would 
14630 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d  hit.  ** a free-
14640 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  list page..  */.
14650 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61    int iTab = pTa
14660 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69  b->tnum;.  int i
14670 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a  Destroyed = 0;..
14680 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
14690 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
146a0 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20     int iLargest 
146b0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44  = 0;..    if( iD
146c0 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69  estroyed==0 || i
146d0 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29  Tab<iDestroyed )
146e0 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74  {.      iLargest
146f0 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20   = iTab;.    }. 
14700 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
14710 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
14720 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
14730 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64  ){.      int iId
14740 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a  x = pIdx->tnum;.
14750 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
14760 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  dx->pSchema==pTa
14770 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
14780 20 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f      if( (iDestro
14790 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c  yed==0 || (iIdx<
147a0 69 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20  iDestroyed)) && 
147b0 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b  iIdx>iLargest ){
147c0 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73  .        iLarges
147d0 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20  t = iIdx;.      
147e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
147f0 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20  iLargest==0 ){. 
14800 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
14810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
14820 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
14830 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
14840 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
14850 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 61  Schema);.      a
14860 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
14870 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d   iDb<pParse->db-
14880 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 64 65  >nDb );.      de
14890 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
148a0 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20  arse, iLargest, 
148b0 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73  iDb);.      iDes
148c0 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73  troyed = iLarges
148d0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  t;.    }.  }.}..
148e0 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74  /*.** Remove ent
148f0 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20 73 71  ries from the sq
14900 6c 69 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65  lite_statN table
14910 73 20 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32  s (for N in (1,2
14920 2c 33 29 29 0a 2a 2a 20 61 66 74 65 72 20 61 20  ,3)).** after a 
14930 44 52 4f 50 20 49 4e 44 45 58 20 6f 72 20 44 52  DROP INDEX or DR
14940 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64  OP TABLE command
14950 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14960 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61   sqlite3ClearSta
14970 74 54 61 62 6c 65 73 28 0a 20 20 50 61 72 73 65  tTables(.  Parse
14980 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
14990 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
149a0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
149b0 74 20 69 44 62 2c 20 20 20 20 20 20 20 20 20 20  t iDb,          
149c0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
149d0 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  base number */. 
149e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
149f0 70 65 2c 20 20 20 20 20 2f 2a 20 22 69 64 78 22  pe,     /* "idx"
14a00 20 6f 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63   or "tbl" */.  c
14a10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
14a20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
14a30 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
14a40 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
14a50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
14a60 4e 61 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e 64  Name = pParse->d
14a70 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
14a80 4e 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  Name;.  for(i=1;
14a90 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<=4; i++){.   
14aa0 20 63 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a   char zTab[24];.
14ab0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
14ac0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 62  intf(sizeof(zTab
14ad0 29 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f 73  ),zTab,"sqlite_s
14ae0 74 61 74 25 64 22 2c 69 29 3b 0a 20 20 20 20 69  tat%d",i);.    i
14af0 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  f( sqlite3FindTa
14b00 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
14b10 7a 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29  zTab, zDbName) )
14b20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  {.      sqlite3N
14b30 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
14b40 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  e,.        "DELE
14b50 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
14b60 45 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20  ERE %s=%Q",.    
14b70 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61      zDbName, zTa
14b80 62 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a  b, zType, zName.
14b90 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
14ba0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
14bb0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f  rate code to dro
14bc0 70 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  p a table..*/.vo
14bd0 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72  id sqlite3CodeDr
14be0 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
14bf0 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
14c00 61 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  ab, int iDb, int
14c10 20 69 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65   isView){.  Vdbe
14c20 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
14c30 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
14c40 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  .  Trigger *pTri
14c50 67 67 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20  gger;.  Db *pDb 
14c60 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
14c70 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
14c80 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
14c90 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
14ca0 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
14cb0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
14cc0 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
14cd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14ce0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
14cf0 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  E.  if( IsVirtua
14d00 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  l(pTab) ){.    s
14d10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
14d20 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a  (v, OP_VBegin);.
14d30 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
14d40 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65   Drop all trigge
14d50 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
14d60 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  th the table bei
14d70 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65  ng dropped. Code
14d80 0a 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74  .  ** is generat
14d90 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74  ed to remove ent
14da0 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65  ries from sqlite
14db0 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20  _master and/or. 
14dc0 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f   ** sqlite_temp_
14dd0 6d 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72  master if requir
14de0 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67  ed..  */.  pTrig
14df0 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69  ger = sqlite3Tri
14e00 67 67 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ggerList(pParse,
14e10 20 70 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28   pTab);.  while(
14e20 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
14e30 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65   assert( pTrigge
14e40 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  r->pSchema==pTab
14e50 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20  ->pSchema || .  
14e60 20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e        pTrigger->
14e70 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62  pSchema==db->aDb
14e80 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20  [1].pSchema );. 
14e90 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72     sqlite3DropTr
14ea0 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c  iggerPtr(pParse,
14eb0 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20   pTrigger);.    
14ec0 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67  pTrigger = pTrig
14ed0 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ger->pNext;.  }.
14ee0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14ef0 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
14f00 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61  NT.  /* Remove a
14f10 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68  ny entries of th
14f20 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
14f30 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74  e table associat
14f40 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65  ed with.  ** the
14f50 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
14f60 70 70 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f  pped. This is do
14f70 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 61  ne before the ta
14f80 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20  ble is dropped. 
14f90 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65   ** at the btree
14fa0 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20   level, in case 
14fb0 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
14fc0 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20  nce table needs 
14fd0 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20  to.  ** move as 
14fe0 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
14ff0 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e  drop (can happen
15000 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
15010 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  mode)..  */.  if
15020 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73  ( pTab->tabFlags
15030 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
15040 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ent ){.    sqlit
15050 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
15060 61 72 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c  arse,.      "DEL
15070 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69  ETE FROM %Q.sqli
15080 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52  te_sequence WHER
15090 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20  E name=%Q",.    
150a0 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c    pDb->zDbSName,
150b0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20   pTab->zName.   
150c0 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
150d0 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51    /* Drop all SQ
150e0 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
150f0 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72  e and index entr
15100 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74  ies that refer t
15110 6f 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65  o the.  ** table
15120 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61  . The program na
15130 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  me loops through
15140 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
15150 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20  e and deletes.  
15160 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61  ** every row tha
15170 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
15180 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ble of the same 
15190 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20  name as the one 
151a0 62 65 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70  being.  ** dropp
151b0 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65  ed. Triggers are
151c0 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74   handled separat
151d0 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72  ely because a tr
151e0 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a  igger can be.  *
151f0 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  * created in the
15200 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74   temp database t
15210 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
15220 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  table in another
15230 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a  .  ** database..
15240 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65    */.  sqlite3Ne
15250 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
15260 2c 20 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45  , .      "DELETE
15270 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
15280 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e  E tbl_name=%Q an
15290 64 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72  d type!='trigger
152a0 27 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  '",.      pDb->z
152b0 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f  DbSName, MASTER_
152c0 4e 41 4d 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  NAME, pTab->zNam
152d0 65 29 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65  e);.  if( !isVie
152e0 77 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  w && !IsVirtual(
152f0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73  pTab) ){.    des
15300 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65  troyTable(pParse
15310 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20  , pTab);.  }..  
15320 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61  /* Remove the ta
15330 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53  ble entry from S
15340 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c  QLite's internal
15350 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69   schema and modi
15360 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65  fy.  ** the sche
15370 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a  ma cookie..  */.
15380 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
15390 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
153a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
153b0 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69  , OP_VDestroy, i
153c0 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e  Db, 0, 0, pTab->
153d0 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20  zName, 0);.  }. 
153e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
153f0 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62  p4(v, OP_DropTab
15400 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70  le, iDb, 0, 0, p
15410 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
15420 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
15430 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
15440 62 29 3b 0a 20 20 73 71 6c 69 74 65 56 69 65 77  b);.  sqliteView
15450 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62  ResetAll(db, iDb
15460 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
15470 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
15480 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  ed to do the wor
15490 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c  k of a DROP TABL
154a0 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  E statement..** 
154b0 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  pName is the nam
154c0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
154d0 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f  o be dropped..*/
154e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
154f0 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
15500 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
15510 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77  Name, int isView
15520 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20  , int noErr){.  
15530 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56  Table *pTab;.  V
15540 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
15550 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
15560 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
15570 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
15580 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
15590 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
155a0 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  le;.  }.  assert
155b0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
155c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
155d0 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
155e0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65  .  if( sqlite3Re
155f0 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
15600 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f   ) goto exit_dro
15610 70 5f 74 61 62 6c 65 3b 0a 20 20 69 66 28 20 6e  p_table;.  if( n
15620 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72  oErr ) db->suppr
15630 65 73 73 45 72 72 2b 2b 3b 0a 20 20 61 73 73 65  essErr++;.  asse
15640 72 74 28 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c  rt( isView==0 ||
15650 20 69 73 56 69 65 77 3d 3d 4c 4f 43 41 54 45 5f   isView==LOCATE_
15660 56 49 45 57 20 29 3b 0a 20 20 70 54 61 62 20 3d  VIEW );.  pTab =
15670 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
15680 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
15690 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d 3e  isView, &pName->
156a0 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f 45  a[0]);.  if( noE
156b0 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73  rr ) db->suppres
156c0 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70  sErr--;..  if( p
156d0 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Tab==0 ){.    if
156e0 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74 65  ( noErr ) sqlite
156f0 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64  3CodeVerifyNamed
15700 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70  Schema(pParse, p
15710 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
15720 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  base);.    goto 
15730 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
15740 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
15750 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
15760 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
15770 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ema);.  assert( 
15780 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
15790 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49  ->nDb );..  /* I
157a0 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72 74  f pTab is a virt
157b0 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20  ual table, call 
157c0 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
157d0 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20  es() to ensure. 
157e0 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61   ** it is initia
157f0 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  lized..  */.  if
15800 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
15810 29 20 26 26 20 73 71 6c 69 74 65 33 56 69 65 77  ) && sqlite3View
15820 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
15830 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
15840 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
15850 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69  op_table;.  }.#i
15860 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15870 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
15880 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
15890 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
158a0 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
158b0 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
158c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
158d0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
158e0 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  DbSName;.    con
158f0 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d  st char *zArg2 =
15900 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
15910 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
15920 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
15930 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
15940 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  )){.      goto e
15950 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
15960 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
15970 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66  View ){.      if
15980 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
15990 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  & iDb==1 ){.    
159a0 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
159b0 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57  E_DROP_TEMP_VIEW
159c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
159d0 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
159e0 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a  LITE_DROP_VIEW;.
159f0 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
15a00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
15a10 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c  UALTABLE.    }el
15a20 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  se if( IsVirtual
15a30 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
15a40 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
15a50 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20  OP_VTABLE;.     
15a60 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33   zArg2 = sqlite3
15a70 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54  GetVTable(db, pT
15a80 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65  ab)->pMod->zName
15a90 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
15aa0 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  se{.      if( !O
15ab0 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
15ac0 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
15ad0 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
15ae0 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20  OP_TEMP_TABLE;. 
15af0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15b00 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
15b10 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20  E_DROP_TABLE;.  
15b20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15b30 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
15b40 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
15b50 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
15b60 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20  zArg2, zDb) ){. 
15b70 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
15b80 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
15b90 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
15ba0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
15bb0 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
15bc0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c   pTab->zName, 0,
15bd0 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
15be0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
15bf0 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ble;.    }.  }.#
15c00 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69  endif.  if( sqli
15c10 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62  te3StrNICmp(pTab
15c20 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  ->zName, "sqlite
15c30 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26  _", 7)==0 .    &
15c40 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  & sqlite3StrNICm
15c50 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  p(pTab->zName, "
15c60 73 71 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31  sqlite_stat", 11
15c70 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
15c80 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15c90 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
15ca0 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  y not be dropped
15cb0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
15cc0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
15cd0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a  rop_table;.  }..
15ce0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15cf0 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e  MIT_VIEW.  /* En
15d00 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20  sure DROP TABLE 
15d10 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61  is not used on a
15d20 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20   view, and DROP 
15d30 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64  VIEW is not used
15d40 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65  .  ** on a table
15d50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56  ..  */.  if( isV
15d60 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
15d70 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  lect==0 ){.    s
15d80 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15d90 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
15da0 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65   TABLE to delete
15db0 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62   table %s", pTab
15dc0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
15dd0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
15de0 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69  le;.  }.  if( !i
15df0 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
15e00 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
15e10 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15e20 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
15e30 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76  VIEW to delete v
15e40 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  iew %s", pTab->z
15e50 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
15e60 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
15e70 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
15e80 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
15e90 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61  to remove the ta
15ea0 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  ble from the mas
15eb0 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ter table.  ** o
15ec0 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76  n disk..  */.  v
15ed0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
15ee0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
15ef0 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
15f00 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
15f10 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
15f20 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21 69  iDb);.    if( !i
15f30 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 73  sView ){.      s
15f40 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54  qlite3ClearStatT
15f50 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44  ables(pParse, iD
15f60 62 2c 20 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e  b, "tbl", pTab->
15f70 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  zName);.      sq
15f80 6c 69 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65  lite3FkDropTable
15f90 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20  (pParse, pName, 
15fa0 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pTab);.    }.   
15fb0 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70   sqlite3CodeDrop
15fc0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
15fd0 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77 29  ab, iDb, isView)
15fe0 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70  ;.  }..exit_drop
15ff0 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65  _table:.  sqlite
16000 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
16010 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  b, pName);.}../*
16020 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16030 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72   is called to cr
16040 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69  eate a new forei
16050 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61  gn key on the ta
16060 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  ble.** currently
16070 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
16080 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64  ion.  pFromCol d
16090 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20  etermines which 
160a0 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
160b0 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
160c0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72  point to the for
160d0 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46  eign key.  If pF
160e0 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a  romCol==0 then.*
160f0 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65  * connect the ke
16100 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f  y to the last co
16110 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20  lumn inserted.  
16120 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20  pTo is the name 
16130 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  of.** the table 
16140 72 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e 6b  referred to (a.k
16150 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74 22 20  .a the "parent" 
16160 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c 20  table).  pToCol 
16170 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66 20  is a list.** of 
16180 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 61  tables in the pa
16190 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e 20  rent pTo table. 
161a0 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20   flags contains 
161b0 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  all.** informati
161c0 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  on about the con
161d0 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
161e0 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63   algorithms spec
161f0 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ified.** in the 
16200 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50  ON DELETE, ON UP
16210 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45  DATE and ON INSE
16220 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  RT clauses..**.*
16230 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74  * An FKey struct
16240 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61  ure is created a
16250 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
16260 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a  table currently.
16270 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ** under constru
16280 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61  ction in the pPa
16290 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66  rse->pNewTable f
162a0 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ield..**.** The 
162b0 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73  foreign key is s
162c0 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45  et for IMMEDIATE
162d0 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20   processing.  A 
162e0 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a  subsequent call.
162f0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66  ** to sqlite3Def
16300 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d  erForeignKey() m
16310 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73  ight change this
16320 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f   to DEFERRED..*/
16330 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
16340 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20  ateForeignKey(. 
16350 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
16360 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
16370 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
16380 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c  prList *pFromCol
16390 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e  ,  /* Columns in
163a0 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74   this table that
163b0 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20   point to other 
163c0 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  table */.  Token
163d0 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20   *pTo,          
163e0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
163f0 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
16400 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c  ExprList *pToCol
16410 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ,    /* Columns 
16420 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  in the other tab
16430 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
16440 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
16450 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  Conflict resolut
16460 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20  ion algorithms. 
16470 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
16480 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
16490 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
164a0 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
164b0 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20  Y.  FKey *pFKey 
164c0 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65  = 0;.  FKey *pNe
164d0 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70  xtTo;.  Table *p
164e0 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
164f0 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74  able;.  int nByt
16500 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
16510 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a  t nCol;.  char *
16520 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  z;..  assert( pT
16530 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  o!=0 );.  if( p=
16540 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45  =0 || IN_DECLARE
16550 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f  _VTAB ) goto fk_
16560 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  end;.  if( pFrom
16570 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Col==0 ){.    in
16580 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c  t iCol = p->nCol
16590 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  -1;.    if( NEVE
165a0 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f  R(iCol<0) ) goto
165b0 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28   fk_end;.    if(
165c0 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
165d0 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  l->nExpr!=1 ){. 
165e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
165f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f  rMsg(pParse, "fo
16600 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22  reign key on %s"
16610 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75  .         " shou
16620 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  ld reference onl
16630 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  y one column of 
16640 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20  table %T",.     
16650 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c      p->aCol[iCol
16660 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20  ].zName, pTo);. 
16670 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
16680 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c  ;.    }.    nCol
16690 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
166a0 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
166b0 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d  ol->nExpr!=pFrom
166c0 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  Col->nExpr ){.  
166d0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
166e0 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
166f0 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c    "number of col
16700 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20  umns in foreign 
16710 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
16720 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
16730 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75   ".        "colu
16740 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72  mns in the refer
16750 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20  enced table");. 
16760 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
16770 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
16780 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  l = pFromCol->nE
16790 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  xpr;.  }.  nByte
167a0 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79   = sizeof(*pFKey
167b0 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a  ) + (nCol-1)*siz
167c0 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  eof(pFKey->aCol[
167d0 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31  0]) + pTo->n + 1
167e0 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  ;.  if( pToCol )
167f0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
16800 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20  <pToCol->nExpr; 
16810 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  i++){.      nByt
16820 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
16830 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  en30(pToCol->a[i
16840 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ].zName) + 1;.  
16850 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20    }.  }.  pFKey 
16860 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
16870 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20  cZero(db, nByte 
16880 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d  );.  if( pFKey==
16890 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  0 ){.    goto fk
168a0 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65  _end;.  }.  pFKe
168b0 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20  y->pFrom = p;.  
168c0 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
168d0 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a   = p->pFKey;.  z
168e0 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79   = (char*)&pFKey
168f0 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20  ->aCol[nCol];.  
16900 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a  pFKey->zTo = z;.
16910 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
16920 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71  OBJECT ){.    sq
16930 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
16940 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69  Map(pParse, (voi
16950 64 2a 29 7a 2c 20 70 54 6f 29 3b 0a 20 20 7d 0a  d*)z, pTo);.  }.
16960 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d    memcpy(z, pTo-
16970 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a  >z, pTo->n);.  z
16980 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  [pTo->n] = 0;.  
16990 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
169a0 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e  );.  z += pTo->n
169b0 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f  +1;.  pFKey->nCo
169c0 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20  l = nCol;.  if( 
169d0 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
169e0 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30     pFKey->aCol[0
169f0 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f  ].iFrom = p->nCo
16a00 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l-1;.  }else{.  
16a10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
16a20 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
16a30 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
16a40 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20  j=0; j<p->nCol; 
16a50 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
16a60 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
16a70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  (p->aCol[j].zNam
16a80 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69  e, pFromCol->a[i
16a90 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
16aa0 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e           pFKey->
16ab0 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[i].iFrom = 
16ac0 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  j;.          bre
16ad0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
16ae0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16af0 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  j>=p->nCol ){.  
16b00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
16b10 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
16b20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77           "unknow
16b30 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20  n column \"%s\" 
16b40 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
16b50 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20  efinition", .   
16b60 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d         pFromCol-
16b70 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
16b80 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
16b90 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
16ba0 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
16bb0 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20  BJECT ){.       
16bc0 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f   sqlite3RenameTo
16bd0 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c  kenRemap(pParse,
16be0 20 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d   &pFKey->aCol[i]
16bf0 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d  , pFromCol->a[i]
16c00 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  .zName);.      }
16c10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
16c20 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
16c30 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
16c40 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
16c50 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
16c60 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  n30(pToCol->a[i]
16c70 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  .zName);.      p
16c80 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43  FKey->aCol[i].zC
16c90 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 69 66  ol = z;.      if
16ca0 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
16cb0 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  CT ){.        sq
16cc0 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
16cd0 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20 7a 2c  Remap(pParse, z,
16ce0 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e   pToCol->a[i].zN
16cf0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
16d00 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54      memcpy(z, pT
16d10 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
16d20 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d  , n);.      z[n]
16d30 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d   = 0;.      z +=
16d40 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n+1;.    }.  }.
16d50 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
16d60 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79  red = 0;.  pFKey
16d70 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d 20 28  ->aAction[0] = (
16d80 75 38 29 28 66 6c 61 67 73 20 26 20 30 78 66 66  u8)(flags & 0xff
16d90 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  );            /*
16da0 20 4f 4e 20 44 45 4c 45 54 45 20 61 63 74 69 6f   ON DELETE actio
16db0 6e 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 61 41  n */.  pFKey->aA
16dc0 63 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38 29 28  ction[1] = (u8)(
16dd0 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20  (flags >> 8 ) & 
16de0 30 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f 4e 20  0xff);    /* ON 
16df0 55 50 44 41 54 45 20 61 63 74 69 6f 6e 20 2a 2f  UPDATE action */
16e00 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
16e10 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
16e20 6c 64 28 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63  ld(db, 0, p->pSc
16e30 68 65 6d 61 29 20 29 3b 0a 20 20 70 4e 65 78 74  hema) );.  pNext
16e40 54 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c  To = (FKey *)sql
16e50 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
16e60 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79  p->pSchema->fkey
16e70 48 61 73 68 2c 20 0a 20 20 20 20 20 20 70 46 4b  Hash, .      pFK
16e80 65 79 2d 3e 7a 54 6f 2c 20 28 76 6f 69 64 20 2a  ey->zTo, (void *
16e90 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66  )pFKey.  );.  if
16ea0 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79  ( pNextTo==pFKey
16eb0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
16ec0 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
16ed0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
16ee0 7d 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 20  }.  if( pNextTo 
16ef0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16f00 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d  NextTo->pPrevTo=
16f10 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d  =0 );.    pFKey-
16f20 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e 65 78 74  >pNextTo = pNext
16f30 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d  To;.    pNextTo-
16f40 3e 70 50 72 65 76 54 6f 20 3d 20 70 46 4b 65 79  >pPrevTo = pFKey
16f50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  ;.  }..  /* Link
16f60 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
16f70 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73   to the table as
16f80 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a   the last step..
16f90 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20    */.  p->pFKey 
16fa0 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79  = pFKey;.  pFKey
16fb0 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20   = 0;..fk_end:. 
16fc0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
16fd0 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69  b, pFKey);.#endi
16fe0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
16ff0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
17000 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69  N_KEY) */.  sqli
17010 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
17020 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b  e(db, pFromCol);
17030 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
17040 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f  stDelete(db, pTo
17050 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Col);.}../*.** T
17060 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
17070 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e  alled when an IN
17080 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
17090 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44  E or INITIALLY D
170a0 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73  EFERRED.** claus
170b0 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61 72  e is seen as par
170c0 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b  t of a foreign k
170d0 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20  ey definition.  
170e0 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a  The isDeferred.*
170f0 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 31  * parameter is 1
17100 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44   for INITIALLY D
17110 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f  EFERRED and 0 fo
17120 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  r INITIALLY IMME
17130 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65  DIATE..** The be
17140 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f  havior of the mo
17150 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61  st recently crea
17160 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ted foreign key 
17170 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61  is adjusted.** a
17180 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76  ccordingly..*/.v
17190 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 65 72  oid sqlite3Defer
171a0 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65  ForeignKey(Parse
171b0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73   *pParse, int is
171c0 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64  Deferred){.#ifnd
171d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
171e0 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62  OREIGN_KEY.  Tab
171f0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79  le *pTab;.  FKey
17200 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28   *pFKey;.  if( (
17210 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
17220 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20  NewTable)==0 || 
17230 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70  (pFKey = pTab->p
17240 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72  FKey)==0 ) retur
17250 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 44  n;.  assert( isD
17260 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73  eferred==0 || is
17270 44 65 66 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f  Deferred==1 ); /
17280 2a 20 45 56 3a 20 52 2d 33 30 33 32 33 2d 32 31  * EV: R-30323-21
17290 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e  917 */.  pFKey->
172a0 69 73 44 65 66 65 72 72 65 64 20 3d 20 28 75 38  isDeferred = (u8
172b0 29 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e  )isDeferred;.#en
172c0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  dif.}../*.** Gen
172d0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
172e0 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72  will erase and r
172f0 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64  efill index *pId
17300 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75  x.  This is.** u
17310 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  sed to initializ
17320 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65  e a newly create
17330 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65  d index or to re
17340 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63  compute the.** c
17350 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64  ontent of an ind
17360 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74  ex in response t
17370 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  o a REINDEX comm
17380 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65  and..**.** if me
17390 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74  mRootPage is not
173a0 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65   negative, it me
173b0 61 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e 64  ans that the ind
173c0 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63  ex is newly.** c
173d0 72 65 61 74 65 64 2e 20 20 54 68 65 20 72 65 67  reated.  The reg
173e0 69 73 74 65 72 20 73 70 65 63 69 66 69 65 64 20  ister specified 
173f0 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63  by memRootPage c
17400 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72  ontains the.** r
17410 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
17420 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49  of the index.  I
17430 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73  f memRootPage is
17440 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a   negative, then.
17450 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72  ** the index alr
17460 65 61 64 79 20 65 78 69 73 74 73 20 61 6e 64 20  eady exists and 
17470 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65 64 20  must be cleared 
17480 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66  before being ref
17490 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65  illed and.** the
174a0 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
174b0 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69  r of the index i
174c0 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e  s taken from pIn
174d0 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74  dex->tnum..*/.st
174e0 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
174f0 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72  3RefillIndex(Par
17500 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
17510 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d  x *pIndex, int m
17520 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54  emRootPage){.  T
17530 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
17540 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a  dex->pTable;  /*
17550 20 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   The table that 
17560 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  is indexed */.  
17570 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73  int iTab = pPars
17580 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
17590 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75  * Btree cursor u
175a0 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  sed for pTab */.
175b0 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61    int iIdx = pPa
175c0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
175d0 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72   /* Btree cursor
175e0 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78   used for pIndex
175f0 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 65   */.  int iSorte
17600 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
17610 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
17620 70 65 6e 65 64 20 62 79 20 4f 70 65 6e 53 6f 72  pened by OpenSor
17630 74 65 72 20 28 69 66 20 69 6e 20 75 73 65 29 20  ter (if in use) 
17640 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20  */.  int addr1; 
17650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17660 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
17670 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f  f top of loop */
17680 0a 20 20 69 6e 74 20 61 64 64 72 32 3b 20 20 20  .  int addr2;   
17690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176a0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 74 6f 20    /* Address to 
176b0 6a 75 6d 70 20 74 6f 20 66 6f 72 20 6e 65 78 74  jump to for next
176c0 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   iteration */.  
176d0 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20  int tnum;       
176e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
176f0 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  * Root page of i
17700 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ndex */.  int iP
17710 61 72 74 49 64 78 4c 61 62 65 6c 3b 20 20 20 20  artIdxLabel;    
17720 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
17730 20 74 6f 20 74 68 69 73 20 6c 61 62 65 6c 20 74   to this label t
17740 6f 20 73 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a  o skip a row */.
17750 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
17760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17770 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
17780 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74  e into this virt
17790 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20  ual machine */. 
177a0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20   KeyInfo *pKey; 
177b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177c0 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69  /* KeyInfo for i
177d0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ndex */.  int re
177e0 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20  gRecord;        
177f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
17800 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73  ster holding ass
17810 65 6d 62 6c 65 64 20 69 6e 64 65 78 20 72 65 63  embled index rec
17820 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
17830 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
17840 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  b;      /* The d
17850 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
17860 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20  on */.  int iDb 
17870 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
17880 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  oIndex(db, pInde
17890 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  x->pSchema);..#i
178a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
178b0 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
178c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
178d0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
178e0 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70  QLITE_REINDEX, p
178f0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c  Index->zName, 0,
17900 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
17910 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 29 20 29  Db].zDbSName ) )
17920 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
17930 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
17940 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  equire a write-l
17950 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
17960 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73   to perform this
17970 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
17980 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
17990 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
179a0 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61  ab->tnum, 1, pTa
179b0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20  b->zName);..  v 
179c0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
179d0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
179e0 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
179f0 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
17a00 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20  >=0 ){.    tnum 
17a10 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20  = memRootPage;. 
17a20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d   }else{.    tnum
17a30 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b   = pIndex->tnum;
17a40 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71  .  }.  pKey = sq
17a50 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e  lite3KeyInfoOfIn
17a60 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
17a70 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ex);.  assert( p
17a80 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  Key!=0 || db->ma
17a90 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
17aa0 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 0a 20  arse->nErr );.. 
17ab0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 6f 72   /* Open the sor
17ac0 74 65 72 20 63 75 72 73 6f 72 20 69 66 20 77 65  ter cursor if we
17ad0 20 61 72 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e   are to use one.
17ae0 20 2a 2f 0a 20 20 69 53 6f 72 74 65 72 20 3d 20   */.  iSorter = 
17af0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
17b00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17b10 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op4(v, OP_Sorter
17b20 4f 70 65 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30  Open, iSorter, 0
17b30 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  , pIndex->nKeyCo
17b40 6c 2c 20 28 63 68 61 72 2a 29 0a 20 20 20 20 20  l, (char*).     
17b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
17b60 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
17b70 28 70 4b 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e  (pKey), P4_KEYIN
17b80 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  FO);..  /* Open 
17b90 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20  the table. Loop 
17ba0 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73  through all rows
17bb0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c 20 69   of the table, i
17bc0 6e 73 65 72 74 69 6e 67 20 69 6e 64 65 78 0a 20  nserting index. 
17bd0 20 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e 74 6f   ** records into
17be0 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a   the sorter. */.
17bf0 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
17c00 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c  le(pParse, iTab,
17c10 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
17c20 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72  penRead);.  addr
17c30 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
17c40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
17c50 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 20 56 64  nd, iTab, 0); Vd
17c60 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
17c70 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
17c80 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
17c90 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
17ca0 33 4d 75 6c 74 69 57 72 69 74 65 28 70 50 61 72  3MultiWrite(pPar
17cb0 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47  se);..  sqlite3G
17cc0 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
17cd0 70 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69 54  pParse,pIndex,iT
17ce0 61 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c 26  ab,regRecord,0,&
17cf0 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c  iPartIdxLabel,0,
17d00 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
17d10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
17d20 72 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f 72  rterInsert, iSor
17d30 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  ter, regRecord);
17d40 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
17d50 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50  ePartIdxLabel(pP
17d60 61 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c 61  arse, iPartIdxLa
17d70 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  bel);.  sqlite3V
17d80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17d90 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
17da0 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  1+1); VdbeCovera
17db0 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
17dc0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
17dd0 61 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65  addr1);.  if( me
17de0 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71  mRootPage<0 ) sq
17df0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17e00 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75  v, OP_Clear, tnu
17e10 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  m, iDb);.  sqlit
17e20 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
17e30 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49  OP_OpenWrite, iI
17e40 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a  dx, tnum, iDb, .
17e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e60 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79      (char *)pKey
17e70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
17e80 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
17e90 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42  geP5(v, OPFLAG_B
17ea0 55 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74  ULKCSR|((memRoot
17eb0 50 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f  Page>=0)?OPFLAG_
17ec0 50 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20  P2ISREG:0));..  
17ed0 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
17ee0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17ef0 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f 72  SorterSort, iSor
17f00 74 65 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  ter, 0); VdbeCov
17f10 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20  erage(v);.  if( 
17f20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
17f30 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69 6e 74  ndex) ){.    int
17f40 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
17f50 65 47 6f 74 6f 28 76 2c 20 31 29 3b 0a 20 20 20  eGoto(v, 1);.   
17f60 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
17f70 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
17f80 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
17f90 64 62 65 56 65 72 69 66 79 41 62 6f 72 74 61 62  dbeVerifyAbortab
17fa0 6c 65 28 76 2c 20 4f 45 5f 41 62 6f 72 74 29 3b  le(v, OE_Abort);
17fb0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
17fc0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
17fd0 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20 69  SorterCompare, i
17fe0 53 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67 52  Sorter, j2, regR
17ff0 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20  ecord,.         
18000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18010 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29  pIndex->nKeyCol)
18020 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
18030 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 55 6e  );.    sqlite3Un
18040 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  iqueConstraint(p
18050 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c  Parse, OE_Abort,
18060 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71   pIndex);.    sq
18070 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
18080 65 28 76 2c 20 6a 32 29 3b 0a 20 20 7d 65 6c 73  e(v, j2);.  }els
18090 65 7b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73  e{.    addr2 = s
180a0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
180b0 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20  tAddr(v);.  }.  
180c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
180d0 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61  3(v, OP_SorterDa
180e0 74 61 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67  ta, iSorter, reg
180f0 52 65 63 6f 72 64 2c 20 69 49 64 78 29 3b 0a 20  Record, iIdx);. 
18100 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18110 70 31 28 76 2c 20 4f 50 5f 53 65 65 6b 45 6e 64  p1(v, OP_SeekEnd
18120 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74  , iIdx);.  sqlit
18130 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18140 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49  OP_IdxInsert, iI
18150 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  dx, regRecord);.
18160 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
18170 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
18180 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
18190 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
181a0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
181b0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
181c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
181d0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
181e0 2c 20 69 53 6f 72 74 65 72 2c 20 61 64 64 72 32  , iSorter, addr2
181f0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
18200 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
18210 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
18220 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56  r1);..  sqlite3V
18230 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
18240 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20  Close, iTab);.  
18250 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18260 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
18270 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Idx);.  sqlite3V
18280 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
18290 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29 3b  Close, iSorter);
182a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
182b0 74 65 20 68 65 61 70 20 73 70 61 63 65 20 74 6f  te heap space to
182c0 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78 20 6f   hold an Index o
182d0 62 6a 65 63 74 20 77 69 74 68 20 6e 43 6f 6c 20  bject with nCol 
182e0 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  columns..**.** I
182f0 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f  ncrease the allo
18300 63 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f 20 70  cation size to p
18310 72 6f 76 69 64 65 20 61 6e 20 65 78 74 72 61 20  rovide an extra 
18320 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20  nExtra bytes.** 
18330 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  of 8-byte aligne
18340 64 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68  d space after th
18350 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 61  e Index object a
18360 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70  nd return a.** p
18370 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 65  ointer to this e
18380 78 74 72 61 20 73 70 61 63 65 20 69 6e 20 2a 70  xtra space in *p
18390 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78  pExtra..*/.Index
183a0 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74   *sqlite3Allocat
183b0 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a 20 20  eIndexObject(.  
183c0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
183d0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
183e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
183f0 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20 20 20   i16 nCol,      
18400 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
18410 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
18420 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   in the index */
18430 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
18440 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18450 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 65 78  r of bytes of ex
18460 74 72 61 20 73 70 61 63 65 20 74 6f 20 61 6c 6c  tra space to all
18470 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  oc */.  char **p
18480 70 45 78 74 72 61 20 20 20 20 20 20 20 2f 2a 20  pExtra       /* 
18490 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  Pointer to the "
184a0 65 78 74 72 61 22 20 73 70 61 63 65 20 2a 2f 0a  extra" space */.
184b0 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 20 20  ){.  Index *p;  
184c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
184d0 6f 63 61 74 65 64 20 69 6e 64 65 78 20 6f 62 6a  ocated index obj
184e0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  ect */.  int nBy
184f0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te;           /*
18500 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
18510 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  for Index object
18520 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a 20 20   + arrays */..  
18530 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73  nByte = ROUND8(s
18540 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 20 2b 20  izeof(Index)) + 
18550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18560 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
18570 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f   */.          RO
18580 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72  UND8(sizeof(char
18590 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20 20 20  *)*nCol) +      
185a0 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f     /* Index.azCo
185b0 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  ll     */.      
185c0 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f      ROUND8(sizeo
185d0 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b  f(LogEst)*(nCol+
185e0 31 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e 64 65  1) +     /* Inde
185f0 78 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 20 20  x.aiRowLogEst   
18600 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
18610 20 20 20 20 73 69 7a 65 6f 66 28 69 31 36 29 2a      sizeof(i16)*
18620 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20  nCol +          
18630 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c    /* Index.aiCol
18640 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  umn   */.       
18650 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
18660 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20 20 20  (u8)*nCol);     
18670 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
18680 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20  .aSortOrder */. 
18690 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
186a0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
186b0 74 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20  te + nExtra);.  
186c0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63 68 61  if( p ){.    cha
186d0 72 20 2a 70 45 78 74 72 61 20 3d 20 28 28 63 68  r *pExtra = ((ch
186e0 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28 73 69  ar*)p)+ROUND8(si
186f0 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20  zeof(Index));.  
18700 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63    p->azColl = (c
18710 6f 6e 73 74 20 63 68 61 72 2a 2a 29 70 45 78 74  onst char**)pExt
18720 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 52 4f  ra; pExtra += RO
18730 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72  UND8(sizeof(char
18740 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d  *)*nCol);.    p-
18750 3e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 28  >aiRowLogEst = (
18760 4c 6f 67 45 73 74 2a 29 70 45 78 74 72 61 3b 20  LogEst*)pExtra; 
18770 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66  pExtra += sizeof
18780 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31  (LogEst)*(nCol+1
18790 29 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f 6c 75  );.    p->aiColu
187a0 6d 6e 20 3d 20 28 69 31 36 2a 29 70 45 78 74 72  mn = (i16*)pExtr
187b0 61 3b 20 20 20 20 20 20 20 70 45 78 74 72 61 20  a;       pExtra 
187c0 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e  += sizeof(i16)*n
187d0 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53 6f 72  Col;.    p->aSor
187e0 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 70 45  tOrder = (u8*)pE
187f0 78 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f  xtra;.    p->nCo
18800 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20  lumn = nCol;.   
18810 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43   p->nKeyCol = nC
18820 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70 70 45  ol - 1;.    *ppE
18830 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70  xtra = ((char*)p
18840 29 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20  ) + nByte;.  }. 
18850 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
18860 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
18870 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51   index for an SQ
18880 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31  L table.  pName1
18890 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e  .pName2 is the n
188a0 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
188b0 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73   .** and pTblLis
188c0 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
188d0 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
188e0 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
188f0 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a  .  Both will .**
18900 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70   be NULL for a p
18910 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e  rimary key or an
18920 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63   index that is c
18930 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66  reated to satisf
18940 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f  y a.** UNIQUE co
18950 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54  nstraint.  If pT
18960 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20  able and pIndex 
18970 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50  are NULL, use pP
18980 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a  arse->pNewTable.
18990 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20  ** as the table 
189a0 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
189b0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
189c0 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61  e is a table tha
189d0 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  t is.** currentl
189e0 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
189f0 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20  ted by a CREATE 
18a00 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
18a10 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20  .**.** pList is 
18a20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  a list of column
18a30 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
18a40 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20    pList will be 
18a50 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20  NULL if this.** 
18a60 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  is a primary key
18a70 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74   or unique-const
18a80 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73  raint on the mos
18a90 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20  t recent column 
18aa0 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  added.** to the 
18ab0 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
18ac0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
18ad0 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  on.  .*/.void sq
18ae0 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
18af0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
18b00 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e  e,     /* All in
18b10 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
18b20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20  this parse */.  
18b30 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
18b40 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
18b50 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20   of index name. 
18b60 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
18b70 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
18b80 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61      /* Second pa
18b90 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
18ba0 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
18bb0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c  .  SrcList *pTbl
18bc0 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74  Name, /* Table t
18bd0 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61  o index. Use pPa
18be0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
18bf0 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  f 0 */.  ExprLis
18c00 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41  t *pList,   /* A
18c10 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
18c20 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
18c30 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
18c40 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f         /* OE_Abo
18c50 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f  rt, OE_Ignore, O
18c60 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45  E_Replace, or OE
18c70 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  _None */.  Token
18c80 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a   *pStart,     /*
18c90 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
18ca0 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
18cb0 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  is statement */.
18cc0 20 20 45 78 70 72 20 2a 70 50 49 57 68 65 72 65    Expr *pPIWhere
18cd0 2c 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c  ,    /* WHERE cl
18ce0 61 75 73 65 20 66 6f 72 20 70 61 72 74 69 61 6c  ause for partial
18cf0 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
18d00 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20  t sortOrder,    
18d10 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f   /* Sort order o
18d20 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68  f primary key wh
18d30 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a  en pList==NULL *
18d40 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69  /.  int ifNotExi
18d50 73 74 2c 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65  st,    /* Omit e
18d60 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c  rror if index al
18d70 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
18d80 20 20 75 38 20 69 64 78 54 79 70 65 20 20 20 20    u8 idxType    
18d90 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
18da0 78 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 54  x type */.){.  T
18db0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
18dc0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
18dd0 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
18de0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
18df0 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  0;   /* The inde
18e00 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  x to be created 
18e10 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
18e20 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d   = 0;     /* Nam
18e30 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a  e of the index *
18e40 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
18e50 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
18e60 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
18e70 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69   in zName */.  i
18e80 6e 74 20 69 2c 20 6a 3b 0a 20 20 44 62 46 69 78  nt i, j;.  DbFix
18e90 65 72 20 73 46 69 78 3b 20 20 20 20 20 20 20 20  er sFix;        
18ea0 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67  /* For assigning
18eb0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20   database names 
18ec0 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69  to pTable */.  i
18ed0 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b  nt sortOrderMask
18ee0 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f  ;   /* 1 to hono
18ef0 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e  r DESC in index.
18f00 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a    0 to ignore. *
18f10 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
18f20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
18f30 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
18f40 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63       /* The spec
18f50 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61  ific table conta
18f60 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65  ining the indexe
18f70 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  d database */.  
18f80 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
18f90 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
18fa0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
18fb0 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  at is being writ
18fc0 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ten */.  Token *
18fd0 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a  pName = 0;    /*
18fe0 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
18ff0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74  e of the index t
19000 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74  o create */.  st
19010 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
19020 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f  em *pListItem; /
19030 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
19040 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  er pList */.  in
19050 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 20 20 20  t nExtra = 0;   
19060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19070 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  * Space allocate
19080 64 20 66 6f 72 20 7a 45 78 74 72 61 5b 5d 20 2a  d for zExtra[] *
19090 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 43 6f  /.  int nExtraCo
190a0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
190b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
190c0 66 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  f extra columns 
190d0 6e 65 65 64 65 64 20 2a 2f 0a 20 20 63 68 61 72  needed */.  char
190e0 20 2a 7a 45 78 74 72 61 20 3d 20 30 3b 20 20 20   *zExtra = 0;   
190f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19100 45 78 74 72 61 20 73 70 61 63 65 20 61 66 74 65  Extra space afte
19110 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  r the Index obje
19120 63 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ct */.  Index *p
19130 50 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  Pk = 0;      /* 
19140 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
19150 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  x for WITHOUT RO
19160 57 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a 0a 20  WID tables */.. 
19170 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
19180 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
19190 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 67  >nErr>0 ){.    g
191a0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
191b0 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
191c0 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42   IN_DECLARE_VTAB
191d0 20 26 26 20 69 64 78 54 79 70 65 21 3d 53 51 4c   && idxType!=SQL
191e0 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d  ITE_IDXTYPE_PRIM
191f0 41 52 59 4b 45 59 20 29 7b 0a 20 20 20 20 67 6f  ARYKEY ){.    go
19200 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
19210 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
19220 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
19230 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
19240 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  rse) ){.    goto
19250 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19260 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ex;.  }..  /*.  
19270 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c  ** Find the tabl
19280 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
19290 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e  indexed.  Return
192a0 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f   early if not fo
192b0 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  und..  */.  if( 
192c0 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a  pTblName!=0 ){..
192d0 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74      /* Use the t
192e0 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61  wo-part index na
192f0 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  me to determine 
19300 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
19310 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66    ** to search f
19320 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46  or the table. 'F
19330 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ix' the table na
19340 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20  me to this db.  
19350 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b    ** before look
19360 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c 65  ing up the table
19370 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
19380 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70  ert( pName1 && p
19390 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62  Name2 );.    iDb
193a0 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
193b0 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
193c0 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
193d0 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69  Name);.    if( i
193e0 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74  Db<0 ) goto exit
193f0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
19400 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
19410 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b 0a   && pName->z );.
19420 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19430 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20  OMIT_TEMPDB.    
19440 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20  /* If the index 
19450 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69  name was unquali
19460 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74  fied, check if t
19470 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  he table.    ** 
19480 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e  is a temp table.
19490 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20   If so, set the 
194a0 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20 44  database to 1. D
194b0 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20 20  o not do this.  
194c0 20 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c 69    ** if initiali
194d0 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  sing a database 
194e0 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20  schema..    */. 
194f0 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
19500 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 70  .busy ){.      p
19510 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Tab = sqlite3Src
19520 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73  ListLookup(pPars
19530 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  e, pTblName);.  
19540 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e      if( pName2->
19550 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26 20  n==0 && pTab && 
19560 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64  pTab->pSchema==d
19570 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
19580 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44 62  a ){.        iDb
19590 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
195a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
195b0 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
195c0 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
195d0 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d  b, "index", pNam
195e0 65 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  e);.    if( sqli
195f0 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73  te3FixSrcList(&s
19600 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 20 29  Fix, pTblName) )
19610 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75  {.      /* Becau
19620 73 65 20 74 68 65 20 70 61 72 73 65 72 20 63 6f  se the parser co
19630 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d  nstructs pTblNam
19640 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  e from a single 
19650 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20  identifier,.    
19660 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53    ** sqlite3FixS
19670 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72  rcList can never
19680 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20   fail. */.      
19690 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d  assert(0);.    }
196a0 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
196b0 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74  te3LocateTableIt
196c0 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 26 70  em(pParse, 0, &p
196d0 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a  TblName->a[0]);.
196e0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
196f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
19700 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  || pTab==0 );.  
19710 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
19720 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19730 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
19740 69 44 62 3d 3d 31 20 26 26 20 64 62 2d 3e 61 44  iDb==1 && db->aD
19750 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 21 3d  b[iDb].pSchema!=
19760 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b  pTab->pSchema ){
19770 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
19780 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
19790 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e             "cann
197a0 6f 74 20 63 72 65 61 74 65 20 61 20 54 45 4d 50  ot create a TEMP
197b0 20 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d 54 45   index on non-TE
197c0 4d 50 20 74 61 62 6c 65 20 5c 22 25 73 5c 22 22  MP table \"%s\""
197d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61  ,.           pTa
197e0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
197f0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
19800 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
19810 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
19820 28 70 54 61 62 29 20 29 20 70 50 6b 20 3d 20 73  (pTab) ) pPk = s
19830 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
19840 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d  Index(pTab);.  }
19850 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
19860 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20  ( pName==0 );.  
19870 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74    assert( pStart
19880 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20  ==0 );.    pTab 
19890 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
198a0 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54  ble;.    if( !pT
198b0 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  ab ) goto exit_c
198c0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
198d0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
198e0 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
198f0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
19900 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d    }.  pDb = &db-
19910 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61 73  >aDb[iDb];..  as
19920 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
19930 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
19940 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20  e->nErr==0 );.  
19950 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
19960 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Cmp(pTab->zName,
19970 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d   "sqlite_", 7)==
19980 30 20 0a 20 20 20 20 20 20 20 26 26 20 64 62 2d  0 .       && db-
19990 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 0a 23 69  >init.busy==0.#i
199a0 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55  f SQLITE_USER_AU
199b0 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20  THENTICATION.   
199c0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 55 73      && sqlite3Us
199d0 65 72 41 75 74 68 54 61 62 6c 65 28 70 54 61 62  erAuthTable(pTab
199e0 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23 65 6e 64  ->zName)==0.#end
199f0 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
19a00 5f 41 4c 4c 4f 57 5f 53 51 4c 49 54 45 5f 4d 41  _ALLOW_SQLITE_MA
19a10 53 54 45 52 5f 49 4e 44 45 58 0a 20 20 20 20 20  STER_INDEX.     
19a20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49    && sqlite3StrI
19a30 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65  Cmp(&pTab->zName
19a40 5b 37 5d 2c 22 6d 61 73 74 65 72 22 29 21 3d 30  [7],"master")!=0
19a50 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 26  .#endif.       &
19a60 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  & sqlite3StrNICm
19a70 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37  p(&pTab->zName[7
19a80 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29  ],"altertab_",9)
19a90 21 3d 30 0a 20 29 7b 0a 20 20 20 20 73 71 6c 69  !=0. ){.    sqli
19aa0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
19ab0 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
19ac0 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
19ad0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
19ae0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
19af0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
19b00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19b10 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20  OMIT_VIEW.  if( 
19b20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
19b30 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
19b40 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
19b50 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  ews may not be i
19b60 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f  ndexed");.    go
19b70 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
19b80 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ndex;.  }.#endif
19b90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19ba0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
19bb0 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  E.  if( IsVirtua
19bc0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  l(pTab) ){.    s
19bd0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
19be0 50 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20  Parse, "virtual 
19bf0 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62  tables may not b
19c00 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20  e indexed");.   
19c10 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
19c20 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e  e_index;.  }.#en
19c30 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  dif..  /*.  ** F
19c40 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ind the name of 
19c50 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65  the index.  Make
19c60 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
19c70 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68  ot already anoth
19c80 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  er.  ** index or
19c90 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
19ca0 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a  same name.  .  *
19cb0 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e  *.  ** Exception
19cc0 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61  :  If we are rea
19cd0 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f  ding the names o
19ce0 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69  f permanent indi
19cf0 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ces from the.  *
19d00 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
19d10 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73  table (because s
19d20 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
19d30 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63  s changed the sc
19d40 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f  hema) and.  ** o
19d50 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ne of the index 
19d60 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77  names collides w
19d70 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ith the name of 
19d80 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
19d90 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c  e or.  ** index,
19da0 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f   then we will co
19db0 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73  ntinue to proces
19dc0 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20  s this index..  
19dd0 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65  **.  ** If pName
19de0 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ==0 it means tha
19df0 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65  t we are.  ** de
19e00 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69  aling with a pri
19e10 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51  mary key or UNIQ
19e20 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
19e30 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e  We have to inven
19e40 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e  t our.  ** own n
19e50 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ame..  */.  if( 
19e60 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  pName ){.    zNa
19e70 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
19e80 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
19e90 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  ame);.    if( zN
19ea0 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
19eb0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19ec0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
19ed0 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  me->z!=0 );.    
19ee0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
19ef0 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
19f00 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
19f10 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ame) ){.      go
19f20 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
19f30 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
19f40 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f  if( !IN_RENAME_O
19f50 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 69  BJECT ){.      i
19f60 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
19f70 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  y ){.        if(
19f80 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
19f90 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21  e(db, zName, 0)!
19fa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
19fb0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
19fc0 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
19fd0 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c  s already a tabl
19fe0 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61  e named %s", zNa
19ff0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
1a000 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1a010 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 7d  index;.        }
1a020 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1a030 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
1a040 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70  dex(db, zName, p
1a050 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 21 3d 30  Db->zDbSName)!=0
1a060 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1a070 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20  !ifNotExist ){. 
1a080 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1a090 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1a0a0 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61   "index %s alrea
1a0b0 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d  dy exists", zNam
1a0c0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
1a0d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
1a0e0 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
1a0f0 75 73 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  usy );.         
1a100 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
1a110 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
1a120 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 7d   iDb);.        }
1a130 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
1a140 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1a150 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a160 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1a170 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c  n;.    Index *pL
1a180 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  oop;.    for(pLo
1a190 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c  op=pTab->pIndex,
1a1a0 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f   n=1; pLoop; pLo
1a1b0 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c  op=pLoop->pNext,
1a1c0 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d   n++){}.    zNam
1a1d0 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
1a1e0 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61  tf(db, "sqlite_a
1a1f0 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c  utoindex_%s_%d",
1a200 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29   pTab->zName, n)
1a210 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
1a220 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
1a230 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1a240 65 78 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ex;.    }..    /
1a250 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  * Automatic inde
1a260 78 20 6e 61 6d 65 73 20 67 65 6e 65 72 61 74 65  x names generate
1a270 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 73 71  d from within sq
1a280 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
1a290 61 62 28 29 0a 20 20 20 20 2a 2a 20 6d 75 73 74  ab().    ** must
1a2a0 20 68 61 76 65 20 6e 61 6d 65 73 20 74 68 61 74   have names that
1a2b0 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 66 72   are distinct fr
1a2c0 6f 6d 20 6e 6f 72 6d 61 6c 20 61 75 74 6f 6d 61  om normal automa
1a2d0 74 69 63 20 69 6e 64 65 78 20 6e 61 6d 65 73 2e  tic index names.
1a2e0 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
1a2f0 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20  owing statement 
1a300 63 6f 6e 76 65 72 74 73 20 22 73 71 6c 69 74 65  converts "sqlite
1a310 33 5f 61 75 74 6f 69 6e 64 65 78 2e 2e 2e 22 20  3_autoindex..." 
1a320 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 22 73 71 6c  into.    ** "sql
1a330 69 74 65 33 5f 62 75 74 6f 69 6e 64 65 78 2e 2e  ite3_butoindex..
1a340 2e 22 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d  ." in order to m
1a350 61 6b 65 20 74 68 65 20 6e 61 6d 65 73 20 64 69  ake the names di
1a360 73 74 69 6e 63 74 2e 0a 20 20 20 20 2a 2a 20 54  stinct..    ** T
1a370 68 65 20 22 76 74 61 62 5f 65 72 72 2e 74 65 73  he "vtab_err.tes
1a380 74 22 20 74 65 73 74 20 64 65 6d 6f 6e 73 74 72  t" test demonstr
1a390 61 74 65 73 20 74 68 65 20 6e 65 65 64 20 6f 66  ates the need of
1a3a0 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 2e   this statement.
1a3b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 4e 5f 53   */.    if( IN_S
1a3c0 50 45 43 49 41 4c 5f 50 41 52 53 45 20 29 20 7a  PECIAL_PARSE ) z
1a3d0 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a 20 20 7d 0a 0a  Name[7]++;.  }..
1a3e0 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61    /* Check for a
1a3f0 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
1a400 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e  create an index.
1a410 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
1a420 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
1a430 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 21 49  IZATION.  if( !I
1a440 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
1a450 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
1a460 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 44  r *zDb = pDb->zD
1a470 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  bSName;.    if( 
1a480 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1a490 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1a4a0 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
1a4b0 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44  ABLE(iDb), 0, zD
1a4c0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
1a4d0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1a4e0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  ex;.    }.    i 
1a4f0 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
1a500 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21  INDEX;.    if( !
1a510 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
1a520 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49  Db==1 ) i = SQLI
1a530 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
1a540 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
1a550 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1a560 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c  Parse, i, zName,
1a570 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
1a580 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
1a590 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1a5a0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
1a5b0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c  ndif..  /* If pL
1a5c0 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73  ist==0, it means
1a5d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
1a5e0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65  s called to make
1a5f0 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20   a primary.  ** 
1a600 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  key out of the l
1a610 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ast column added
1a620 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e   to the table un
1a630 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1a640 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65  ..  ** So create
1a650 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20   a fake list to 
1a660 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20  simulate this.. 
1a670 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
1a680 3d 30 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20  =0 ){.    Token 
1a690 70 72 65 76 43 6f 6c 3b 0a 20 20 20 20 43 6f 6c  prevCol;.    Col
1a6a0 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 26 70 54 61  umn *pCol = &pTa
1a6b0 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
1a6c0 6f 6c 2d 31 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d  ol-1];.    pCol-
1a6d0 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  >colFlags |= COL
1a6e0 46 4c 41 47 5f 55 4e 49 51 55 45 3b 0a 20 20 20  FLAG_UNIQUE;.   
1a6f0 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69   sqlite3TokenIni
1a700 74 28 26 70 72 65 76 43 6f 6c 2c 20 70 43 6f 6c  t(&prevCol, pCol
1a710 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c  ->zName);.    pL
1a720 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
1a730 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
1a740 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  se, 0,.         
1a750 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1a760 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c  Alloc(db, TK_ID,
1a770 20 26 70 72 65 76 43 6f 6c 2c 20 30 29 29 3b 0a   &prevCol, 0));.
1a780 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
1a790 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
1a7a0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61  ate_index;.    a
1a7b0 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
1a7c0 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71  xpr==1 );.    sq
1a7d0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
1a7e0 53 6f 72 74 4f 72 64 65 72 28 70 4c 69 73 74 2c  SortOrder(pList,
1a7f0 20 73 6f 72 74 4f 72 64 65 72 29 3b 0a 20 20 7d   sortOrder);.  }
1a800 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
1a810 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65  3ExprListCheckLe
1a820 6e 67 74 68 28 70 50 61 72 73 65 2c 20 70 4c 69  ngth(pParse, pLi
1a830 73 74 2c 20 22 69 6e 64 65 78 22 29 3b 0a 20 20  st, "index");.  
1a840 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
1a850 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65  ut how many byte
1a860 73 20 6f 66 20 73 70 61 63 65 20 61 72 65 20 72  s of space are r
1a870 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65  equired to store
1a880 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a   explicitly.  **
1a890 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61   specified colla
1a8a0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
1a8b0 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  mes..  */.  for(
1a8c0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1a8d0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
1a8e0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69  xpr *pExpr = pLi
1a8f0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
1a900 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1a910 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  r!=0 );.    if( 
1a920 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
1a930 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 6e  LLATE ){.      n
1a940 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20 73 71  Extra += (1 + sq
1a950 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45  lite3Strlen30(pE
1a960 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29 3b  xpr->u.zToken));
1a970 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1a980 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20   .  ** Allocate 
1a990 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74  the index struct
1a9a0 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61  ure. .  */.  nNa
1a9b0 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
1a9c0 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e  en30(zName);.  n
1a9d0 45 78 74 72 61 43 6f 6c 20 3d 20 70 50 6b 20 3f  ExtraCol = pPk ?
1a9e0 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20   pPk->nKeyCol : 
1a9f0 31 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  1;.  pIndex = sq
1aa00 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64  lite3AllocateInd
1aa10 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 4c 69  exObject(db, pLi
1aa20 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e 45 78 74  st->nExpr + nExt
1aa30 72 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20  raCol,.         
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4e 61               nNa
1aa60 6d 65 20 2b 20 6e 45 78 74 72 61 20 2b 20 31 2c  me + nExtra + 1,
1aa70 20 26 7a 45 78 74 72 61 29 3b 0a 20 20 69 66 28   &zExtra);.  if(
1aa80 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1aa90 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
1aaa0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1aab0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45  .  }.  assert( E
1aac0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
1aad0 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 69 52 6f  ENT(pIndex->aiRo
1aae0 77 4c 6f 67 45 73 74 29 20 29 3b 0a 20 20 61 73  wLogEst) );.  as
1aaf0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
1ab00 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65  _ALIGNMENT(pInde
1ab10 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20  x->azColl) );.  
1ab20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20  pIndex->zName = 
1ab30 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61  zExtra;.  zExtra
1ab40 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20   += nName + 1;. 
1ab50 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e   memcpy(pIndex->
1ab60 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  zName, zName, nN
1ab70 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78  ame+1);.  pIndex
1ab80 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b  ->pTable = pTab;
1ab90 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  .  pIndex->onErr
1aba0 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72  or = (u8)onError
1abb0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71  ;.  pIndex->uniq
1abc0 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f  NotNull = onErro
1abd0 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70 49  r!=OE_None;.  pI
1abe0 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 20 3d 20  ndex->idxType = 
1abf0 69 64 78 54 79 70 65 3b 0a 20 20 70 49 6e 64 65  idxType;.  pInde
1ac00 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  x->pSchema = db-
1ac10 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
1ac20 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65  a;.  pIndex->nKe
1ac30 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  yCol = pList->nE
1ac40 78 70 72 3b 0a 20 20 69 66 28 20 70 50 49 57 68  xpr;.  if( pPIWh
1ac50 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ere ){.    sqlit
1ac60 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66  e3ResolveSelfRef
1ac70 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70  erence(pParse, p
1ac80 54 61 62 2c 20 4e 43 5f 50 61 72 74 49 64 78 2c  Tab, NC_PartIdx,
1ac90 20 70 50 49 57 68 65 72 65 2c 20 30 29 3b 0a 20   pPIWhere, 0);. 
1aca0 20 20 20 70 49 6e 64 65 78 2d 3e 70 50 61 72 74     pIndex->pPart
1acb0 49 64 78 57 68 65 72 65 20 3d 20 70 50 49 57 68  IdxWhere = pPIWh
1acc0 65 72 65 3b 0a 20 20 20 20 70 50 49 57 68 65 72  ere;.    pPIWher
1acd0 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  e = 0;.  }.  ass
1ace0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
1acf0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
1ad00 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20 20 2f 2a  iDb, 0) );..  /*
1ad10 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1ad20 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72   we should honor
1ad30 20 44 45 53 43 20 72 65 71 75 65 73 74 73 20 6f   DESC requests o
1ad40 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a  n index columns.
1ad50 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e    */.  if( pDb->
1ad60 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f  pSchema->file_fo
1ad70 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73  rmat>=4 ){.    s
1ad80 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d  ortOrderMask = -
1ad90 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45  1;   /* Honor DE
1ada0 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  SC */.  }else{. 
1adb0 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b     sortOrderMask
1adc0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f   = 0;    /* Igno
1add0 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a  re DESC */.  }..
1ade0 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65    /* Analyze the
1adf0 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
1ae00 69 6f 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74  ions that form t
1ae10 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
1ae20 69 6e 64 65 78 20 61 6e 64 0a 20 20 2a 2a 20 72  index and.  ** r
1ae30 65 70 6f 72 74 20 61 6e 79 20 65 72 72 6f 72 73  eport any errors
1ae40 2e 20 20 49 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  .  In the common
1ae50 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
1ae60 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 78  expression is ex
1ae70 61 63 74 6c 79 0a 20 20 2a 2a 20 61 20 74 61 62  actly.  ** a tab
1ae80 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73 74 6f 72 65  le column, store
1ae90 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20   that column in 
1aea0 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20 46 6f 72  aiColumn[].  For
1aeb0 20 67 65 6e 65 72 61 6c 20 65 78 70 72 65 73 73   general express
1aec0 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f 70 75 6c  ions,.  ** popul
1aed0 61 74 65 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c  ate pIndex->aCol
1aee0 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 58  Expr and store X
1aef0 4e 5f 45 58 50 52 20 28 2d 32 29 20 69 6e 20 61  N_EXPR (-2) in a
1af00 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a 2a 0a  iColumn[]..  **.
1af10 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65    ** TODO: Issue
1af20 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74 77   a warning if tw
1af30 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e  o or more column
1af40 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  s of the index a
1af50 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20  re identical..  
1af60 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65 20 61  ** TODO: Issue a
1af70 20 77 61 72 6e 69 6e 67 20 69 66 20 74 68 65 20   warning if the 
1af80 74 61 62 6c 65 20 70 72 69 6d 61 72 79 20 6b 65  table primary ke
1af90 79 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72  y is used as par
1afa0 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e  t of the.  ** in
1afb0 64 65 78 20 6b 65 79 2e 0a 20 20 2a 2f 0a 20 20  dex key..  */.  
1afc0 70 4c 69 73 74 49 74 65 6d 20 3d 20 70 4c 69 73  pListItem = pLis
1afd0 74 2d 3e 61 3b 0a 20 20 69 66 28 20 49 4e 5f 52  t->a;.  if( IN_R
1afe0 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a  ENAME_OBJECT ){.
1aff0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c      pIndex->aCol
1b000 45 78 70 72 20 3d 20 70 4c 69 73 74 3b 0a 20 20  Expr = pList;.  
1b010 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d    pList = 0;.  }
1b020 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
1b030 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  ndex->nKeyCol; i
1b040 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29  ++, pListItem++)
1b050 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 43 45 78  {.    Expr *pCEx
1b060 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
1b070 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
1b080 20 69 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f   index expressio
1b090 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 71  n */.    int req
1b0a0 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b  uestedSortOrder;
1b0b0 20 20 20 20 20 20 20 20 2f 2a 20 41 53 43 20 6f          /* ASC o
1b0c0 72 20 44 45 53 43 20 6f 6e 20 74 68 65 20 69 2d  r DESC on the i-
1b0d0 74 68 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  th expression */
1b0e0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1b0f0 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zColl;         
1b100 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e      /* Collation
1b110 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a   sequence name *
1b120 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  /..    sqlite3St
1b130 72 69 6e 67 54 6f 49 64 28 70 4c 69 73 74 49 74  ringToId(pListIt
1b140 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
1b150 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
1b160 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72  lfReference(pPar
1b170 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 49 64 78  se, pTab, NC_Idx
1b180 45 78 70 72 2c 20 70 4c 69 73 74 49 74 65 6d 2d  Expr, pListItem-
1b190 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  >pExpr, 0);.    
1b1a0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1b1b0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
1b1c0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70  ate_index;.    p
1b1d0 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  CExpr = sqlite3E
1b1e0 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
1b1f0 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29  ListItem->pExpr)
1b200 3b 0a 20 20 20 20 69 66 28 20 70 43 45 78 70 72  ;.    if( pCExpr
1b210 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
1b220 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  ){.      if( pTa
1b230 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  b==pParse->pNewT
1b240 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
1b250 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1b260 70 50 61 72 73 65 2c 20 22 65 78 70 72 65 73 73  pParse, "express
1b270 69 6f 6e 73 20 70 72 6f 68 69 62 69 74 65 64 20  ions prohibited 
1b280 69 6e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61  in PRIMARY KEY a
1b290 6e 64 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  nd ".           
1b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2b0 20 20 20 20 20 22 55 4e 49 51 55 45 20 63 6f 6e       "UNIQUE con
1b2c0 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20  straints");.    
1b2d0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1b2e0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1b2f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
1b300 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 3d 3d  ndex->aColExpr==
1b310 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  0 ){.        pIn
1b320 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 3d 20  dex->aColExpr = 
1b330 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 70  pList;.        p
1b340 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
1b350 7d 0a 20 20 20 20 20 20 6a 20 3d 20 58 4e 5f 45  }.      j = XN_E
1b360 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65  XPR;.      pInde
1b370 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
1b380 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20   XN_EXPR;.      
1b390 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e  pIndex->uniqNotN
1b3a0 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ull = 0;.    }el
1b3b0 73 65 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 43  se{.      j = pC
1b3c0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
1b3d0 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 3d       assert( j<=
1b3e0 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20 20 20  0x7fff );.      
1b3f0 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20  if( j<0 ){.     
1b400 20 20 20 6a 20 3d 20 70 54 61 62 2d 3e 69 50 4b     j = pTab->iPK
1b410 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ey;.      }else 
1b420 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  if( pTab->aCol[j
1b430 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a  ].notNull==0 ){.
1b440 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1b450 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b  uniqNotNull = 0;
1b460 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1b470 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
1b480 69 5d 20 3d 20 28 69 31 36 29 6a 3b 0a 20 20 20  i] = (i16)j;.   
1b490 20 7d 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 30   }.    zColl = 0
1b4a0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 49  ;.    if( pListI
1b4b0 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d  tem->pExpr->op==
1b4c0 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20  TK_COLLATE ){.  
1b4d0 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20      int nColl;. 
1b4e0 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69       zColl = pLi
1b4f0 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 75  stItem->pExpr->u
1b500 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e  .zToken;.      n
1b510 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74  Coll = sqlite3St
1b520 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20  rlen30(zColl) + 
1b530 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
1b540 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29   nExtra>=nColl )
1b550 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
1b560 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43  Extra, zColl, nC
1b570 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  oll);.      zCol
1b580 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20  l = zExtra;.    
1b590 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c    zExtra += nCol
1b5a0 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  l;.      nExtra 
1b5b0 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65  -= nColl;.    }e
1b5c0 6c 73 65 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a  lse if( j>=0 ){.
1b5d0 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54        zColl = pT
1b5e0 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c  ab->aCol[j].zCol
1b5f0 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  l;.    }.    if(
1b600 20 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20   !zColl ) zColl 
1b610 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  = sqlite3StrBINA
1b620 52 59 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d  RY;.    if( !db-
1b630 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73  >init.busy && !s
1b640 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
1b650 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
1b660 6c 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  l) ){.      goto
1b670 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1b680 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
1b690 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20  ndex->azColl[i] 
1b6a0 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71  = zColl;.    req
1b6b0 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20  uestedSortOrder 
1b6c0 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72  = pListItem->sor
1b6d0 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64  tOrder & sortOrd
1b6e0 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64  erMask;.    pInd
1b6f0 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
1b700 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73 74 65  ] = (u8)requeste
1b710 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a  dSortOrder;.  }.
1b720 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65  .  /* Append the
1b730 20 74 61 62 6c 65 20 6b 65 79 20 74 6f 20 74 68   table key to th
1b740 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
1b750 65 78 2e 20 20 46 6f 72 20 57 49 54 48 4f 55 54  ex.  For WITHOUT
1b760 20 52 4f 57 49 44 0a 20 20 2a 2a 20 74 61 62 6c   ROWID.  ** tabl
1b770 65 73 20 28 77 68 65 6e 20 70 50 6b 21 3d 30 29  es (when pPk!=0)
1b780 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   this will be th
1b790 65 20 64 65 63 6c 61 72 65 64 20 50 52 49 4d 41  e declared PRIMA
1b7a0 52 59 20 4b 45 59 2e 20 20 46 6f 72 0a 20 20 2a  RY KEY.  For.  *
1b7b0 2a 20 6e 6f 72 6d 61 6c 20 74 61 62 6c 65 73 20  * normal tables 
1b7c0 28 77 68 65 6e 20 70 50 6b 3d 3d 30 29 20 74 68  (when pPk==0) th
1b7d0 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 72  is will be the r
1b7e0 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  owid..  */.  if(
1b7f0 20 70 50 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28   pPk ){.    for(
1b800 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79  j=0; j<pPk->nKey
1b810 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
1b820 20 69 6e 74 20 78 20 3d 20 70 50 6b 2d 3e 61 69   int x = pPk->ai
1b830 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
1b840 20 61 73 73 65 72 74 28 20 78 3e 3d 30 20 29 3b   assert( x>=0 );
1b850 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 43 6f  .      if( hasCo
1b860 6c 75 6d 6e 28 70 49 6e 64 65 78 2d 3e 61 69 43  lumn(pIndex->aiC
1b870 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e  olumn, pIndex->n
1b880 4b 65 79 43 6f 6c 2c 20 78 29 20 29 7b 0a 20 20  KeyCol, x) ){.  
1b890 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 43        pIndex->nC
1b8a0 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20 20  olumn--; .      
1b8b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1b8c0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
1b8d0 69 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20  i] = x;.        
1b8e0 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
1b8f0 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b  ] = pPk->azColl[
1b900 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64  j];.        pInd
1b910 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
1b920 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72  ] = pPk->aSortOr
1b930 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  der[j];.        
1b940 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i++;.      }.   
1b950 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69   }.    assert( i
1b960 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  ==pIndex->nColum
1b970 6e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n );.  }else{.  
1b980 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
1b990 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 52 4f 57 49 44  mn[i] = XN_ROWID
1b9a0 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a  ;.    pIndex->az
1b9b0 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65  Coll[i] = sqlite
1b9c0 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a  3StrBINARY;.  }.
1b9d0 20 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74    sqlite3Default
1b9e0 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a  RowEst(pIndex);.
1b9f0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e    if( pParse->pN
1ba00 65 77 54 61 62 6c 65 3d 3d 30 20 29 20 65 73 74  ewTable==0 ) est
1ba10 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28  imateIndexWidth(
1ba20 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 49  pIndex);..  /* I
1ba30 66 20 74 68 69 73 20 69 6e 64 65 78 20 63 6f 6e  f this index con
1ba40 74 61 69 6e 73 20 65 76 65 72 79 20 63 6f 6c 75  tains every colu
1ba50 6d 6e 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2c  mn of its table,
1ba60 20 74 68 65 6e 20 6d 61 72 6b 0a 20 20 2a 2a 20   then mark.  ** 
1ba70 69 74 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67  it as a covering
1ba80 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65   index */.  asse
1ba90 72 74 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  rt( HasRowid(pTa
1baa0 62 29 20 0a 20 20 20 20 20 20 7c 7c 20 70 54 61  b) .      || pTa
1bab0 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 73 71  b->iPKey<0 || sq
1bac0 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
1bad0 65 78 28 70 49 6e 64 65 78 2c 20 70 54 61 62 2d  ex(pIndex, pTab-
1bae0 3e 69 50 4b 65 79 29 3e 3d 30 20 29 3b 0a 20 20  >iPKey)>=0 );.  
1baf0 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73  recomputeColumns
1bb00 4e 6f 74 49 6e 64 65 78 65 64 28 70 49 6e 64 65  NotIndexed(pInde
1bb10 78 29 3b 0a 20 20 69 66 28 20 70 54 62 6c 4e 61  x);.  if( pTblNa
1bb20 6d 65 21 3d 30 20 26 26 20 70 49 6e 64 65 78 2d  me!=0 && pIndex-
1bb30 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 54 61 62 2d 3e  >nColumn>=pTab->
1bb40 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 70 49 6e 64  nCol ){.    pInd
1bb50 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d  ex->isCovering =
1bb60 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   1;.    for(j=0;
1bb70 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
1bb80 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6a  ++){.      if( j
1bb90 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 20  ==pTab->iPKey ) 
1bba0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1bbb0 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  if( sqlite3Colum
1bbc0 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65 78 2c  nOfIndex(pIndex,
1bbd0 6a 29 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  j)>=0 ) continue
1bbe0 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  ;.      pIndex->
1bbf0 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 30 3b 0a  isCovering = 0;.
1bc00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1bc10 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54   }.  }..  if( pT
1bc20 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77  ab==pParse->pNew
1bc30 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Table ){.    /* 
1bc40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
1bc50 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20   been called to 
1bc60 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61  create an automa
1bc70 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20  tic index as a. 
1bc80 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20     ** result of 
1bc90 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
1bca0 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f   UNIQUE clause o
1bcb0 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  n a column defin
1bcc0 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a  ition, or.    **
1bcd0 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
1bce0 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
1bcf0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f  following the co
1bd00 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73  lumn definitions
1bd10 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e  ..    ** i.e. on
1bd20 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e of:.    **.   
1bd30 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
1bd40 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59   t(x PRIMARY KEY
1bd50 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45  , y);.    ** CRE
1bd60 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79  ATE TABLE t(x, y
1bd70 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b  , UNIQUE(x, y));
1bd80 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
1bd90 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b  ither way, check
1bda0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74   to see if the t
1bdb0 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
1bdc0 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20   such an index. 
1bdd0 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f  If.    ** so, do
1bde0 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74  n't bother creat
1bdf0 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68  ing this one. Th
1be00 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20  is only applies 
1be10 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61  to.    ** automa
1be20 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20  tically created 
1be30 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63  indices. Users c
1be40 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69  an do as they wi
1be50 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65  sh with.    ** e
1be60 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e  xplicit indices.
1be70 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1be80 77 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49  wo UNIQUE or PRI
1be90 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
1bea0 69 6e 74 73 20 61 72 65 20 63 6f 6e 73 69 64 65  ints are conside
1beb0 72 65 64 20 65 71 75 69 76 61 6c 65 6e 74 0a 20  red equivalent. 
1bec0 20 20 20 2a 2a 20 28 61 6e 64 20 74 68 75 73 20     ** (and thus 
1bed0 73 75 70 70 72 65 73 73 69 6e 67 20 74 68 65 20  suppressing the 
1bee0 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e  second one) even
1bef0 20 69 66 20 74 68 65 79 20 68 61 76 65 20 64 69   if they have di
1bf00 66 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73  fferent.    ** s
1bf10 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20 20 20 20  ort orders..    
1bf20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
1bf30 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  re are different
1bf40 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1bf50 6e 63 65 73 20 6f 72 20 69 66 20 74 68 65 20 63  nces or if the c
1bf60 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a  olumns of.    **
1bf70 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
1bf80 6f 63 63 75 72 20 69 6e 20 64 69 66 66 65 72 65  occur in differe
1bf90 6e 74 20 6f 72 64 65 72 73 2c 20 74 68 65 6e 20  nt orders, then 
1bfa0 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  the constraints 
1bfb0 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69  are.    ** consi
1bfc0 64 65 72 65 64 20 64 69 73 74 69 6e 63 74 20 61  dered distinct a
1bfd0 6e 64 20 62 6f 74 68 20 72 65 73 75 6c 74 20 69  nd both result i
1bfe0 6e 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63  n separate indic
1bff0 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49  es..    */.    I
1c000 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
1c010 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
1c020 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
1c030 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
1c040 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
1c050 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e 69     assert( IsUni
1c060 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29  queIndex(pIdx) )
1c070 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c080 70 49 64 78 2d 3e 69 64 78 54 79 70 65 21 3d 53  pIdx->idxType!=S
1c090 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50  QLITE_IDXTYPE_AP
1c0a0 50 44 45 46 20 29 3b 0a 20 20 20 20 20 20 61 73  PDEF );.      as
1c0b0 73 65 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e  sert( IsUniqueIn
1c0c0 64 65 78 28 70 49 6e 64 65 78 29 20 29 3b 0a 0a  dex(pIndex) );..
1c0d0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1c0e0 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78 2d  nKeyCol!=pIndex-
1c0f0 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69  >nKeyCol ) conti
1c100 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  nue;.      for(k
1c110 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; k<pIdx->nKey
1c120 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  Col; k++){.     
1c130 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1c140 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  1;.        const
1c150 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20   char *z2;.     
1c160 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
1c170 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d 30 20  >aiColumn[k]>=0 
1c180 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1c190 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  Idx->aiColumn[k]
1c1a0 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  !=pIndex->aiColu
1c1b0 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20  mn[k] ) break;. 
1c1c0 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64 78         z1 = pIdx
1c1d0 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20  ->azColl[k];.   
1c1e0 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65 78       z2 = pIndex
1c1f0 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20  ->azColl[k];.   
1c200 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1c210 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20  StrICmp(z1, z2) 
1c220 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
1c230 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49  .      if( k==pI
1c240 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20  dx->nKeyCol ){. 
1c250 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
1c260 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78  >onError!=pIndex
1c270 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20  ->onError ){.   
1c280 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
1c290 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65  onstraint create
1c2a0 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78  s the same index
1c2b0 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20   as a previous. 
1c2c0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
1c2d0 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64  traint specified
1c2e0 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68   somewhere in th
1c2f0 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
1c300 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
1c310 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74      ** However t
1c320 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  he ON CONFLICT c
1c330 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65  lauses are diffe
1c340 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68  rent. If both th
1c350 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is .          **
1c360 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
1c370 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75  the previous equ
1c380 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69  ivalent constrai
1c390 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74  nt have explicit
1c3a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e  .          ** ON
1c3b0 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
1c3c0 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  s this is an err
1c3d0 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  or. Otherwise, u
1c3e0 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  se the.         
1c3f0 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73   ** explicitly s
1c400 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f  pecified behavio
1c410 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e  r for the index.
1c420 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1c430 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49          if( !(pI
1c440 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
1c450 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65  Default || pInde
1c460 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
1c470 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20  efault) ){.     
1c480 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1c490 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4b0 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20  "conflicting ON 
1c4c0 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
1c4d0 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b   specified", 0);
1c4e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1c4f0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
1c500 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
1c510 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ault ){.        
1c520 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f      pIdx->onErro
1c530 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  r = pIndex->onEr
1c540 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ror;.          }
1c550 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c560 20 20 20 69 66 28 20 69 64 78 54 79 70 65 3d 3d     if( idxType==
1c570 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50  SQLITE_IDXTYPE_P
1c580 52 49 4d 41 52 59 4b 45 59 20 29 20 70 49 64 78  RIMARYKEY ) pIdx
1c590 2d 3e 69 64 78 54 79 70 65 20 3d 20 69 64 78 54  ->idxType = idxT
1c5a0 79 70 65 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ype;.        got
1c5b0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1c5c0 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
1c5d0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 49   }.  }..  if( !I
1c5e0 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
1c5f0 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20  ){..    /* Link 
1c600 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74  the new Index st
1c610 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74  ructure to its t
1c620 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20  able and to the 
1c630 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 69 6e 2d  other.    ** in-
1c640 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
1c650 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 20  structures. .   
1c660 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1c670 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
1c680 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69  );.    if( db->i
1c690 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
1c6a0 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
1c6b0 20 20 61 73 73 65 72 74 28 20 21 49 4e 5f 53 50    assert( !IN_SP
1c6c0 45 43 49 41 4c 5f 50 41 52 53 45 20 29 3b 0a 20  ECIAL_PARSE );. 
1c6d0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
1c6e0 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
1c6f0 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65  eld(db, 0, pInde
1c700 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  x->pSchema) );. 
1c710 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33       p = sqlite3
1c720 48 61 73 68 49 6e 73 65 72 74 28 26 70 49 6e 64  HashInsert(&pInd
1c730 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78  ex->pSchema->idx
1c740 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20  Hash, .         
1c750 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
1c760 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 69  pIndex);.      i
1c770 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20  f( p ){.        
1c780 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65  assert( p==pInde
1c790 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  x );  /* Malloc 
1c7a0 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
1c7b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
1c7c0 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
1c7d0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
1c7e0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1c7f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
1c800 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44  b->mDbFlags |= D
1c810 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e  BFLAG_SchemaChan
1c820 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ge;.      if( pT
1c830 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
1c840 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75       pIndex->tnu
1c850 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
1c860 54 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tnum;.      }.  
1c870 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1c880 68 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69  his is the initi
1c890 61 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  al CREATE INDEX 
1c8a0 73 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 43 52  statement (or CR
1c8b0 45 41 54 45 20 54 41 42 4c 45 20 69 66 20 74 68  EATE TABLE if th
1c8c0 65 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 69  e.    ** index i
1c8d0 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64  s an implied ind
1c8e0 65 78 20 66 6f 72 20 61 20 55 4e 49 51 55 45 20  ex for a UNIQUE 
1c8f0 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
1c900 6f 6e 73 74 72 61 69 6e 74 29 20 74 68 65 6e 0a  onstraint) then.
1c910 20 20 20 20 2a 2a 20 65 6d 69 74 20 63 6f 64 65      ** emit code
1c920 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   to allocate the
1c930 20 69 6e 64 65 78 20 72 6f 6f 74 70 61 67 65 20   index rootpage 
1c940 6f 6e 20 64 69 73 6b 20 61 6e 64 20 6d 61 6b 65  on disk and make
1c950 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 0a 20 20   an entry for.  
1c960 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
1c970 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
1c980 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 70 6f  ter table and po
1c990 70 75 6c 61 74 65 20 74 68 65 20 69 6e 64 65 78  pulate the index
1c9a0 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 63 6f 6e   with.    ** con
1c9b0 74 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e  tent.  But, do n
1c9c0 6f 74 20 64 6f 20 74 68 69 73 20 69 66 20 77 65  ot do this if we
1c9d0 20 61 72 65 20 73 69 6d 70 6c 79 20 72 65 61 64   are simply read
1c9e0 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
1c9f0 61 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 61 62  aster.    ** tab
1ca00 6c 65 20 74 6f 20 70 61 72 73 65 20 74 68 65 20  le to parse the 
1ca10 73 63 68 65 6d 61 2c 20 6f 72 20 69 66 20 74 68  schema, or if th
1ca20 69 73 20 69 6e 64 65 78 20 69 73 20 74 68 65 20  is index is the 
1ca30 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
1ca40 78 0a 20 20 20 20 2a 2a 20 6f 66 20 61 20 57 49  x.    ** of a WI
1ca50 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
1ca60 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
1ca70 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20   If pTblName==0 
1ca80 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e  it means this in
1ca90 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64  dex is generated
1caa0 20 61 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 50   as an implied P
1cab0 52 49 4d 41 52 59 20 4b 45 59 0a 20 20 20 20 2a  RIMARY KEY.    *
1cac0 2a 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65  * or UNIQUE inde
1cad0 78 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  x in a CREATE TA
1cae0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
1caf0 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a  Since the table.
1cb00 20 20 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20      ** has just 
1cb10 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74  been created, it
1cb20 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
1cb30 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  a and the index 
1cb40 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
1cb50 20 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62     ** step can b
1cb60 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a  e skipped..    *
1cb70 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 48  /.    else if( H
1cb80 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c  asRowid(pTab) ||
1cb90 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
1cba0 20 20 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20        Vdbe *v;. 
1cbb0 20 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74       char *zStmt
1cbc0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d  ;.      int iMem
1cbd0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1cbe0 6d 3b 0a 0a 20 20 20 20 20 20 76 20 3d 20 73 71  m;..      v = sq
1cbf0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1cc00 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rse);.      if( 
1cc10 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  v==0 ) goto exit
1cc20 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
1cc30 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
1cc40 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
1cc50 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
1cc60 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  ;..      /* Crea
1cc70 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20  te the rootpage 
1cc80 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 75 73  for the index us
1cc90 69 6e 67 20 43 72 65 61 74 65 49 6e 64 65 78 2e  ing CreateIndex.
1cca0 20 42 75 74 20 62 65 66 6f 72 65 0a 20 20 20 20   But before.    
1ccb0 20 20 2a 2a 20 64 6f 69 6e 67 20 73 6f 2c 20 63    ** doing so, c
1ccc0 6f 64 65 20 61 20 4e 6f 6f 70 20 69 6e 73 74 72  ode a Noop instr
1ccd0 75 63 74 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65  uction and store
1cce0 20 69 74 73 20 61 64 64 72 65 73 73 20 69 6e 20   its address in 
1ccf0 0a 20 20 20 20 20 20 2a 2a 20 49 6e 64 65 78 2e  .      ** Index.
1cd00 74 6e 75 6d 2e 20 54 68 69 73 20 69 73 20 72 65  tnum. This is re
1cd10 71 75 69 72 65 64 20 69 6e 20 63 61 73 65 20 74  quired in case t
1cd20 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 63 74  his index is act
1cd30 75 61 6c 6c 79 20 61 20 0a 20 20 20 20 20 20 2a  ually a .      *
1cd40 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e  * PRIMARY KEY an
1cd50 64 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61  d the table is a
1cd60 63 74 75 61 6c 6c 79 20 61 20 57 49 54 48 4f 55  ctually a WITHOU
1cd70 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 49  T ROWID table. I
1cd80 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  n .      ** that
1cd90 20 63 61 73 65 20 74 68 65 20 63 6f 6e 76 65 72   case the conver
1cda0 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54  tToWithoutRowidT
1cdb0 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 20 77  able() routine w
1cdc0 69 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20 20 20  ill replace.    
1cdd0 20 20 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69    ** the Noop wi
1cde0 74 68 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d  th a Goto to jum
1cdf0 70 20 6f 76 65 72 20 74 68 65 20 56 44 42 45 20  p over the VDBE 
1ce00 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
1ce10 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 70  elow. */.      p
1ce20 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71  Index->tnum = sq
1ce30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
1ce40 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20  v, OP_Noop);.   
1ce50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ce60 64 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74  dOp3(v, OP_Creat
1ce70 65 42 74 72 65 65 2c 20 69 44 62 2c 20 69 4d 65  eBtree, iDb, iMe
1ce80 6d 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59  m, BTREE_BLOBKEY
1ce90 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 61 74  );..      /* Gat
1cea0 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  her the complete
1ceb0 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
1cec0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
1ced0 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a  ent into.      *
1cee0 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69  * the zStmt vari
1cef0 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20  able.      */.  
1cf00 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29      if( pStart )
1cf10 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  {.        int n 
1cf20 3d 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e  = (int)(pParse->
1cf30 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70  sLastToken.z - p
1cf40 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73  Name->z) + pPars
1cf50 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b  e->sLastToken.n;
1cf60 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 61  .        if( pNa
1cf70 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20  me->z[n-1]==';' 
1cf80 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 2f  ) n--;.        /
1cf90 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  * A named index 
1cfa0 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74  with an explicit
1cfb0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
1cfc0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20  atement */.     
1cfd0 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
1cfe0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43  e3MPrintf(db, "C
1cff0 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e  REATE%s INDEX %.
1d000 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  *s",.           
1d010 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e   onError==OE_Non
1d020 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55  e ? "" : " UNIQU
1d030 45 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29  E", n, pName->z)
1d040 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1d050 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74         /* An aut
1d060 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72 65  omatic index cre
1d070 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41 52  ated by a PRIMAR
1d080 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
1d090 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
1d0a0 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d        /* zStmt =
1d0b0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1d0c0 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20  ""); */.        
1d0d0 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  zStmt = 0;.     
1d0e0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 64 64   }..      /* Add
1d0f0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c   an entry in sql
1d100 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74  ite_master for t
1d110 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 20 20  his index.      
1d120 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1d130 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
1d140 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
1d150 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25  INSERT INTO %Q.%
1d160 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27  s VALUES('index'
1d170 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22  ,%Q,%Q,#%d,%Q);"
1d180 2c 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ,.          db->
1d190 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
1d1a0 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a  e, MASTER_NAME,.
1d1b0 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78            pIndex
1d1c0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
1d1d0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a     pTab->zName,.
1d1e0 20 20 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a            iMem,.
1d1f0 20 20 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a            zStmt.
1d200 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
1d210 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1d220 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20  (db, zStmt);..  
1d230 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20      /* Fill the 
1d240 69 6e 64 65 78 20 77 69 74 68 20 64 61 74 61 20  index with data 
1d250 61 6e 64 20 72 65 70 61 72 73 65 20 74 68 65 20  and reparse the 
1d260 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20  schema. Code an 
1d270 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20 20 20  OP_Expire.      
1d280 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ** to invalidate
1d290 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65   all pre-compile
1d2a0 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
1d2b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1d2c0 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20   pTblName ){.   
1d2d0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
1d2e0 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
1d2f0 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20  pIndex, iMem);. 
1d300 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68         sqlite3Ch
1d310 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
1d320 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  e, iDb);.       
1d330 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
1d340 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20  arseSchemaOp(v, 
1d350 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
1d360 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1d370 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20 41  db, "name='%q' A
1d380 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22  ND type='index'"
1d390 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  , pIndex->zName)
1d3a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1d3b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d3c0 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c 20 31 29  OP_Expire, 0, 1)
1d3d0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1d3e0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1d3f0 48 65 72 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e  Here(v, pIndex->
1d400 74 6e 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  tnum);.    }.  }
1d410 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69  ..  /* When addi
1d420 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74  ng an index to t
1d430 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63  he list of indic
1d440 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20  es for a table, 
1d450 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61  make.  ** sure a
1d460 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c  ll indices label
1d470 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f  ed OE_Replace co
1d480 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f  me after all tho
1d490 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20  se labeled.  ** 
1d4a0 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73  OE_Ignore.  This
1d4b0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
1d4c0 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f  r the correct co
1d4d0 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a 20  nstraint check. 
1d4e0 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 28   ** processing (
1d4f0 69 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  in sqlite3Genera
1d500 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63  teConstraintChec
1d510 6b 73 28 29 29 20 61 73 20 70 61 72 74 20 6f 66  ks()) as part of
1d520 0a 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e 64  .  ** UPDATE and
1d530 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
1d540 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28  ts.  .  */.  if(
1d550 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c   db->init.busy |
1d560 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b  | pTblName==0 ){
1d570 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72  .    if( onError
1d580 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20  !=OE_Replace || 
1d590 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a  pTab->pIndex==0.
1d5a0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62           || pTab
1d5b0 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ->pIndex->onErro
1d5c0 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a  r==OE_Replace){.
1d5d0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
1d5e0 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  ext = pTab->pInd
1d5f0 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  ex;.      pTab->
1d600 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b  pIndex = pIndex;
1d610 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d620 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20    Index *pOther 
1d630 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
1d640 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74        while( pOt
1d650 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f  her->pNext && pO
1d660 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45  ther->pNext->onE
1d670 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
1d680 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68   ){.        pOth
1d690 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  er = pOther->pNe
1d6a0 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
1d6b0 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
1d6c0 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
1d6d0 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70  .      pOther->p
1d6e0 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20  Next = pIndex;. 
1d6f0 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20     }.    pIndex 
1d700 3d 20 30 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20  = 0;.  }.  else 
1d710 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
1d720 4a 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65  JECT ){.    asse
1d730 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  rt( pParse->pNew
1d740 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20  Index==0 );.    
1d750 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65  pParse->pNewInde
1d760 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  x = pIndex;.    
1d770 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  pIndex = 0;.  }.
1d780 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62  .  /* Clean up b
1d790 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
1d7a0 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64  .exit_create_ind
1d7b0 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  ex:.  if( pIndex
1d7c0 20 29 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e   ) sqlite3FreeIn
1d7d0 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
1d7e0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
1d7f0 6c 65 74 65 28 64 62 2c 20 70 50 49 57 68 65 72  lete(db, pPIWher
1d800 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
1d810 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
1d820 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  pList);.  sqlite
1d830 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
1d840 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  b, pTblName);.  
1d850 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1d860 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , zName);.}../*.
1d870 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65  ** Fill the Inde
1d880 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72  x.aiRowEst[] arr
1d890 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20  ay with default 
1d8a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e  information - in
1d8b0 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20  formation.** to 
1d8c0 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20  be used when we 
1d8d0 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65  have not run the
1d8e0 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64   ANALYZE command
1d8f0 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74  ..**.** aiRowEst
1d900 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 64 20  [0] is supposed 
1d910 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
1d920 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
1d930 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  s in the index..
1d940 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e  ** Since we do n
1d950 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31  ot know, guess 1
1d960 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77   million.  aiRow
1d970 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74  Est[1] is an est
1d980 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  imate of the.** 
1d990 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
1d9a0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
1d9b0 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69   match any parti
1d9c0 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74  cular value of t
1d9d0 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75  he.** first colu
1d9e0 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  mn of the index.
1d9f0 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73    aiRowEst[2] is
1da00 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
1da10 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
1da20 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68   rows that match
1da30 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
1da40 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74  combination of t
1da50 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d  he first 2 colum
1da60 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64  ns.** of the ind
1da70 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74  ex.  And so fort
1da80 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61  h.  It must alwa
1da90 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ys be the case t
1daa0 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  hat.*.**        
1dab0 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d     aiRowEst[N]<=
1dac0 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a  aiRowEst[N-1].**
1dad0 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77             aiRow
1dae0 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20  Est[N]>=1.**.** 
1daf0 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c  Apart from that,
1db00 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20   we have little 
1db10 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73  to go on besides
1db20 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f   intuition as to
1db30 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74  .** how aiRowEst
1db40 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69  [] should be ini
1db50 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e  tialized.  The n
1db60 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64  umbers generated
1db70 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73   here.** are bas
1db80 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61  ed on typical va
1db90 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63  lues found in ac
1dba0 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f  tual indices..*/
1dbb0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
1dbc0 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78  aultRowEst(Index
1dbd0 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20   *pIdx){.  /*   
1dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 31 30 2c               10,
1dbf0 20 20 39 2c 20 20 38 2c 20 20 37 2c 20 20 36 20    9,  8,  7,  6 
1dc00 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56 61 6c  */.  LogEst aVal
1dc10 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33  [] = { 33, 32, 3
1dc20 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c  0, 28, 26 };.  L
1dc30 6f 67 45 73 74 20 2a 61 20 3d 20 70 49 64 78 2d  ogEst *a = pIdx-
1dc40 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20  >aiRowLogEst;.  
1dc50 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28  int nCopy = MIN(
1dc60 41 72 72 61 79 53 69 7a 65 28 61 56 61 6c 29 2c  ArraySize(aVal),
1dc70 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b   pIdx->nKeyCol);
1dc80 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
1dc90 49 6e 64 65 78 65 73 20 77 69 74 68 20 64 65 66  Indexes with def
1dca0 61 75 6c 74 20 72 6f 77 20 65 73 74 69 6d 61 74  ault row estimat
1dcb0 65 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61  es should not ha
1dcc0 76 65 20 73 74 61 74 31 20 64 61 74 61 20 2a 2f  ve stat1 data */
1dcd0 0a 20 20 61 73 73 65 72 74 28 20 21 70 49 64 78  .  assert( !pIdx
1dce0 2d 3e 68 61 73 53 74 61 74 31 20 29 3b 0a 0a 20  ->hasStat1 );.. 
1dcf0 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72 73   /* Set the firs
1dd00 74 20 65 6e 74 72 79 20 28 6e 75 6d 62 65 72 20  t entry (number 
1dd10 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69  of rows in the i
1dd20 6e 64 65 78 29 20 74 6f 20 74 68 65 20 65 73 74  ndex) to the est
1dd30 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e 75 6d  imated .  ** num
1dd40 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1dd50 68 65 20 74 61 62 6c 65 2c 20 6f 72 20 68 61 6c  he table, or hal
1dd60 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
1dd70 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
1dd80 65 0a 20 20 2a 2a 20 66 6f 72 20 61 20 70 61 72  e.  ** for a par
1dd90 74 69 61 6c 20 69 6e 64 65 78 2e 20 20 20 42 75  tial index.   Bu
1dda0 74 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65  t do not let the
1ddb0 20 65 73 74 69 6d 61 74 65 20 64 72 6f 70 20 62   estimate drop b
1ddc0 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a 20 20 61 5b  elow 10. */.  a[
1ddd0 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  0] = pIdx->pTabl
1dde0 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  e->nRowLogEst;. 
1ddf0 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74   if( pIdx->pPart
1de00 49 64 78 57 68 65 72 65 21 3d 30 20 29 20 61 5b  IdxWhere!=0 ) a[
1de10 30 5d 20 2d 3d 20 31 30 3b 20 20 61 73 73 65 72  0] -= 10;  asser
1de20 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 10==sqlite3Lo
1de30 67 45 73 74 28 32 29 20 29 3b 0a 20 20 69 66 28  gEst(2) );.  if(
1de40 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20   a[0]<33 ) a[0] 
1de50 3d 20 33 33 3b 20 20 20 20 20 20 20 20 20 20 20  = 33;           
1de60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 33         assert( 3
1de70 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
1de80 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 73  (10) );..  /* Es
1de90 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b 31 5d  timate that a[1]
1dea0 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69 73 20   is 10, a[2] is 
1deb0 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20 61 5b  9, a[3] is 8, a[
1dec0 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20 69 73  4] is 7, a[5] is
1ded0 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61 63 68  .  ** 6 and each
1dee0 20 73 75 62 73 65 71 75 65 6e 74 20 76 61 6c 75   subsequent valu
1def0 65 20 28 69 66 20 61 6e 79 29 20 69 73 20 35 2e  e (if any) is 5.
1df00 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 61    */.  memcpy(&a
1df10 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70 79  [1], aVal, nCopy
1df20 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 29  *sizeof(LogEst))
1df30 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79 2b  ;.  for(i=nCopy+
1df40 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79  1; i<=pIdx->nKey
1df50 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  Col; i++){.    a
1df60 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20 20 20  [i] = 23;       
1df70 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
1df80 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74 65 33  ert( 23==sqlite3
1df90 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20 20 7d  LogEst(5) );.  }
1dfa0 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73  ..  assert( 0==s
1dfb0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20  qlite3LogEst(1) 
1dfc0 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75  );.  if( IsUniqu
1dfd0 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 61  eIndex(pIdx) ) a
1dfe0 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20  [pIdx->nKeyCol] 
1dff0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
1e000 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
1e010 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67  drop an existing
1e020 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54   named index.  T
1e030 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
1e040 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52  mplements the DR
1e050 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  OP INDEX stateme
1e060 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
1e070 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72  te3DropIndex(Par
1e080 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
1e090 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ist *pName, int 
1e0a0 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64  ifExists){.  Ind
1e0b0 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64  ex *pIndex;.  Vd
1e0c0 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
1e0d0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1e0e0 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
1e0f0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1e100 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a  >nErr==0 );   /*
1e110 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   Never called wi
1e120 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20  th prior errors 
1e130 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
1e140 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1e150 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1e160 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73  index;.  }.  ass
1e170 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
1e180 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ==1 );.  if( SQL
1e190 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
1e1a0 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
1e1b0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
1e1c0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1e1d0 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
1e1e0 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
1e1f0 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  b, pName->a[0].z
1e200 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
1e210 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
1e220 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
1e230 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73  .    if( !ifExis
1e240 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts ){.      sqli
1e250 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1e260 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
1e270 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20  ex: %S", pName, 
1e280 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
1e290 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
1e2a0 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d  VerifyNamedSchem
1e2b0 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d  a(pParse, pName-
1e2c0 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
1e2d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
1e2e0 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
1e2f0 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  = 1;.    goto ex
1e300 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1e310 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d   }.  if( pIndex-
1e320 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45  >idxType!=SQLITE
1e330 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20  _IDXTYPE_APPDEF 
1e340 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1e350 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1e360 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
1e370 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20   with UNIQUE ". 
1e380 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59       "or PRIMARY
1e390 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
1e3a0 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  cannot be droppe
1e3b0 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f  d", 0);.    goto
1e3c0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1e3d0 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
1e3e0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
1e3f0 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70  ex(db, pIndex->p
1e400 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66  Schema);.#ifndef
1e410 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1e420 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
1e430 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51     int code = SQ
1e440 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b  LITE_DROP_INDEX;
1e450 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
1e460 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
1e470 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
1e480 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
1e490 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  [iDb].zDbSName;.
1e4a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1e4b0 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
1e4c0 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66  BLE(iDb);.    if
1e4d0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1e4e0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1e4f0 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20  E_DELETE, zTab, 
1e500 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
1e510 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1e520 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
1e530 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
1e540 42 20 26 26 20 69 44 62 20 29 20 63 6f 64 65 20  B && iDb ) code 
1e550 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
1e560 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
1e570 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1e580 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
1e590 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
1e5a0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
1e5b0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
1e5c0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1e5d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1e5e0 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
1e5f0 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
1e600 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72  the index and fr
1e610 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
1e620 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ble */.  v = sql
1e630 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1e640 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
1e650 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
1e660 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
1e670 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
1e680 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
1e690 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
1e6a0 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
1e6b0 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e  OM %Q.%s WHERE n
1e6c0 61 6d 65 3d 25 51 20 41 4e 44 20 74 79 70 65 3d  ame=%Q AND type=
1e6d0 27 69 6e 64 65 78 27 22 2c 0a 20 20 20 20 20 20  'index'",.      
1e6e0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
1e6f0 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e  bSName, MASTER_N
1e700 41 4d 45 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  AME, pIndex->zNa
1e710 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  me.    );.    sq
1e720 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61  lite3ClearStatTa
1e730 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62  bles(pParse, iDb
1e740 2c 20 22 69 64 78 22 2c 20 70 49 6e 64 65 78 2d  , "idx", pIndex-
1e750 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
1e760 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
1e770 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
1e780 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61     destroyRootPa
1e790 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ge(pParse, pInde
1e7a0 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
1e7b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e7c0 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49  dOp4(v, OP_DropI
1e7d0 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c  ndex, iDb, 0, 0,
1e7e0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
1e7f0 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72  0);.  }..exit_dr
1e800 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69  op_index:.  sqli
1e810 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1e820 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, pName);.}..
1e830 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20  /*.** pArray is 
1e840 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
1e850 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73  array of objects
1e860 2e 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e  . Each object in
1e870 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73   the.** array is
1e880 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69   szEntry bytes i
1e890 6e 20 73 69 7a 65 2e 20 54 68 69 73 20 72 6f 75  n size. This rou
1e8a0 74 69 6e 65 20 75 73 65 73 20 73 71 6c 69 74 65  tine uses sqlite
1e8b0 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20  3DbRealloc().** 
1e8c0 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 61 72  to extend the ar
1e8d0 72 61 79 20 73 6f 20 74 68 61 74 20 74 68 65 72  ray so that ther
1e8e0 65 20 69 73 20 73 70 61 63 65 20 66 6f 72 20 61  e is space for a
1e8f0 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 74 20 74   new object at t
1e900 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68  he end..**.** Wh
1e910 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1e920 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45   is called, *pnE
1e930 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 74 68  ntry contains th
1e940 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
1e950 66 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20 28  f.** the array (
1e960 69 6e 20 65 6e 74 72 69 65 73 20 2d 20 73 6f 20  in entries - so 
1e970 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  the allocation i
1e980 73 20 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20  s ((*pnEntry) * 
1e990 73 7a 45 6e 74 72 79 29 20 62 79 74 65 73 0a 2a  szEntry) bytes.*
1e9a0 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a  * in total)..**.
1e9b0 2a 2a 20 49 66 20 74 68 65 20 72 65 61 6c 6c 6f  ** If the reallo
1e9c0 63 28 29 20 69 73 20 73 75 63 63 65 73 73 66 75  c() is successfu
1e9d0 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f  l (i.e. if no OO
1e9e0 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75  M condition occu
1e9f0 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63  rs), the.** spac
1ea00 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
1ea10 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69  the new object i
1ea20 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74  s zeroed, *pnEnt
1ea30 72 79 20 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a  ry updated to.**
1ea40 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77   reflect the new
1ea50 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
1ea60 61 79 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  ay and a pointer
1ea70 20 74 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f   to the new allo
1ea80 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e  cation.** return
1ea90 65 64 2e 20 2a 70 49 64 78 20 69 73 20 73 65 74  ed. *pIdx is set
1eaa0 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
1eab0 20 74 68 65 20 6e 65 77 20 61 72 72 61 79 20 65   the new array e
1eac0 6e 74 72 79 20 69 6e 20 74 68 69 73 20 63 61 73  ntry in this cas
1ead0 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  e..**.** Otherwi
1eae0 73 65 2c 20 69 66 20 74 68 65 20 72 65 61 6c 6c  se, if the reall
1eaf0 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a 70 49 64  oc() fails, *pId
1eb00 78 20 69 73 20 73 65 74 20 74 6f 20 2d 31 2c 20  x is set to -1, 
1eb10 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e 73  *pnEntry remains
1eb20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  .** unchanged an
1eb30 64 20 61 20 63 6f 70 79 20 6f 66 20 70 41 72 72  d a copy of pArr
1eb40 61 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ay returned..*/.
1eb50 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72  void *sqlite3Arr
1eb60 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71  ayAllocate(.  sq
1eb70 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1eb80 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  /* Connection to
1eb90 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f   notify of mallo
1eba0 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20  c failures */.  
1ebb0 76 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20  void *pArray,   
1ebc0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62    /* Array of ob
1ebd0 6a 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65  jects.  Might be
1ebe0 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a   reallocated */.
1ebf0 20 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20    int szEntry,  
1ec00 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65      /* Size of e
1ec10 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  ach object in th
1ec20 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  e array */.  int
1ec30 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f   *pnEntry,     /
1ec40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65  * Number of obje
1ec50 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  cts currently in
1ec60 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   use */.  int *p
1ec70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57  Idx         /* W
1ec80 72 69 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f  rite the index o
1ec90 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72  f a new slot her
1eca0 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  e */.){.  char *
1ecb0 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 2a 70 6e  z;.  int n = *pn
1ecc0 45 6e 74 72 79 3b 0a 20 20 69 66 28 20 28 6e 20  Entry;.  if( (n 
1ecd0 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a 20  & (n-1))==0 ){. 
1ece0 20 20 20 69 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d     int sz = (n==
1ecf0 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20 20  0) ? 1 : 2*n;.  
1ed00 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 73    void *pNew = s
1ed10 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
1ed20 64 62 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a 73  db, pArray, sz*s
1ed30 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28  zEntry);.    if(
1ed40 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
1ed50 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20    *pIdx = -1;.  
1ed60 20 20 20 20 72 65 74 75 72 6e 20 70 41 72 72 61      return pArra
1ed70 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72  y;.    }.    pAr
1ed80 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ray = pNew;.  }.
1ed90 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72    z = (char*)pAr
1eda0 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a  ray;.  memset(&z
1edb0 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30  [n * szEntry], 0
1edc0 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70  , szEntry);.  *p
1edd0 49 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e  Idx = n;.  ++*pn
1ede0 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20  Entry;.  return 
1edf0 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pArray;.}../*.**
1ee00 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
1ee10 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
1ee20 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
1ee30 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
1ee40 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
1ee50 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
1ee60 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
1ee70 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
1ee80 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
1ee90 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
1eea0 73 74 41 70 70 65 6e 64 28 50 61 72 73 65 20 2a  stAppend(Parse *
1eeb0 70 50 61 72 73 65 2c 20 49 64 4c 69 73 74 20 2a  pParse, IdList *
1eec0 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
1eed0 6f 6b 65 6e 29 7b 0a 20 20 73 71 6c 69 74 65 33  oken){.  sqlite3
1eee0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1eef0 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  b;.  int i;.  if
1ef00 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
1ef10 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1ef20 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
1ef30 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29  , sizeof(IdList)
1ef40 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
1ef50 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
1ef60 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20  .  }.  pList->a 
1ef70 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
1ef80 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 64 62  locate(.      db
1ef90 2c 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  ,.      pList->a
1efa0 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  ,.      sizeof(p
1efb0 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20  List->a[0]),.   
1efc0 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a     &pList->nId,.
1efd0 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
1efe0 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73  if( i<0 ){.    s
1eff0 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1f000 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
1f010 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1f020 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  .  pList->a[i].z
1f030 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1f040 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1f050 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 49  pToken);.  if( I
1f060 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
1f070 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  && pList->a[i].z
1f080 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Name ){.    sqli
1f090 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61  te3RenameTokenMa
1f0a0 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a  p(pParse, (void*
1f0b0 29 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  )pList->a[i].zNa
1f0c0 6d 65 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d  me, pToken);.  }
1f0d0 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
1f0e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
1f0f0 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76   an IdList..*/.v
1f100 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73  oid sqlite3IdLis
1f110 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
1f120 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69  *db, IdList *pLi
1f130 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
1f140 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1f150 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
1f160 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
1f170 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1f180 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
1f190 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
1f1a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
1f1b0 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
1f1c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1f1d0 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b  eeNN(db, pList);
1f1e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1f1f0 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c   the index in pL
1f200 69 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74  ist of the ident
1f210 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e  ifier named zId.
1f220 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69    Return -1.** i
1f230 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
1f240 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73  int sqlite3IdLis
1f250 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70  tIndex(IdList *p
1f260 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  List, const char
1f270 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
1f280 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1f290 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  0 ) return -1;. 
1f2a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1f2b0 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
1f2c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1f2d0 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
1f2e0 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
1f2f0 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
1f300 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
1f310 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74  ../*.** Expand t
1f320 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  he space allocat
1f330 65 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ed for the given
1f340 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20   SrcList object 
1f350 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e  by.** creating n
1f360 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20  Extra new slots 
1f370 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74  beginning at iSt
1f380 61 72 74 2e 20 20 69 53 74 61 72 74 20 69 73 20  art.  iStart is 
1f390 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e  zero based..** N
1f3a0 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72  ew slots are zer
1f3b0 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  oed..**.** For e
1f3c0 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20  xample, suppose 
1f3d0 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61  a SrcList initia
1f3e0 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f  lly contains two
1f3f0 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a   entries: A,B..*
1f400 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65  * To append 3 ne
1f410 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74  w entries onto t
1f420 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a  he end, do this:
1f430 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65  .**.**    sqlite
1f440 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
1f450 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c  db, pSrclist, 3,
1f460 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72   2);.**.** After
1f470 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20   the call above 
1f480 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  it would contain
1f490 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69  :  A, B, nil, ni
1f4a0 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68  l, nil..** If th
1f4b0 65 20 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e  e iStart argumen
1f4c0 74 20 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73  t had been 1 ins
1f4d0 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20  tead of 2, then 
1f4e0 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f  the result.** wo
1f4f0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20  uld have been:  
1f500 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c  A, nil, nil, nil
1f510 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64  , B.  To prepend
1f520 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a   the new slots,.
1f530 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20 76 61  ** the iStart va
1f540 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20  lue would be 0. 
1f550 20 54 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e   The result then
1f560 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69   would.** be: ni
1f570 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20  l, nil, nil, A, 
1f580 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  B..**.** If a me
1f590 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
1f5a0 66 61 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73  fails the SrcLis
1f5b0 74 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20  t is unchanged. 
1f5c0 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c   The.** db->mall
1f5d0 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69  ocFailed flag wi
1f5e0 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 72 75  ll be set to tru
1f5f0 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  e..*/.SrcList *s
1f600 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
1f610 61 72 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20  arge(.  sqlite3 
1f620 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61  *db,       /* Da
1f630 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1f640 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f  n to notify of O
1f650 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53  OM errors */.  S
1f660 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
1f670 20 20 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74    /* The SrcList
1f680 20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20   to be enlarged 
1f690 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
1f6a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f6b0 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74  r of new slots t
1f6c0 6f 20 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61  o add to pSrc->a
1f6d0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  [] */.  int iSta
1f6e0 72 74 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  rt         /* In
1f6f0 64 65 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d  dex in pSrc->a[]
1f700 20 6f 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c   of first new sl
1f710 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ot */.){.  int i
1f720 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
1f730 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69  hecking on calli
1f740 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ng parameters */
1f750 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
1f760 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=0 );.  assert
1f770 28 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20  ( nExtra>=1 );. 
1f780 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30   assert( pSrc!=0
1f790 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
1f7a0 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63  tart<=pSrc->nSrc
1f7b0 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
1f7c0 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70  te additional sp
1f7d0 61 63 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ace if needed */
1f7e0 0a 20 20 69 66 28 20 28 75 33 32 29 70 53 72 63  .  if( (u32)pSrc
1f7f0 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53  ->nSrc+nExtra>pS
1f800 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  rc->nAlloc ){.  
1f810 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
1f820 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20  .    int nAlloc 
1f830 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2a 32 2b 6e  = pSrc->nSrc*2+n
1f840 45 78 74 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e  Extra;.    int n
1f850 47 6f 74 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  Got;.    pNew = 
1f860 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1f870 28 64 62 2c 20 70 53 72 63 2c 0a 20 20 20 20 20  (db, pSrc,.     
1f880 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
1f890 28 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f  (*pSrc) + (nAllo
1f8a0 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53 72 63  c-1)*sizeof(pSrc
1f8b0 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  ->a[0]) );.    i
1f8c0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1f8d0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
1f8e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1f8f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 53 72        return pSr
1f900 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  c;.    }.    pSr
1f910 63 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47  c = pNew;.    nG
1f920 6f 74 20 3d 20 28 73 71 6c 69 74 65 33 44 62 4d  ot = (sqlite3DbM
1f930 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e  allocSize(db, pN
1f940 65 77 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53  ew) - sizeof(*pS
1f950 72 63 29 29 2f 73 69 7a 65 6f 66 28 70 53 72 63  rc))/sizeof(pSrc
1f960 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70  ->a[0])+1;.    p
1f970 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 47  Src->nAlloc = nG
1f980 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f  ot;.  }..  /* Mo
1f990 76 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74  ve existing slot
1f9a0 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65  s that come afte
1f9b0 72 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65  r the newly inse
1f9c0 72 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20  rted slots.  ** 
1f9d0 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a  out of the way *
1f9e0 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e  /.  for(i=pSrc->
1f9f0 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72  nSrc-1; i>=iStar
1fa00 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72  t; i--){.    pSr
1fa10 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d  c->a[i+nExtra] =
1fa20 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d   pSrc->a[i];.  }
1fa30 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d  .  pSrc->nSrc +=
1fa40 20 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a   nExtra;..  /* Z
1fa50 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c  ero the newly al
1fa60 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f  located slots */
1fa70 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d  .  memset(&pSrc-
1fa80 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73  >a[iStart], 0, s
1fa90 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d  izeof(pSrc->a[0]
1faa0 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72  )*nExtra);.  for
1fab0 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74  (i=iStart; i<iSt
1fac0 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29  art+nExtra; i++)
1fad0 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d  {.    pSrc->a[i]
1fae0 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  .iCursor = -1;. 
1faf0 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20   }..  /* Return 
1fb00 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1fb10 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73   enlarged SrcLis
1fb20 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53  t */.  return pS
1fb30 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70  rc;.}.../*.** Ap
1fb40 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65  pend a new table
1fb50 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76   name to the giv
1fb60 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65  en SrcList.  Cre
1fb70 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73  ate a new SrcLis
1fb80 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
1fb90 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
1fba0 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
1fbb0 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20  SrcList even if 
1fbc0 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a  pTable is NULL..
1fbd0 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20  **.** A SrcList 
1fbe0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
1fbf0 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73  NULL if there is
1fc00 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
1fc10 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  The returned.** 
1fc20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 62 65  SrcList might be
1fc30 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
1fc40 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 77 61   SrcList that wa
1fc50 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20 6d 69  s input or it mi
1fc60 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20  ght be.** a new 
1fc70 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20  one.  If an OOM 
1fc80 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
1fc90 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72 69 6f  s, then the prio
1fca0 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69 73 74  r value of pList
1fcb0 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 70 75  .** that is inpu
1fcc0 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  t to this routin
1fcd0 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  e is automatical
1fce0 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ly freed..**.** 
1fcf0 49 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20  If pDatabase is 
1fd00 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61  not null, it mea
1fd10 6e 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  ns that the tabl
1fd20 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61  e has an optiona
1fd30 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61  l.** database na
1fd40 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65  me prefix.  Like
1fd50 20 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73   this:  "databas
1fd60 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70  e.table".  The p
1fd70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e  Database.** poin
1fd80 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ts to the table 
1fd90 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61  name and the pTa
1fda0 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ble points to th
1fdb0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
1fdc0 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e  .** The SrcList.
1fdd0 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20  a[].zName field 
1fde0 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
1fdf0 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68  he table name wh
1fe00 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d  ich might.** com
1fe10 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69  e from pTable (i
1fe20 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e  f pDatabase is N
1fe30 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61  ULL) or from pDa
1fe40 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63  tabase.  .** Src
1fe50 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61  List.a[].zDataba
1fe60 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  se is filled wit
1fe70 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  h the database n
1fe80 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c  ame from pTable,
1fe90 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c  .** or with NULL
1fea0 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20   if no database 
1feb0 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  is specified..**
1fec0 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
1fed0 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65  ds, if call like
1fee0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1fef0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
1ff00 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c  istAppend(D,A,B,
1ff10 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42  0);.**.** Then B
1ff20 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   is a table name
1ff30 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
1ff40 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63  e name is unspec
1ff50 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65  ified.  If calle
1ff60 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a  d.** like this:.
1ff70 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
1ff80 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1ff90 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a  nd(D,A,B,C);.**.
1ffa0 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68 65  ** Then C is the
1ffb0 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
1ffc0 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73  B is the databas
1ffd0 65 20 6e 61 6d 65 2e 20 20 49 66 20 43 20 69 73  e name.  If C is
1ffe0 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e   defined.** then
1fff0 20 73 6f 20 69 73 20 42 2e 20 20 49 6e 20 6f 74   so is B.  In ot
20000 68 65 72 20 77 6f 72 64 73 2c 20 77 65 20 6e 65  her words, we ne
20010 76 65 72 20 68 61 76 65 20 61 20 63 61 73 65 20  ver have a case 
20020 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  where:.**.**    
20030 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
20040 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c  istAppend(D,A,0,
20050 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70  C);.**.** Both p
20060 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62  Table and pDatab
20070 61 73 65 20 61 72 65 20 61 73 73 75 6d 65 64 20  ase are assumed 
20080 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20 20 54  to be quoted.  T
20090 68 65 79 20 61 72 65 20 64 65 71 75 6f 74 65 64  hey are dequoted
200a0 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65 69 6e 67  .** before being
200b0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 53 72   added to the Sr
200c0 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73  cList..*/.SrcLis
200d0 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
200e0 74 41 70 70 65 6e 64 28 0a 20 20 73 71 6c 69 74  tAppend(.  sqlit
200f0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f  e3 *db,        /
20100 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * Connection to 
20110 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63  notify of malloc
20120 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53   failures */.  S
20130 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  rcList *pList,  
20140 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20     /* Append to 
20150 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55  this SrcList. NU
20160 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  LL creates a new
20170 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f   SrcList */.  To
20180 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20  ken *pTable,    
20190 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70    /* Table to ap
201a0 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  pend */.  Token 
201b0 2a 70 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a  *pDatabase    /*
201c0 20 44 61 74 61 62 61 73 65 20 6f 66 20 74 68 65   Database of the
201d0 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73   table */.){.  s
201e0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
201f0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73  em *pItem;.  ass
20200 65 72 74 28 20 70 44 61 74 61 62 61 73 65 3d 3d  ert( pDatabase==
20210 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20 29  0 || pTable!=0 )
20220 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76  ;  /* Cannot hav
20230 65 20 43 20 77 69 74 68 6f 75 74 20 42 20 2a 2f  e C without B */
20240 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
20250 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   );.  if( pList=
20260 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
20270 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
20280 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
20290 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20  f(SrcList) );.  
202a0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
202b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
202c0 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31  List->nAlloc = 1
202d0 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 53 72  ;.    pList->nSr
202e0 63 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65  c = 1;.    memse
202f0 74 28 26 70 4c 69 73 74 2d 3e 61 5b 30 5d 2c 20  t(&pList->a[0], 
20300 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  0, sizeof(pList-
20310 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 70 4c 69  >a[0]));.    pLi
20320 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
20330 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
20340 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
20350 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
20360 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20  e(db, pList, 1, 
20370 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20  pList->nSrc);.  
20380 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  }.  if( db->mall
20390 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
203a0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
203b0 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
203c0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
203d0 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c   }.  pItem = &pL
203e0 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
203f0 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61  rc-1];.  if( pDa
20400 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62  tabase && pDatab
20410 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  ase->z==0 ){.   
20420 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a   pDatabase = 0;.
20430 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62    }.  if( pDatab
20440 61 73 65 20 29 7b 0a 20 20 20 20 70 49 74 65 6d  ase ){.    pItem
20450 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
20460 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
20470 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20  b, pDatabase);. 
20480 20 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62     pItem->zDatab
20490 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ase = sqlite3Nam
204a0 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
204b0 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  Table);.  }else{
204c0 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
204d0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
204e0 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61  romToken(db, pTa
204f0 62 6c 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  ble);.    pItem-
20500 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a  >zDatabase = 0;.
20510 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69    }.  return pLi
20520 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  st;.}../*.** Ass
20530 69 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20 69  ign VdbeCursor i
20540 6e 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f 20  ndex numbers to 
20550 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20  all tables in a 
20560 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20  SrcList.*/.void 
20570 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
20580 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73  signCursors(Pars
20590 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
205a0 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
205b0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72  t i;.  struct Sr
205c0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
205d0 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73  m;.  assert(pLis
205e0 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  t || pParse->db-
205f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
20600 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
20610 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
20620 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
20630 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
20640 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
20650 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72   if( pItem->iCur
20660 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a  sor>=0 ) break;.
20670 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75        pItem->iCu
20680 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
20690 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Tab++;.      if(
206a0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
206b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
206c0 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
206d0 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
206e0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Item->pSelect->p
206f0 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Src);.      }.  
20700 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
20710 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
20720 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64  e SrcList includ
20730 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73  ing all its subs
20740 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
20750 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
20760 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
20770 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  db, SrcList *pLi
20780 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
20790 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
207a0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66  tem *pItem;.  if
207b0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
207c0 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  urn;.  for(pItem
207d0 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
207e0 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  i<pList->nSrc; i
207f0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
20800 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
20810 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  db, pItem->zData
20820 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  base);.    sqlit
20830 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
20840 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
20850 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
20860 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  , pItem->zAlias)
20870 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ;.    if( pItem-
20880 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20  >fg.isIndexedBy 
20890 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
208a0 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49  db, pItem->u1.zI
208b0 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 69  ndexedBy);.    i
208c0 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54  f( pItem->fg.isT
208d0 61 62 46 75 6e 63 20 29 20 73 71 6c 69 74 65 33  abFunc ) sqlite3
208e0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
208f0 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75  b, pItem->u1.pFu
20900 6e 63 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69  ncArg);.    sqli
20910 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
20920 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b  b, pItem->pTab);
20930 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
20940 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  ctDelete(db, pIt
20950 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  em->pSelect);.  
20960 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
20970 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
20980 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  On);.    sqlite3
20990 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
209a0 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b   pItem->pUsing);
209b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
209c0 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74  FreeNN(db, pList
209d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
209e0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
209f0 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
20a00 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65   to add a new te
20a10 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  rm to the.** end
20a20 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52   of a growing FR
20a30 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  OM clause.  The 
20a40 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
20a50 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20   the part of.** 
20a60 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
20a70 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79  that has already
20a80 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65   been constructe
20a90 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a  d.  "p" is NULL.
20aa0 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ** if this is th
20ab0 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20  e first term of 
20ac0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
20ad0 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61    pTable and pDa
20ae0 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68  tabase.** are th
20af0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
20b00 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73 65  ble and database
20b10 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
20b20 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a  OM clause term..
20b30 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69 73 20  ** pDatabase is 
20b40 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61  NULL if the data
20b50 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66  base name qualif
20b60 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d  ier is missing -
20b70 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61   the.** usual ca
20b80 73 65 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d  se.  If the term
20b90 20 68 61 73 20 61 6e 20 61 6c 69 61 73 2c 20 74   has an alias, t
20ba0 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74  hen pAlias point
20bb0 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61  s to the.** alia
20bc0 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65  s token.  If the
20bd0 20 74 65 72 6d 20 69 73 20 61 20 73 75 62 71 75   term is a subqu
20be0 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75  ery, then pSubqu
20bf0 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45  ery is the.** SE
20c00 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
20c10 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79  hat the subquery
20c20 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70   encodes.  The p
20c30 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61  Table and.** pDa
20c40 74 61 62 61 73 65 20 70 61 72 61 6d 65 74 65 72  tabase parameter
20c50 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73  s are NULL for s
20c60 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20  ubqueries.  The 
20c70 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a  pOn and pUsing.*
20c80 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  * parameters are
20c90 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
20ca0 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
20cb0 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
20cc0 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63  Return a new Src
20cd0 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64  List which encod
20ce0 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77  es is the FROM w
20cf0 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74  ith the new.** t
20d00 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72  erm added..*/.Sr
20d10 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
20d20 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
20d30 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
20d40 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
20d50 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
20d60 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
20d70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
20d80 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72 74 20  * The left part 
20d90 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
20da0 73 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20  se already seen 
20db0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
20dc0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
20dd0 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
20de0 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  e to add to the 
20df0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
20e00 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73   Token *pDatabas
20e10 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  e,       /* Name
20e20 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
20e30 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62   containing pTab
20e40 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
20e50 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20 20  Alias,          
20e60 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  /* The right-han
20e70 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 41 53  d side of the AS
20e80 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a   subexpression *
20e90 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
20ea0 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41  query,      /* A
20eb0 20 73 75 62 71 75 65 72 79 20 75 73 65 64 20 69   subquery used i
20ec0 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62  n place of a tab
20ed0 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70  le name */.  Exp
20ee0 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20  r *pOn,         
20ef0 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63       /* The ON c
20f00 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20  lause of a join 
20f10 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73  */.  IdList *pUs
20f20 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ing          /* 
20f30 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  The USING clause
20f40 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b   of a join */.){
20f50 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
20f60 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
20f70 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
20f80 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
20f90 20 21 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70   !p && (pOn || p
20fa0 55 73 69 6e 67 29 20 29 7b 0a 20 20 20 20 73 71  Using) ){.    sq
20fb0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
20fc0 61 72 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c  arse, "a JOIN cl
20fd0 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64  ause is required
20fe0 20 62 65 66 6f 72 65 20 25 73 22 2c 20 0a 20 20   before %s", .  
20ff0 20 20 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20      (pOn ? "ON" 
21000 3a 20 22 55 53 49 4e 47 22 29 0a 20 20 20 20 29  : "USING").    )
21010 3b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e  ;.    goto appen
21020 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20  d_from_error;.  
21030 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 53  }.  p = sqlite3S
21040 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c  rcListAppend(db,
21050 20 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74   p, pTable, pDat
21060 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  abase);.  if( p=
21070 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61  =0 ){.    goto a
21080 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
21090 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
210a0 70 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20 70  p->nSrc>0 );.  p
210b0 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
210c0 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72  nSrc-1];.  asser
210d0 74 28 20 28 70 54 61 62 6c 65 3d 3d 30 29 3d 3d  t( (pTable==0)==
210e0 28 70 44 61 74 61 62 61 73 65 3d 3d 30 29 20 29  (pDatabase==0) )
210f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
21100 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70  m->zName==0 || p
21110 44 61 74 61 62 61 73 65 21 3d 30 20 29 3b 0a 20  Database!=0 );. 
21120 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
21130 42 4a 45 43 54 20 26 26 20 70 49 74 65 6d 2d 3e  BJECT && pItem->
21140 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 54 6f 6b  zName ){.    Tok
21150 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 28 41 4c  en *pToken = (AL
21160 57 41 59 53 28 70 44 61 74 61 62 61 73 65 29 20  WAYS(pDatabase) 
21170 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 29  && pDatabase->z)
21180 20 3f 20 70 44 61 74 61 62 61 73 65 20 3a 20 70   ? pDatabase : p
21190 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74  Table;.    sqlit
211a0 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70  e3RenameTokenMap
211b0 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
211c0 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e 29 3b 0a  zName, pToken);.
211d0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 41    }.  assert( pA
211e0 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66 28  lias!=0 );.  if(
211f0 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20   pAlias->n ){.  
21200 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20    pItem->zAlias 
21210 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
21220 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61  mToken(db, pAlia
21230 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  s);.  }.  pItem-
21240 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71  >pSelect = pSubq
21250 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70  uery;.  pItem->p
21260 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65  On = pOn;.  pIte
21270 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69  m->pUsing = pUsi
21280 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  ng;.  return p;.
21290 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  . append_from_er
212a0 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20 70  ror:.  assert( p
212b0 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
212c0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
212d0 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64  On);.  sqlite3Id
212e0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
212f0 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  Using);.  sqlite
21300 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
21310 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20  , pSubquery);.  
21320 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
21330 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45  ** Add an INDEXE
21340 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45  D BY or NOT INDE
21350 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68  XED clause to th
21360 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
21370 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e  added .** elemen
21380 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d  t of the source-
21390 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
213a0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
213b0 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
213c0 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65  te3SrcListIndexe
213d0 64 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  dBy(Parse *pPars
213e0 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54  e, SrcList *p, T
213f0 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79  oken *pIndexedBy
21400 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ){.  assert( pIn
21410 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20 20  dexedBy!=0 );.  
21420 69 66 28 20 70 20 26 26 20 70 49 6e 64 65 78 65  if( p && pIndexe
21430 64 42 79 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  dBy->n>0 ){.    
21440 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
21450 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
21460 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 72 63 3e  assert( p->nSrc>
21470 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d  0 );.    pItem =
21480 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31   &p->a[p->nSrc-1
21490 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
214a0 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65  Item->fg.notInde
214b0 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  xed==0 );.    as
214c0 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e  sert( pItem->fg.
214d0 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29  isIndexedBy==0 )
214e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
214f0 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
21500 63 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  c==0 );.    if( 
21510 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31  pIndexedBy->n==1
21520 20 26 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d   && !pIndexedBy-
21530 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  >z ){.      /* A
21540 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63   "NOT INDEXED" c
21550 6c 61 75 73 65 20 77 61 73 20 73 75 70 70 6c 69  lause was suppli
21560 65 64 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20  ed. See parse.y 
21570 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72  .      ** constr
21580 75 63 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74  uct "indexed_opt
21590 22 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a  " for details. *
215a0 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66  /.      pItem->f
215b0 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31  g.notIndexed = 1
215c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
215d0 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e     pItem->u1.zIn
215e0 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65  dexedBy = sqlite
215f0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
21600 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65  Parse->db, pInde
21610 78 65 64 42 79 29 3b 0a 20 20 20 20 20 20 70 49  xedBy);.      pI
21620 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
21630 64 42 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  dBy = 1;.    }. 
21640 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
21650 74 68 65 20 6c 69 73 74 20 6f 66 20 66 75 6e 63  the list of func
21660 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74  tion arguments t
21670 6f 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 6e  o the SrcList en
21680 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62  try for a.** tab
21690 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74 69  le-valued-functi
216a0 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
216b0 74 65 33 53 72 63 4c 69 73 74 46 75 6e 63 41 72  te3SrcListFuncAr
216c0 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  gs(Parse *pParse
216d0 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 45 78  , SrcList *p, Ex
216e0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
216f0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
21700 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
21710 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
21720 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
21730 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
21740 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  >fg.notIndexed==
21750 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
21760 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
21770 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20  exedBy==0 );.   
21780 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
21790 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20  fg.isTabFunc==0 
217a0 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 31  );.    pItem->u1
217b0 2e 70 46 75 6e 63 41 72 67 20 3d 20 70 4c 69 73  .pFuncArg = pLis
217c0 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  t;.    pItem->fg
217d0 2e 69 73 54 61 62 46 75 6e 63 20 3d 20 31 3b 0a  .isTabFunc = 1;.
217e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
217f0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
21800 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
21810 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  List);.  }.}../*
21820 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e  .** When buildin
21830 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75  g up a FROM clau
21840 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  se in the parser
21850 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  , the join opera
21860 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61  tor.** is initia
21870 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f 20  lly attached to 
21880 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
21890 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65 20  .  But the code 
218a0 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70  generator.** exp
218b0 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ects the join op
218c0 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20  erator to be on 
218d0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
218e0 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
218f0 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a  .** Shifts all j
21900 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72  oin operators fr
21910 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
21920 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46   for an entire F
21930 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a  ROM.** clause..*
21940 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75  *.** Example: Su
21950 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69  ppose the join i
21960 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
21970 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20 6e  **           A n
21980 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69  atural cross joi
21990 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  n B.**.** The op
219a0 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72  erator is "natur
219b0 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20  al cross join". 
219c0 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65   The A and B ope
219d0 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64  rands are stored
219e0 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61  .** in p->a[0] a
219f0 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70  nd p->a[1], resp
21a00 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70  ectively.  The p
21a10 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20  arser initially 
21a20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70  stores the.** op
21a30 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20  erator with A.  
21a40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69  This routine shi
21a50 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f  fts that operato
21a60 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a  r over to B..*/.
21a70 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
21a80 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65  istShiftJoinType
21a90 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20  (SrcList *p){.  
21aa0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
21ab0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d   i;.    for(i=p-
21ac0 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d  >nSrc-1; i>0; i-
21ad0 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69  -){.      p->a[i
21ae0 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  ].fg.jointype = 
21af0 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f 69  p->a[i-1].fg.joi
21b00 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20  ntype;.    }.   
21b10 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69 6e   p->a[0].fg.join
21b20 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  type = 0;.  }.}.
21b30 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
21b40 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20  VDBE code for a 
21b50 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e  BEGIN statement.
21b60 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21b70 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  BeginTransaction
21b80 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
21b90 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c  int type){.  sql
21ba0 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
21bb0 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20   *v;.  int i;.. 
21bc0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
21bd0 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61  =0 );.  db = pPa
21be0 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
21bf0 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
21c00 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
21c10 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
21c20 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
21c30 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b  BEGIN", 0, 0) ){
21c40 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
21c50 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
21c60 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
21c70 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e   if( !v ) return
21c80 3b 0a 20 20 69 66 28 20 74 79 70 65 3d 3d 54 4b  ;.  if( type==TK
21c90 5f 49 4d 4d 45 44 49 41 54 45 20 7c 7c 20 74 79  _IMMEDIATE || ty
21ca0 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45  pe==TK_EXCLUSIVE
21cb0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
21cc0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
21cd0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
21ce0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21cf0 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20  Transaction, i, 
21d00 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53  (type==TK_EXCLUS
21d10 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73  IVE)+1);.      s
21d20 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
21d30 72 65 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d  ree(v, i);.    }
21d40 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
21d50 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41  beAddOp3(v, OP_A
21d60 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c  utoCommit, 0, 0,
21d70 20 28 74 79 70 65 3d 3d 54 4b 5f 43 4f 4e 43 55   (type==TK_CONCU
21d80 52 52 45 4e 54 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  RRENT));.}../*.*
21d90 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
21da0 63 6f 64 65 20 66 6f 72 20 61 20 43 4f 4d 4d 49  code for a COMMI
21db0 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 73 74  T or ROLLBACK st
21dc0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 43 6f 64 65  atement..** Code
21dd0 20 66 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 69 73   for ROLLBACK is
21de0 20 67 65 6e 65 72 61 74 65 64 20 69 66 20 65 54   generated if eT
21df0 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b  ype==TK_ROLLBACK
21e00 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
21e10 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
21e20 64 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54 2e 0a  d for a COMMIT..
21e30 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
21e40 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  ndTransaction(Pa
21e50 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
21e60 20 65 54 79 70 65 29 7b 0a 20 20 56 64 62 65 20   eType){.  Vdbe 
21e70 2a 76 3b 0a 20 20 69 6e 74 20 69 73 52 6f 6c 6c  *v;.  int isRoll
21e80 62 61 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  back;..  assert(
21e90 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
21ea0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
21eb0 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
21ec0 74 28 20 65 54 79 70 65 3d 3d 54 4b 5f 43 4f 4d  t( eType==TK_COM
21ed0 4d 49 54 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b  MIT || eType==TK
21ee0 5f 45 4e 44 20 7c 7c 20 65 54 79 70 65 3d 3d 54  _END || eType==T
21ef0 4b 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  K_ROLLBACK );.  
21f00 69 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 65 54 79  isRollback = eTy
21f10 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 3b  pe==TK_ROLLBACK;
21f20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
21f30 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
21f40 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
21f50 4f 4e 2c 20 0a 20 20 20 20 20 20 20 69 73 52 6f  ON, .       isRo
21f60 6c 6c 62 61 63 6b 20 3f 20 22 52 4f 4c 4c 42 41  llback ? "ROLLBA
21f70 43 4b 22 20 3a 20 22 43 4f 4d 4d 49 54 22 2c 20  CK" : "COMMIT", 
21f80 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74  0, 0) ){.    ret
21f90 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73  urn;.  }.  v = s
21fa0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
21fb0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
21fc0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
21fd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75  eAddOp2(v, OP_Au
21fe0 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 69 73 52  toCommit, 1, isR
21ff0 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d 0a 7d 0a  ollback);.  }.}.
22000 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
22010 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
22020 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 65  y the parser whe
22030 6e 20 69 74 20 70 61 72 73 65 73 20 61 20 63 6f  n it parses a co
22040 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61 74 65 2c  mmand to create,
22050 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72 20 72  .** release or r
22060 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c 20 73  ollback an SQL s
22070 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f  avepoint. .*/.vo
22080 69 64 20 73 71 6c 69 74 65 33 53 61 76 65 70 6f  id sqlite3Savepo
22090 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  int(Parse *pPars
220a0 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e  e, int op, Token
220b0 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72   *pName){.  char
220c0 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65   *zName = sqlite
220d0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
220e0 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
220f0 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  );.  if( zName )
22100 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
22110 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
22120 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20  Parse);.#ifndef 
22130 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
22140 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74  ORIZATION.    st
22150 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
22160 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b  * const az[] = {
22170 20 22 42 45 47 49 4e 22 2c 20 22 52 45 4c 45 41   "BEGIN", "RELEA
22180 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20  SE", "ROLLBACK" 
22190 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  };.    assert( !
221a0 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20  SAVEPOINT_BEGIN 
221b0 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  && SAVEPOINT_REL
221c0 45 41 53 45 3d 3d 31 20 26 26 20 53 41 56 45 50  EASE==1 && SAVEP
221d0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32  OINT_ROLLBACK==2
221e0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69   );.#endif.    i
221f0 66 28 20 21 76 20 7c 7c 20 73 71 6c 69 74 65 33  f( !v || sqlite3
22200 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
22210 2c 20 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49  , SQLITE_SAVEPOI
22220 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d  NT, az[op], zNam
22230 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73  e, 0) ){.      s
22240 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
22250 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b  rse->db, zName);
22260 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
22270 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
22280 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
22290 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20  _Savepoint, op, 
222a0 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f  0, 0, zName, P4_
222b0 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
222c0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
222d0 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
222e0 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61  se is open and a
222f0 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
22300 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
22310 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
22320 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20 65 72  s.  Leave any er
22330 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20  ror messages in 
22340 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
22350 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ture..*/.int sql
22360 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61  ite3OpenTempData
22370 62 61 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  base(Parse *pPar
22380 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se){.  sqlite3 *
22390 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
223a0 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31  .  if( db->aDb[1
223b0 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61  ].pBt==0 && !pPa
223c0 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
223d0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
223e0 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 20 20  Btree *pBt;.    
223f0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74  static const int
22400 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20 20 20   flags = .      
22410 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
22420 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20 20 20  READWRITE |.    
22430 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
22440 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
22450 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
22460 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20  _EXCLUSIVE |.   
22470 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
22480 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
22490 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
224a0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
224b0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
224c0 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d  te3BtreeOpen(db-
224d0 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20 26 70  >pVfs, 0, db, &p
224e0 42 74 2c 20 30 2c 20 66 6c 61 67 73 29 3b 0a 20  Bt, 0, flags);. 
224f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
22500 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
22510 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
22520 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
22530 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
22540 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20  y database ".   
22550 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73       "file for s
22560 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79  toring temporary
22570 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20   tables");.     
22580 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63   pParse->rc = rc
22590 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
225a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
225b0 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70 42 74  aDb[1].pBt = pBt
225c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
225d0 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
225e0 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   );.    if( SQLI
225f0 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65  TE_NOMEM==sqlite
22600 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
22610 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50  e(pBt, db->nextP
22620 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30 29 20  agesize, -1, 0) 
22630 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
22640 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
22650 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
22660 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
22670 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63   0;.}../*.** Rec
22680 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
22690 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  t the schema coo
226a0 6b 69 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  kie will need to
226b0 20 62 65 20 76 65 72 69 66 69 65 64 0a 2a 2a 20   be verified.** 
226c0 66 6f 72 20 64 61 74 61 62 61 73 65 20 69 44 62  for database iDb
226d0 2e 20 20 54 68 65 20 63 6f 64 65 20 74 6f 20 61  .  The code to a
226e0 63 74 75 61 6c 6c 79 20 76 65 72 69 66 79 20 74  ctually verify t
226f0 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
22700 0a 2a 2a 20 77 69 6c 6c 20 6f 63 63 75 72 20 61  .** will occur a
22710 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
22720 20 74 6f 70 2d 6c 65 76 65 6c 20 56 44 42 45 20   top-level VDBE 
22730 61 6e 64 20 77 69 6c 6c 20 62 65 20 67 65 6e 65  and will be gene
22740 72 61 74 65 64 0a 2a 2a 20 6c 61 74 65 72 2c 20  rated.** later, 
22750 62 79 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  by sqlite3Finish
22760 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69  Coding()..*/.voi
22770 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  d sqlite3CodeVer
22780 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20  ifySchema(Parse 
22790 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
227a0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
227b0 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
227c0 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
227d0 72 73 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  rse);..  assert(
227e0 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 70   iDb>=0 && iDb<p
227f0 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29  Parse->db->nDb )
22800 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
22810 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
22820 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d  .pBt!=0 || iDb==
22830 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  1 );.  assert( i
22840 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  Db<SQLITE_MAX_AT
22850 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 61 73  TACHED+2 );.  as
22860 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
22870 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 70 50 61  emaMutexHeld(pPa
22880 72 73 65 2d 3e 64 62 2c 20 69 44 62 2c 20 30 29  rse->db, iDb, 0)
22890 20 29 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b   );.  if( DbMask
228a0 54 65 73 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Test(pToplevel->
228b0 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29  cookieMask, iDb)
228c0 3d 3d 30 20 29 7b 0a 20 20 20 20 44 62 4d 61 73  ==0 ){.    DbMas
228d0 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  kSet(pToplevel->
228e0 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29  cookieMask, iDb)
228f0 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  ;.    if( !OMIT_
22900 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
22910 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22920 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
22930 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20  e(pToplevel);.  
22940 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
22950 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 44 62   If argument zDb
22960 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63   is NULL, then c
22970 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64 65 56  all sqlite3CodeV
22980 65 72 69 66 79 53 63 68 65 6d 61 28 29 20 66 6f  erifySchema() fo
22990 72 20 65 61 63 68 20 0a 2a 2a 20 61 74 74 61 63  r each .** attac
229a0 68 65 64 20 64 61 74 61 62 61 73 65 2e 20 4f 74  hed database. Ot
229b0 68 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20  herwise, invoke 
229c0 69 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  it for the datab
229d0 61 73 65 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e  ase named zDb on
229e0 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
229f0 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d  te3CodeVerifyNam
22a00 65 64 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a  edSchema(Parse *
22a10 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
22a20 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69  ar *zDb){.  sqli
22a30 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
22a40 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
22a50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
22a60 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  nDb; i++){.    D
22a70 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
22a80 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
22a90 62 2d 3e 70 42 74 20 26 26 20 28 21 7a 44 62 20  b->pBt && (!zDb 
22aa0 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  || 0==sqlite3Str
22ab0 49 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a  ICmp(zDb, pDb->z
22ac0 44 62 53 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20  DbSName)) ){.   
22ad0 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
22ae0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
22af0 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, i);.    }.  }
22b00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
22b10 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
22b20 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64  t prepares for d
22b30 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  oing an operatio
22b40 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  n that.** might 
22b50 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62  change the datab
22b60 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
22b70 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61  routine starts a
22b80 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
22b90 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61   if we are not a
22ba0 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a  lready within.**
22bb0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
22bc0 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   If we are alrea
22bd0 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  dy within a tran
22be0 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20  saction, then a 
22bf0 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73  checkpoint.** is
22c00 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53   set if the setS
22c10 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74  tatement paramet
22c20 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63  er is true.  A c
22c30 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
22c40 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f  .** be set for o
22c50 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d  perations that m
22c60 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74  ight fail (due t
22c70 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  o a constraint) 
22c80 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77  part of.** the w
22c90 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77  ay through and w
22ca0 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74  hich will need t
22cb0 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74  o undo some writ
22cc0 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  es without havin
22cd0 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  g to.** rollback
22ce0 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
22cf0 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65  action.  For ope
22d00 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c  rations where al
22d10 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  l constraints.**
22d20 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20   can be checked 
22d30 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
22d40 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74  es are made to t
22d50 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
22d60 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65  is never.** nece
22d70 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20  ssary to undo a 
22d80 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68  write and the ch
22d90 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  eckpoint should 
22da0 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76  not be set..*/.v
22db0 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
22dc0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50  WriteOperation(P
22dd0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
22de0 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20  t setStatement, 
22df0 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73  int iDb){.  Pars
22e00 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
22e10 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
22e20 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73  vel(pParse);.  s
22e30 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
22e40 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
22e50 44 62 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74  Db);.  DbMaskSet
22e60 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74  (pToplevel->writ
22e70 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70  eMask, iDb);.  p
22e80 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74  Toplevel->isMult
22e90 69 57 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61  iWrite |= setSta
22ea0 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tement;.}../*.**
22eb0 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   Indicate that t
22ec0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72  he statement cur
22ed0 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
22ee0 73 74 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20  struction might 
22ef0 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68  write.** more th
22f00 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78  an one entry (ex
22f10 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20  ample: deleting 
22f20 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73  one row then ins
22f30 65 72 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a  erting another,.
22f40 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c  ** inserting mul
22f50 74 69 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20  tiple rows in a 
22f60 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74  table, or insert
22f70 69 6e 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e  ing a row and in
22f80 64 65 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a  dex entries.).**
22f90 20 49 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63   If an abort occ
22fa0 75 72 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f  urs after some o
22fb0 66 20 74 68 65 73 65 20 77 72 69 74 65 73 20 68  f these writes h
22fc0 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74  ave completed, t
22fd0 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62  hen it will.** b
22fe0 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75  e necessary to u
22ff0 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ndo the complete
23000 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69  d writes..*/.voi
23010 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72  d sqlite3MultiWr
23020 69 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ite(Parse *pPars
23030 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  e){.  Parse *pTo
23040 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
23050 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
23060 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76  arse);.  pToplev
23070 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  el->isMultiWrite
23080 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20   = 1;.}../* .** 
23090 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
230a0 6f 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  or calls this ro
230b0 75 74 69 6e 65 20 69 66 20 69 73 20 64 69 73 63  utine if is disc
230c0 6f 76 65 72 73 20 74 68 61 74 20 69 74 20 69 73  overs that it is
230d0 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  .** possible to 
230e0 61 62 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e  abort a statemen
230f0 74 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c  t prior to compl
23100 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72  etion.  In order
23110 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20   to .** perform 
23120 74 68 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f  this abort witho
23130 75 74 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68  ut corrupting th
23140 65 20 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e  e database, we n
23150 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73  eed to make.** s
23160 75 72 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ure that the sta
23170 74 65 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63  tement is protec
23180 74 65 64 20 62 79 20 61 20 73 74 61 74 65 6d 65  ted by a stateme
23190 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
231a0 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c  **.** Technicall
231b0 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  y, we only need 
231c0 74 6f 20 73 65 74 20 74 68 65 20 6d 61 79 41 62  to set the mayAb
231d0 6f 72 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a  ort flag if the.
231e0 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20  ** isMultiWrite 
231f0 66 6c 61 67 20 77 61 73 20 70 72 65 76 69 6f 75  flag was previou
23200 73 6c 79 20 73 65 74 2e 20 20 54 68 65 72 65 20  sly set.  There 
23210 69 73 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64  is a time depend
23220 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61  ency.** such tha
23230 74 20 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74  t the abort must
23240 20 6f 63 63 75 72 20 61 66 74 65 72 20 74 68 65   occur after the
23250 20 6d 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68   multiwrite.  Th
23260 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65  is makes.** some
23270 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f   statements invo
23280 6c 76 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43  lving the REPLAC
23290 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  E conflict resol
232a0 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a  ution algorithm.
232b0 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66  ** go a little f
232c0 61 73 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69  aster.  But taki
232d0 6e 67 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  ng advantage of 
232e0 74 68 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64  this time depend
232f0 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74  ency.** makes it
23300 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20   more difficult 
23310 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20 74 68  to prove that th
23320 65 20 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63  e code is correc
23330 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63  t (in .** partic
23340 75 6c 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74  ular, it prevent
23350 73 20 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  s us from writin
23360 67 20 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a  g an effective.*
23370 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
23380 20 6f 66 20 73 71 6c 69 74 65 33 41 73 73 65 72   of sqlite3Asser
23390 74 4d 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64  tMayAbort()) and
233a0 20 73 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73   so we have chos
233b0 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68  en.** to take th
233c0 65 20 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64  e safe route and
233d0 20 73 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69   skip the optimi
233e0 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  zation..*/.void 
233f0 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
23400 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
23410 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
23420 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
23430 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
23440 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
23450 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a  mayAbort = 1;.}.
23460 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
23470 50 5f 48 61 6c 74 20 74 68 61 74 20 63 61 75 73  P_Halt that caus
23480 65 73 20 74 68 65 20 76 64 62 65 20 74 6f 20 72  es the vdbe to r
23490 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
234a0 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72  CONSTRAINT.** er
234b0 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72  ror. The onError
234c0 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72   parameter deter
234d0 6d 69 6e 65 73 20 77 68 69 63 68 20 28 69 66 20  mines which (if 
234e0 61 6e 79 29 20 6f 66 20 74 68 65 20 73 74 61 74  any) of the stat
234f0 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20  ement.** and/or 
23500 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
23510 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
23520 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ck..*/.void sqli
23530 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
23540 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
23550 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
23560 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
23570 6e 74 20 65 72 72 43 6f 64 65 2c 20 20 20 20 20  nt errCode,     
23580 20 2f 2a 20 65 78 74 65 6e 64 65 64 20 65 72 72   /* extended err
23590 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  or code */.  int
235a0 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
235b0 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70  * Constraint typ
235c0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c  e */.  char *p4,
235d0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
235e0 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69  r message */.  i
235f0 38 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20  8 p4type,       
23600 20 2f 2a 20 50 34 5f 53 54 41 54 49 43 20 6f 72   /* P4_STATIC or
23610 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f   P4_TRANSIENT */
23620 0a 20 20 75 38 20 70 35 45 72 72 6d 73 67 20 20  .  u8 p5Errmsg  
23630 20 20 20 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73       /* P5_ErrMs
23640 67 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56  g type */.){.  V
23650 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
23660 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
23670 0a 20 20 61 73 73 65 72 74 28 20 28 65 72 72 43  .  assert( (errC
23680 6f 64 65 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  ode&0xff)==SQLIT
23690 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a  E_CONSTRAINT );.
236a0 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
236b0 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73  E_Abort ){.    s
236c0 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
236d0 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Parse);.  }.  sq
236e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
236f0 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43  v, OP_Halt, errC
23700 6f 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ode, onError, 0,
23710 20 70 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20   p4, p4type);.  
23720 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
23730 65 50 35 28 76 2c 20 70 35 45 72 72 6d 73 67 29  eP5(v, p5Errmsg)
23740 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ;.}../*.** Code 
23750 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74  an OP_Halt due t
23760 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d  o UNIQUE or PRIM
23770 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
23780 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f  nt violation..*/
23790 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69  .void sqlite3Uni
237a0 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  queConstraint(. 
237b0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
237c0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
237d0 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
237e0 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
237f0 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20  Constraint type 
23800 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
23810 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
23820 64 65 78 20 74 68 61 74 20 74 72 69 67 67 65 72  dex that trigger
23830 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  s the constraint
23840 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
23850 45 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  Err;.  int j;.  
23860 53 74 72 41 63 63 75 6d 20 65 72 72 4d 73 67 3b  StrAccum errMsg;
23870 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
23880 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a   pIdx->pTable;..
23890 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
238a0 6d 49 6e 69 74 28 26 65 72 72 4d 73 67 2c 20 70  mInit(&errMsg, p
238b0 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20 30 2c  Parse->db, 0, 0,
238c0 20 32 30 30 29 3b 0a 20 20 69 66 28 20 70 49 64   200);.  if( pId
238d0 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20  x->aColExpr ){. 
238e0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
238f0 70 70 65 6e 64 66 28 26 65 72 72 4d 73 67 2c 20  ppendf(&errMsg, 
23900 22 69 6e 64 65 78 20 27 25 71 27 22 2c 20 70 49  "index '%q'", pI
23910 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  dx->zName);.  }e
23920 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  lse{.    for(j=0
23930 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; j<pIdx->nKeyCo
23940 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; j++){.      c
23950 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20  har *zCol;.     
23960 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
23970 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b  iColumn[j]>=0 );
23980 0a 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54  .      zCol = pT
23990 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61  ab->aCol[pIdx->a
239a0 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d  iColumn[j]].zNam
239b0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 20 29  e;.      if( j )
239c0 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
239d0 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2c 20  end(&errMsg, ", 
239e0 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", 2);.      sql
239f0 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61  ite3_str_appenda
23a00 6c 6c 28 26 65 72 72 4d 73 67 2c 20 70 54 61 62  ll(&errMsg, pTab
23a10 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
23a20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
23a30 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2e 22 2c  nd(&errMsg, ".",
23a40 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
23a50 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c  e3_str_appendall
23a60 28 26 65 72 72 4d 73 67 2c 20 7a 43 6f 6c 29 3b  (&errMsg, zCol);
23a70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 45 72  .    }.  }.  zEr
23a80 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63  r = sqlite3StrAc
23a90 63 75 6d 46 69 6e 69 73 68 28 26 65 72 72 4d 73  cumFinish(&errMs
23aa0 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 6c  g);.  sqlite3Hal
23ab0 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
23ac0 73 65 2c 20 0a 20 20 20 20 49 73 50 72 69 6d 61  se, .    IsPrima
23ad0 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
23ae0 20 3f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   ? SQLITE_CONSTR
23af0 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 20  AINT_PRIMARYKEY 
23b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23b10 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 53               : S
23b20 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
23b30 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45  _UNIQUE,.    onE
23b40 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44  rror, zErr, P4_D
23b50 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74  YNAMIC, P5_Const
23b60 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a  raintUnique);.}.
23b70 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
23b80 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 6e  OP_Halt due to n
23b90 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 2e  on-unique rowid.
23ba0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23bb0 52 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28  RowidConstraint(
23bc0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
23bd0 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
23be0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
23bf0 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
23c00 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
23c10 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20  ution algorithm 
23c20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
23c30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
23c40 62 6c 65 20 77 69 74 68 20 74 68 65 20 6e 6f 6e  ble with the non
23c50 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 20 2a 2f  -unique rowid */
23c60 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73   .){.  char *zMs
23c70 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  g;.  int rc;.  i
23c80 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d  f( pTab->iPKey>=
23c90 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20  0 ){.    zMsg = 
23ca0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
23cb0 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25  Parse->db, "%s.%
23cc0 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  s", pTab->zName,
23cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23ce0 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
23cf0 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65  >aCol[pTab->iPKe
23d00 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  y].zName);.    r
23d10 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
23d20 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59  RAINT_PRIMARYKEY
23d30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
23d40 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
23d50 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
23d60 20 22 25 73 2e 72 6f 77 69 64 22 2c 20 70 54 61   "%s.rowid", pTa
23d70 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  b->zName);.    r
23d80 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
23d90 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d  RAINT_ROWID;.  }
23da0 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f  .  sqlite3HaltCo
23db0 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
23dc0 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d   rc, onError, zM
23dd0 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a  sg, P4_DYNAMIC,.
23de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23df0 20 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73 74          P5_Const
23e00 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a  raintUnique);.}.
23e10 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
23e20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73  see if pIndex us
23e30 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  es the collating
23e40 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
23e50 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
23e60 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
23e70 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73  false if it does
23e80 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   not..*/.#ifndef
23e90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
23ea0 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20  NDEX.static int 
23eb0 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63  collationMatch(c
23ec0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
23ed0 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29  , Index *pIndex)
23ee0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
23ef0 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b  ert( zColl!=0 );
23f00 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
23f10 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  ndex->nColumn; i
23f20 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
23f30 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d  har *z = pIndex-
23f40 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
23f50 61 73 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20  assert( z!=0 || 
23f60 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
23f70 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66 28  [i]<0 );.    if(
23f80 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
23f90 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71  n[i]>=0 && 0==sq
23fa0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
23fb0 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  zColl) ){.      
23fc0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
23fd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
23fe0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
23ff0 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
24000 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68  dices of pTab th
24010 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61  at use the colla
24020 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
24030 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c  oll..** If pColl
24040 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
24050 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
24060 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64  f pTab..*/.#ifnd
24070 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
24080 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f  EINDEX.static vo
24090 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28  id reindexTable(
240a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
240b0 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72  able *pTab, char
240c0 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a   const *zColl){.
240d0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
240e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
240f0 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
24100 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
24110 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d  /..  for(pIndex=
24120 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
24130 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e  ndex; pIndex=pIn
24140 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  dex->pNext){.   
24150 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c   if( zColl==0 ||
24160 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
24170 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29  zColl, pIndex) )
24180 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20  {.      int iDb 
24190 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
241a0 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
241b0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
241c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
241d0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
241e0 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
241f0 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
24200 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
24210 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
24220 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
24230 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
24240 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
24250 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  es of all tables
24260 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
24270 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69  s where the.** i
24280 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63  ndices use the c
24290 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
242a0 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f  e pColl.  If pCo
242b0 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d  ll==0 then recom
242c0 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69  pute.** all indi
242d0 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a  ces everywhere..
242e0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
242f0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
24300 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64  tatic void reind
24310 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72 73  exDatabases(Pars
24320 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20  e *pParse, char 
24330 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20  const *zColl){. 
24340 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
24350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24360 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  A single databas
24370 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
24380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24390 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
243a0 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
243b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
243c0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
243d0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
243e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
243f0 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20   HashElem *k;   
24400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24410 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
24420 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a   tables in pDb *
24430 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
24440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24450 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
24460 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20  e database */.. 
24470 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
24480 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
24490 65 78 65 73 28 64 62 29 20 29 3b 20 20 2f 2a 20  exes(db) );  /* 
244a0 4e 65 65 64 65 64 20 66 6f 72 20 73 63 68 65 6d  Needed for schem
244b0 61 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f  a access */.  fo
244c0 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d  r(iDb=0, pDb=db-
244d0 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  >aDb; iDb<db->nD
244e0 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29  b; iDb++, pDb++)
244f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44  {.    assert( pD
24500 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  b!=0 );.    for(
24510 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  k=sqliteHashFirs
24520 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t(&pDb->pSchema-
24530 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b  >tblHash);  k; k
24540 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
24550 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  k)){.      pTab 
24560 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65  = (Table*)sqlite
24570 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20  HashData(k);.   
24580 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
24590 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43  pParse, pTab, zC
245a0 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  oll);.    }.  }.
245b0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
245c0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
245d0 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f  r the REINDEX co
245e0 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  mmand..**.**    
245f0 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20      REINDEX     
24600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24610 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20         -- 1.**  
24620 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c        REINDEX  <
24630 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20  collation>      
24640 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a           -- 2.**
24650 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
24660 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74   ?<database>.?<t
24670 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a  ablename>  -- 3.
24680 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
24690 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
246a0 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20  <indexname>  -- 
246b0 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63  4.**.** Form 1 c
246c0 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65  auses all indice
246d0 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65  s in all attache
246e0 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62  d databases to b
246f0 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f  e rebuilt..** Fo
24700 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c  rm 2 rebuilds al
24710 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
24720 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
24730 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a  use the named.**
24740 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
24750 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e  ion.  Forms 3 an
24760 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20  d 4 rebuild the 
24770 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61  named index or a
24780 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73  ll.** indices as
24790 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
247a0 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a  e named table..*
247b0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
247c0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f  _OMIT_REINDEX.vo
247d0 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65  id sqlite3Reinde
247e0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
247f0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
24800 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a  Token *pName2){.
24810 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
24820 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24830 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
24840 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65  nce to be reinde
24850 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  xed, or NULL */.
24860 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
24870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24880 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65   Name of a table
24890 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63   or index */.  c
248a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20  onst char *zDb; 
248b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
248c0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
248d0 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  se */.  Table *p
248e0 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
248f0 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
24900 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
24910 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
24920 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
24930 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f  /* An index asso
24940 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62  ciated with pTab
24950 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
24960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24970 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
24980 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
24990 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
249a0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
249b0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
249c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
249d0 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b  Token *pObjName;
249e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
249f0 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
24a00 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20   or index to be 
24a10 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20  reindexed */..  
24a20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
24a30 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
24a40 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
24a50 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
24a60 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
24a70 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
24a80 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
24a90 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
24aa0 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
24ab0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
24ac0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
24ad0 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d  }..  if( pName1=
24ae0 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  =0 ){.    reinde
24af0 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
24b00 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  e, 0);.    retur
24b10 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e  n;.  }else if( N
24b20 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20  EVER(pName2==0) 
24b30 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20  || pName2->z==0 
24b40 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  ){.    char *zCo
24b50 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ll;.    assert( 
24b60 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20  pName1->z );.   
24b70 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
24b80 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
24b90 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31  arse->db, pName1
24ba0 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c  );.    if( !zCol
24bb0 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  l ) return;.    
24bc0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
24bd0 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
24be0 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30  NC(db), zColl, 0
24bf0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
24c00 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65   ){.      reinde
24c10 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
24c20 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  e, zColl);.     
24c30 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
24c40 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  b, zColl);.     
24c50 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
24c60 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
24c70 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, zColl);.  }
24c80 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
24c90 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
24ca0 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
24cb0 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a  e2, &pObjName);.
24cc0 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
24cd0 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  turn;.  z = sqli
24ce0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
24cf0 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a  (db, pObjName);.
24d00 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
24d10 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d  urn;.  zDb = db-
24d20 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
24d30 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  me;.  pTab = sql
24d40 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
24d50 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28  , z, zDb);.  if(
24d60 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69   pTab ){.    rei
24d70 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
24d80 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , pTab, 0);.    
24d90 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
24da0 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , z);.    return
24db0 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
24dc0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
24dd0 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  x(db, z, zDb);. 
24de0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
24df0 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e  b, z);.  if( pIn
24e00 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dex ){.    sqlit
24e10 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
24e20 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
24e30 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
24e40 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
24e50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
24e60 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
24e70 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f   }.  sqlite3Erro
24e80 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
24e90 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79  able to identify
24ea0 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62   the object to b
24eb0 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d  e reindexed");.}
24ec0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
24ed0 65 74 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20  eturn a KeyInfo 
24ee0 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69  structure that i
24ef0 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
24f00 72 20 74 68 65 20 67 69 76 65 6e 20 49 6e 64 65  r the given Inde
24f10 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  x..**.** The cal
24f20 6c 65 72 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b  ler should invok
24f30 65 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  e sqlite3KeyInfo
24f40 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 72  Unref() on the r
24f50 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 0a 2a  eturned object.*
24f60 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 66 69  * when it has fi
24f70 6e 69 73 68 65 64 20 75 73 69 6e 67 20 69 74 2e  nished using it.
24f80 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c  .*/.KeyInfo *sql
24f90 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
24fa0 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
24fb0 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
24fc0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
24fd0 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c  Col = pIdx->nCol
24fe0 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20  umn;.  int nKey 
24ff0 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  = pIdx->nKeyCol;
25000 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
25010 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
25020 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b  nErr ) return 0;
25030 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 75 6e 69  .  if( pIdx->uni
25040 71 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  qNotNull ){.    
25050 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65  pKey = sqlite3Ke
25060 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73  yInfoAlloc(pPars
25070 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f  e->db, nKey, nCo
25080 6c 2d 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65  l-nKey);.  }else
25090 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  {.    pKey = sql
250a0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
250b0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 43 6f  (pParse->db, nCo
250c0 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  l, 0);.  }.  if(
250d0 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73   pKey ){.    ass
250e0 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
250f0 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
25100 4b 65 79 29 20 29 3b 0a 20 20 20 20 66 6f 72 28  Key) );.    for(
25110 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
25120 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
25130 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64  har *zColl = pId
25140 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  x->azColl[i];.  
25150 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b      pKey->aColl[
25160 69 5d 20 3d 20 7a 43 6f 6c 6c 3d 3d 73 71 6c 69  i] = zColl==sqli
25170 74 65 33 53 74 72 42 49 4e 41 52 59 20 3f 20 30  te3StrBINARY ? 0
25180 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   :.             
25190 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
251a0 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
251b0 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a  pParse, zColl);.
251c0 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72        pKey->aSor
251d0 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64 78  tOrder[i] = pIdx
251e0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b  ->aSortOrder[i];
251f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
25200 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
25210 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
25220 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  rse->rc==SQLITE_
25230 45 52 52 4f 52 5f 4d 49 53 53 49 4e 47 5f 43 4f  ERROR_MISSING_CO
25240 4c 4c 53 45 51 20 29 3b 0a 20 20 20 20 20 20 69  LLSEQ );.      i
25250 66 28 20 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72  f( pIdx->bNoQuer
25260 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
25270 2f 2a 20 44 65 61 63 74 69 76 61 74 65 20 74 68  /* Deactivate th
25280 65 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  e index because 
25290 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 75  it contains an u
252a0 6e 6b 6e 6f 77 6e 20 63 6f 6c 6c 61 74 69 6e 67  nknown collating
252b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 71 75  .        ** sequ
252c0 65 6e 63 65 2e 20 20 54 68 65 20 6f 6e 6c 79 20  ence.  The only 
252d0 77 61 79 20 74 6f 20 72 65 61 63 74 69 76 65 20  way to reactive 
252e0 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 6f 20  the index is to 
252f0 72 65 6c 6f 61 64 20 74 68 65 0a 20 20 20 20 20  reload the.     
25300 20 20 20 2a 2a 20 73 63 68 65 6d 61 2e 20 20 41     ** schema.  A
25310 64 64 69 6e 67 20 74 68 65 20 6d 69 73 73 69 6e  dding the missin
25320 67 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  g collating sequ
25330 65 6e 63 65 20 6c 61 74 65 72 20 64 6f 65 73 20  ence later does 
25340 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  not.        ** r
25350 65 61 63 74 69 76 65 20 74 68 65 20 69 6e 64 65  eactive the inde
25360 78 2e 20 20 54 68 65 20 61 70 70 6c 69 63 61 74  x.  The applicat
25370 69 6f 6e 20 68 61 64 20 74 68 65 20 63 68 61 6e  ion had the chan
25380 63 65 20 74 6f 20 72 65 67 69 73 74 65 72 0a 20  ce to register. 
25390 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 69         ** the mi
253a0 73 73 69 6e 67 20 69 6e 64 65 78 20 75 73 69 6e  ssing index usin
253b0 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d  g the collation-
253c0 6e 65 65 64 65 64 20 63 61 6c 6c 62 61 63 6b 2e  needed callback.
253d0 20 20 46 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a    For.        **
253e0 20 73 69 6d 70 6c 69 63 69 74 79 2c 20 53 51 4c   simplicity, SQL
253f0 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 67 69 76  ite will not giv
25400 65 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  e the applicatio
25410 6e 20 61 20 73 65 63 6f 6e 64 20 63 68 61 6e 63  n a second chanc
25420 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
25430 20 20 20 20 20 20 70 49 64 78 2d 3e 62 4e 6f 51        pIdx->bNoQ
25440 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  uery = 1;.      
25450 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
25460 51 4c 49 54 45 5f 45 52 52 4f 52 5f 52 45 54 52  QLITE_ERROR_RETR
25470 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  Y;.      }.     
25480 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
25490 6e 72 65 66 28 70 4b 65 79 29 3b 0a 20 20 20 20  nref(pKey);.    
254a0 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20    pKey = 0;.    
254b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
254c0 4b 65 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Key;.}..#ifndef 
254d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
254e0 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  /* .** This rout
254f0 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  ine is invoked o
25500 6e 63 65 20 70 65 72 20 43 54 45 20 62 79 20 74  nce per CTE by t
25510 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
25520 70 61 72 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49  parsing a .** WI
25530 54 48 20 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57  TH clause. .*/.W
25540 69 74 68 20 2a 73 71 6c 69 74 65 33 57 69 74 68  ith *sqlite3With
25550 41 64 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Add(.  Parse *pP
25560 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
25570 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
25580 74 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69  t */.  With *pWi
25590 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  th,            /
255a0 2a 20 45 78 69 73 74 69 6e 67 20 57 49 54 48 20  * Existing WITH 
255b0 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20  clause, or NULL 
255c0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
255d0 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
255e0 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d  Name of the comm
255f0 6f 6e 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  on-table */.  Ex
25600 70 72 4c 69 73 74 20 2a 70 41 72 67 6c 69 73 74  prList *pArglist
25610 2c 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61  ,     /* Optiona
25620 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69  l column name li
25630 73 74 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  st for the table
25640 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 51   */.  Select *pQ
25650 75 65 72 79 20 20 20 20 20 20 20 20 20 20 2f 2a  uery          /*
25660 20 51 75 65 72 79 20 75 73 65 64 20 74 6f 20 69   Query used to i
25670 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61  nitialize the ta
25680 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ble */.){.  sqli
25690 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
256a0 2d 3e 64 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e  ->db;.  With *pN
256b0 65 77 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ew;.  char *zNam
256c0 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  e;..  /* Check t
256d0 68 61 74 20 74 68 65 20 43 54 45 20 6e 61 6d 65  hat the CTE name
256e0 20 69 73 20 75 6e 69 71 75 65 20 77 69 74 68 69   is unique withi
256f0 6e 20 74 68 69 73 20 57 49 54 48 20 63 6c 61 75  n this WITH clau
25700 73 65 2e 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c  se. If.  ** not,
25710 20 73 74 6f 72 65 20 61 6e 20 65 72 72 6f 72 20   store an error 
25720 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72  in the Parse str
25730 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61  ucture. */.  zNa
25740 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
25750 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
25760 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  ->db, pName);.  
25770 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 70 57 69  if( zName && pWi
25780 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  th ){.    int i;
25790 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
257a0 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b  pWith->nCte; i++
257b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
257c0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d  ite3StrICmp(zNam
257d0 65 2c 20 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a  e, pWith->a[i].z
257e0 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
257f0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
25800 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70  Msg(pParse, "dup
25810 6c 69 63 61 74 65 20 57 49 54 48 20 74 61 62 6c  licate WITH tabl
25820 65 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61  e name: %s", zNa
25830 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
25840 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 57   }.  }..  if( pW
25850 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ith ){.    int n
25860 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
25870 57 69 74 68 29 20 2b 20 28 73 69 7a 65 6f 66 28  With) + (sizeof(
25880 70 57 69 74 68 2d 3e 61 5b 31 5d 29 20 2a 20 70  pWith->a[1]) * p
25890 57 69 74 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20  With->nCte);.   
258a0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
258b0 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69  bRealloc(db, pWi
258c0 74 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  th, nByte);.  }e
258d0 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  lse{.    pNew = 
258e0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
258f0 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
25900 70 57 69 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61  pWith));.  }.  a
25910 73 73 65 72 74 28 20 28 70 4e 65 77 21 3d 30 20  ssert( (pNew!=0 
25920 26 26 20 7a 4e 61 6d 65 21 3d 30 29 20 7c 7c 20  && zName!=0) || 
25930 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
25940 20 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d   );..  if( db->m
25950 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
25960 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
25970 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 41 72  stDelete(db, pAr
25980 67 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  glist);.    sqli
25990 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
259a0 64 62 2c 20 70 51 75 65 72 79 29 3b 0a 20 20 20  db, pQuery);.   
259b0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
259c0 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  b, zName);.    p
259d0 4e 65 77 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d  New = pWith;.  }
259e0 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
259f0 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53  a[pNew->nCte].pS
25a00 65 6c 65 63 74 20 3d 20 70 51 75 65 72 79 3b 0a  elect = pQuery;.
25a10 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
25a20 2d 3e 6e 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20  ->nCte].pCols = 
25a30 70 41 72 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e  pArglist;.    pN
25a40 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65  ew->a[pNew->nCte
25a50 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ].zName = zName;
25a60 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65  .    pNew->a[pNe
25a70 77 2d 3e 6e 43 74 65 5d 2e 7a 43 74 65 45 72 72  w->nCte].zCteErr
25a80 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
25a90 6e 43 74 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72  nCte++;.  }..  r
25aa0 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
25ab0 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 63 6f  *.** Free the co
25ac0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 57 69  ntents of the Wi
25ad0 74 68 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  th object passed
25ae0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
25af0 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  rgument..*/.void
25b00 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65   sqlite3WithDele
25b10 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
25b20 57 69 74 68 20 2a 70 57 69 74 68 29 7b 0a 20 20  With *pWith){.  
25b30 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20  if( pWith ){.   
25b40 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
25b50 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43  i=0; i<pWith->nC
25b60 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
25b70 73 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65  struct Cte *pCte
25b80 20 3d 20 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b   = &pWith->a[i];
25b90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
25ba0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
25bb0 20 70 43 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20   pCte->pCols);. 
25bc0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
25bd0 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74  ctDelete(db, pCt
25be0 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  e->pSelect);.   
25bf0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
25c00 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  (db, pCte->zName
25c10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
25c20 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
25c30 57 69 74 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  With);.  }.}.#en
25c40 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
25c50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 29  SQLITE_OMIT_CTE)
25c60 20 2a 2f 0a                                       */.